DES AES 11 DES AES 14 electronic codebook
DES, AES 11 DES AES
블록암호의 운영모드 14 전자 코드북(electronic codebook, ECB) 모드 암호 블록 체인 (cipher-block chaining, CBC) 모드 암호 피드백(cipher feedback, CFB) 모드 출력 피드백(output feedback, OFB) 모드 카운터(Counter, CTR) 모드
비밀키의 생성 23 Key. Generator(javax. crypto. Key. Generator) 클래스 이용 � � � 객체 생성: Key. Generator kg = Key. Generator. get. Instance("AES"); 키생성 방법 지정: key. Generator. init(128); 키 생성: Secret. Key key = key. Generator. generate. Key(); Key. Generator key. Generator = Key. Generator. get. Instance("AES"); key. Generator. init(128); Secret. Key key = key. Generator. generate. Key();
Key. Spec 변환 26 Key. Spec 변환이 필요한 경우 � � 파일로 저장된 키를 불러와서 사용하는 경우 (비밀키를 파일로 저장할 경우에는 byte array 형태로 저장) 난수를 생성하여 비밀키로 사용하려고 하는 경우 javax. crypto. spec. Secret. Key. Spec 엔진을 사용 � � public Secret. Key. Spec(byte[] key, String algorithm) 주어진 byte array로부터 주어진 알고리즘에 맞는 비밀키를 구성 함. Secure. Random random = new Secure. Random(); byte[] key. Data = new byte[16]; random. next. Bytes(key. Data); Secret. Key secret. Key = new Secret. Key. Spec(key. Data, "AES");
비밀키를 파일로 저장하기/읽어오기 27 Key. Generator key. Generator = Key. Generator. get. Instance("AES"); key. Generator. init(128); Secret. Key secret. Key = key. Generator. generate. Key(); byte[] key. Data = secret. Key. get. Encoded(); System. out. println("Algorithm : " + secret. Key. get. Algorithm()); System. out. println("Format : " + secret. Key. get. Format()); File key. File = new File("secret. Key. raw"); Output. Stream out = new Buffered. Output. Stream(new File. Output. Stream(key. File)); try { out. write(key. Data); } finally { out. close(); }
Cipher 엔진 29 객체의 초기화 � public void init(int opmode, Key key) Cipher 엔진의 동작모드 (opmode) � � Cipher. ENCRYPT_MODE: 암호화 연산을 사용하고자 할 때 Cipher. DECRYPT_MODE: 복호화 연산을 사용하고자 할 때
암호화 31 방법 1. do. Final() 메소드만 호출 � 암호화하고자 하는 평문의 크기가 작을 경우 String plaintext = "This is a secret message!"; byte[] ciphertext = cipher. do. Final(plaintext. get. Bytes()); 방법 2. 일련의 update() 메소드를 호출한 후에 do. Final() 메소드 호출 � 암호화하고자 하는 평문의 크기가 크거나 나누어져 있을 경우 byte[] ciphertext = new byte[cipher. get. Output. Size(input. length)]; int ct. Length = cipher. update(my. Byte. Array 01, 0, my. Byte. Array 01. length, ciphertext, 0); ct. Length += cipher. update(my. Byte. Array 02, 0, my. Byte. Array 02. length, ciphertext, ct. Length); ct. Length += cipher. do. Final(ciphertext, ct. Length);
DES 암호화 예제 32 Sym. Encryption. java try{ Key. Generator kg = Key. Generator. get. Instance("DES"); Secret. Key key = kg. generate. Key(); Secret. Key. Spec key. Spec = new Secret. Key. Spec(key. get. Encoded(), "DES"); Cipher cipher = Cipher. get. Instance("DES/ECB/PKCS 5 Padding"); cipher. init(Cipher. ENCRYPT_MODE, key. Spec); String plaintext = "This is a secret message!"; byte[] ciphertext = cipher. do. Final(plaintext. get. Bytes()); for(int i=0; i<ciphertext. length; i++){ System. out. printf("%02 X ", ciphertext[i]); } System. out. println(); cipher. init(Cipher. DECRYPT_MODE, key. Spec); byte[] cleartext = cipher. do. Final(ciphertext); for(int i=0; i<cleartext. length; i++){ System. out. print((char)cleartext[i]); } System. out. println(); } catch(){ }
AES 암호화 예제 33 AESTest. java AES 암호화 테스트 비밀키: 2 b 37 e 20 db 0 df 7 bdee 53 fb 26 a 846 d 7677 비밀키 길이: 128 bits 평문: 오늘도 별이 바람에 스치운다. 암호문: cb 00 d 7 e 6 d 3 dfc 950896 ea 1 aefbb 1 f 1 edfb 9 eac 43 da 4 cdc 1790 135 c 09 c 31 cd 9343 e 15 ba 6 a 720394 b 033 b 8114 de 85199 e 4 복호문 : 오늘도 별이 바람에 스치운다.
AES/CBC모드 예제 34 AESCBCTest. java � 초기벡터 IV 생성 필요 // IV 생성 Secure. Random random = new Secure. Random(); byte[] iv. Data = new byte[16]; // 128 bit random. next. Bytes(iv. Data); Iv. Parameter. Spec iv. Parameter. Spec = new Iv. Parameter. Spec(iv. Data); Charset charset = Charset. for. Name("UTF-8"); public static byte[] encrypt(Secret. Key secret. Key, Iv. Parameter. Spec iv. Parameter. Spec, byte[] plain. Data) throws General. Security. Exception { Cipher cipher = Cipher. get. Instance("AES/CBC/PKCS 5 Padding"); cipher. init(Cipher. ENCRYPT_MODE, secret. Key, iv. Parameter. Spec); byte[] encrypt. Data = cipher. do. Final(plain. Data); return encrypt. Data; }
파일 암호화/복호화 37 파일 암호화 try { input = new Buffered. Input. Stream(new File. Input. Stream(plain. File)); output = new Cipher. Output. Stream(new Buffered. Output. Stream(new File. Output. Stream(encrypt. File)), cipher); int read = 0; byte[] buffer = new byte[1024]; while ((read = input. read(buffer)) != -1) { output. write(buffer, 0, read); } } finally { if (output != null) try {output. close(); } catch(IOException ie) {} if (input != null) try {input. close(); } catch(IOException ie) {} }
파일 암호화/복호화 38 파일 복호화 try { input = new Cipher. Input. Stream(new Buffered. Input. Stream(new File. Input. Stream(encrypt. File)), cipher); output = new Buffered. Output. Stream(new File. Output. Stream(decrypt. File)); int read = 0; byte[] buffer = new byte[1024]; while ((read = input. read(buffer)) != -1) { output. write(buffer, 0, read); } } finally { if (output != null) try {output. close(); } catch(IOException ie) {} if (input != null) try {input. close(); } catch(IOException ie) {} }
- Slides: 38