3 6 MAC PBKDF 2 SHA1 5 NIST
3 6. 해쉬함수, MAC, PBKDF 2
SHA-1 5 NIST FIPS 180 -1 표준 해쉬함수 � � 블록 사이즈 512 비트 출력 해쉬값 160비트 온라인 테스트 � � http: //www. sha 1 -online. com/ http: //passwordsgenerator. net/sha 1 -hash-generator/
2. 해쉬함수 계산 10 Message. Digest 엔진 이용 � 객체 초기화 � 데이터 입력 � public static Message. Digest get. Instance(String algorithm) throws No. Such. Algorithm. Exception public void update(byte input) 해쉬계산 완료 public byte[] digest() Message. Digest md 5 = Message. Digest. get. Instance("MD 5"); md 5. update((byte) rnd); byte[] digest = md 5. digest();
해쉬함수 계산 예제 13 java. security. Message. Digest 엔진을 사용 try{ Message. Digest md 5 = Message. Digest. get. Instance("MD 5"); md 5. update(plaintext. get. Bytes()); byte[] digest 01 = md 5. digest(); for(byte b: digest 01) System. out. printf("%02 X ", b); System. out. println(); md 5. update(plaintext. get. Bytes()); byte[] digest 02 = md 5. digest(); for(byte b: digest 01) System. out. printf("%02 X ", b); System. out. println(); System. out. printf("Verified = %s%n", Message. Digest. is. Equal(digest 01, digest 02)); } catch(No. Such. Algorithm. Exception e){ e. print. Stack. Trace(); }
두 메시지의 해쉬값 비교 14 public class Digest. Test { public static void main(String[] args) { String plaintext 01 = "This is a simple message. "; String plaintext 02 = "This is a simple message"; try{ Message. Digest md 5 = Message. Digest. get. Instance("MD 5"); md 5. update(plaintext 01. get. Bytes()); byte[] digest 01 = md 5. digest(); for(byte b: digest 01) System. out. printf("%02 X ", b); System. out. println(); md 5. update(plaintext 02. get. Bytes()); byte[] digest 02 = md 5. digest(); for(byte b: digest 02) System. out. printf("%02 X ", b); System. out. println(); System. out. printf("Verified = %s%n", Message. Digest. is. Equal(digest 01, digest 02)); } catch(No. Such. Algorithm. Exception e){ e. print. Stack. Trace(); } } // main } // Digest. Test
두 메시지의 해쉬값 비교 15 import java. security. *; public class Hash. Test { public static void main(String[] args) { String plaintext 01 = "This is a simple message. . . "; ; String plaintext 02 = "This is a simple message"; // 해쉬 알고리즘 선택: MD 2 MD 5 SHA-1 SHA-224 SHA-256 SHA-384 SHA-512 try{ System. out. println("MD 5 Algorithm"); Message. Digest md 5 = Message. Digest. get. Instance("MD 5"); MD 5 Algorithm md 5. update(plaintext 01. get. Bytes()); Text 1 : This is a simple message. . . Hash 1 : 5 C 30 7 D EF FE BA F 7 97 F 1 67 A 6 CD 91 EF 7 D A 1 System. out. println("Text 1 : "+plaintext 01); Text 2 : This is a simple message byte[] digest 01 = md 5. digest(); Hash 2 : FB B 2 5 E F 6 ED EB 7 A 80 B 7 70 80 04 11 7 D C 2 36 System. out. print("Hash 1 : "); 해쉬 길이 : 16 byte for(byte b: digest 01) System. out. printf("%02 X ", b); Verified = false System. out. println(); md 5. update(plaintext 02. get. Bytes()); System. out. println("Text 2 : "+plaintext 02); byte[] digest 02 = md 5. digest(); System. out. print("Hash 2 : "); for(byte b: digest 02) System. out. printf("%02 X ", b); System. out. print("n해쉬 길이 : "+digest 02. length+ " byte" ); System. out. println(); System. out. printf("Verified = %s nn", Message. Digest. is. Equal(digest 01, digest 02));
3. 파일의 체크섬 생성/검증 16 인터넷으로 배포하는 파일의 진위성 확인을 위해 사용 (Checksum. Example. java) � 1. 확인할 파일을 프로젝트 폴더 루트에 복사 � httpd-2. 2. 32. tar. gz http: //www-eu. apache. org/dist/httpd/ 2. 인터넷에 게시된 해쉬값을 변수로 저장 httpd-2. 2. 32. tar. gz. md 5 8141657 cf 0 c 58 f 14 de 2 a 5 ce 9426 df 2 bc *httpd-2. 2. 32. tar. gz. sha 1 19 e 94 b 8 c 9 e 727 cc 16 b 75795814 c 5 b 0 e 27 ebc 08 d 5 *httpd 2. 2. 32. tar. gz Given MD 5 : 8141657 cf 0 c 58 f 14 de 2 a 5 ce 9426 df 2 bc Computed MD 5 : 8141657 cf 0 c 58 f 14 de 2 a 5 ce 9426 df 2 bc true Given SHA 1 : 19 e 94 b 8 c 9 e 727 cc 16 b 75795814 c 5 b 0 e 27 ebc 08 d 5 Computed SHA 1 : 19 e 94 b 8 c 9 e 727 cc 16 b 75795814 c 5 b 0 e 27 ebc 08 d 5 true
해쉬함수를 이용한 동전던지기 18 Commitment Bidding Reveal Verify
MAC 22
Hash와 MAC의 비교 23 Hash MAC
HMAC 알고리즘 25 From Wikipedia
MAC 27 JCA/JCE에서의 MAC � � javax. crypto. Mac 엔진을 사용 기존의 비밀키를 MAC에 적합하도록 변환하여 사용 // 키 생성 – 송신자와 수신자가 공유 Key. Generator kg = Key. Generator. get. Instance(“AES"); Secret. Key key = kg. generate. Key(); Secret. Key. Spec key. Spec = new Secret. Key. Spec(key. get. Encoded(), "Hmac. SHA 1"); // MAC 계산 – 송신자 계산, 수신자 검증 Mac mac = Mac. get. Instance("Hmac. SHA 1"); mac. init(key. Spec); mac. update(plaintext 01. get. Bytes()); byte[] digest 01 = mac. do. Final();
MAC 28 제공되는 MAC 알고리즘 � Hmac. MD 5, Hmac. SHA 1, Hmac. SHA 256, Hmac. SHA 384, Hmac. SHA 512
MAC 사례 29 try{ Key. Generator kg = Key. Generator. get. Instance("AES"); Secret. Key key = kg. generate. Key(); Secret. Key. Spec key. Spec = new Secret. Key. Spec(key. get. Encoded(), "Hmac. SHA 1"); Mac mac = Mac. get. Instance("Hmac. SHA 1"); mac. init(key. Spec); mac. update(plaintext. get. Bytes()); byte[] digest 01 = mac. do. Final(); for(byte b: digest 01) System. out. printf("%02 X ", b); System. out. println(); mac. init(key. Spec); mac. update(plaintext. get. Bytes()); byte[] digest 02 = mac. do. Final(); for(byte b: digest 01) System. out. printf("%02 X ", b); System. out. println(); System. out. printf("Verified = %s%n", Message. Digest. is. Equal(digest 01, digest 02)); } catch(No. Such. Algorithm. Exception e){ e. print. Stack. Trace(); }
MACTest. java 30 String plaintext 01 = "This is a simple message. "; String plaintext 02 = "This is a simple message. . "; Key. Generator kg = Key. Generator. get. Instance("AES"); Secret. Key key = kg. generate. Key(); Secret. Key. Spec key. Spec = new Secret. Key. Spec(key. get. Encoded(), "Hmac. SHA 1"); byte[] keybyte = key. get. Encoded(); System. out. println("키 : "+bytes. To. Hex(keybyte)); System. out. println("키길이 : "+keybyte. length+ " byte" ); System. out. println(); Mac mac = Mac. get. Instance("Hmac. SHA 1"); mac. init(key. Spec); 키 : 6 b 45 cc 39 dec 61 d 684 eac 4 ef 0 b 1448 abb mac. update(plaintext 01. get. Bytes()); 키길이 : 16 byte[] digest 01 = mac. do. Final(); mac. update(plaintext 02. get. Bytes()); Text 1 : This is a simple message. byte[] digest 02 = mac. do. Final(); MAC 1 : 2 f 1026 b 8955968 a 429 a 29 ef 8 d 81 e 4 c 26 bc 425 b 8 f MAC 길이 : 20 byte Text 2 : This is a simple message. . MAC 2 : d 9 fea 50 d 90 c 3 a 9 eb 756721 fdec 82 bf 586 db 988 b 6 MAC 길이 : 20 byte
PBKDF 2 테스트 32 http: //cris. joongbu. ac. kr/course/2016 -1/wp 1/crypto/pbkdf 2. html
PKCS#5 패스워드 기반 암호 표준 33 PBKDF 2 (Password-Based Key Derivation Function 2)
패스워드 기반 암호화 35 PBES 1 (password-based encryption scheme 1) � PBKDF 1을 이용하여 키생성 PBES 2 (password-based encryption scheme 2) � PBKDF 2을 이용하여 키생성 PBKDF 1 PBKDF 2
PBES 1 37 PBE 1 Example. java 입력 패스워드: password salt: f 76 b 8 f 30 a 582 bea 0 반복횟수: 1000 생성된 비밀키: 70617373776 f 7264 생성된 파라메터: javax. crypto. spec. PBEParameter. Spec@d 70 c 109 평문: 오늘도 별이 바람에 스치운다. 암호문: b 80 f 5 ccca 7019 e 0072978 e 31 b 6 cddbda 8 cc 972 e 9 a 150 e 4 f 52 f 6 afb 6 a 6 e 8 dc 7 8 b 4808 d 791 a 55 c 8 f 3 c 050062 f 64838 d 81 a 복호화: 오늘도 별이 바람에 스치운다.
PBES 1 38 String pass = "password"; char[] password = pass. to. Char. Array(); System. out. println("입력 패스워드: "+pass); // salt 생성 byte[] salt = new byte[8]; Secure. Random random = new Secure. Random(); random. next. Bytes(salt); System. out. println("salt: "+bytes. To. Hex(salt)); int iteration. Count = 1000; // 반복 횟수 System. out. println("반복횟수: "+iteration. Count); // 패스워드를 사용한 Secret. Key 생성 PBEKey. Spec key. Spec = new PBEKey. Spec(password); Secret. Key. Factory key. Factory = Secret. Key. Factory. get. Instance("PBEWith. MD 5 And. DES"); Secret. Key secret. Key = key. Factory. generate. Secret(key. Spec); System. out. println("생성된 비밀키: "+bytes. To. Hex(secret. Key. get. Encoded())); // salt, iteration count를 위한 파라미터 생성 PBEParameter. Spec params = new PBEParameter. Spec(salt, iteration. Count); System. out. println("생성된 파라메터: "+params);
PBES 2 39 PBE 2 Example. java 입력 패스워드: password salt: 3838 b 19 d 4 d 01 d 0 fc 반복횟수: 1000 생성된 비밀키: 54 bd 3 c 9 bb 31155 af 23 bab 576 a 54 a 53 de 입력 평문: 오늘도 별이 바람에 스치운다. 암호문: f 66 f 518406 f 4 f 2 d 32972210 a 053 f 6 f 4 af 0 aee 86 e 03 ef 5 bfb 6 da 83 f 561 b 63 e 3 d 0 cfe d 1 e 2 c 4 c 8 bb 0 bda 28 b 5396 e 09 ab 06 d 복호화: 오늘도 별이 바람에 스치운다.
PBES 2 40 String pass = "password"; char[] password = pass. to. Char. Array(); System. out. println("입력 패스워드: "+pass); Charset charset = Charset. for. Name("UTF-8"); // salt 생성 byte[] salt = new byte[8]; Secure. Random random = new Secure. Random(); random. next. Bytes(salt); System. out. println("salt: "+bytes. To. Hex(salt)); int iteration. Count = 1000; // 반복 횟수 System. out. println("반복횟수: "+iteration. Count); // 패스워드를 이용한 Secret. Key 생성 Secret. Key. Factory key. Factory = Secret. Key. Factory. get. Instance("PBKDF 2 With. Hmac. SHA 1"); PBEKey. Spec key. Spec = new PBEKey. Spec(password, salt, iteration. Count, 128); Secret. Key secret. Key = new Secret. Key. Spec(key. Factory. generate. Secret(key. Spec). get. Encoded(), "AES"); System. out. println("생성된 비밀키: "+bytes. To. Hex(secret. Key. get. Encoded()));
- Slides: 42