자바개발자라면 누구나 알고 있겠지만.. 막상 외워서 할 수 있는 사람은 몇명 없을듯…
나중에 필요하면 찾아쓰기위해 아래와 같이 정리해둠.
1
2
3
4
| KeyGenerator generator = KeyGenerator.getInstance( "AES" ); SecureRandom random = SecureRandom.getInstance( "SHA1PRNG" ); generator.init( 128 , random); Key secureKey = generator.generateKey(); |
SecureRandom 을 이용하는 이유는 Random이란게 원래 추측이 가능하기 때문에 추측이 불가능하게 하기 위한 Random발생모듈.
PRNG (Pseudo-Random Number Generator) 라고도 함.
위의 방법은 임의의 공통키를 생성해주므로 매번 키가 바뀐다.
패스워드방식으로 공통키를 생성하게 되면 같은 패스워드를 사용하면 같은 공통키를 얻을 수 있다.
방법은 아래와 같이….
1
2
3
| PBEKeySpec keySpec = new PBEKeySpec( "패스워드" .toCharArray() ); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "PBE" ); Key secureKey = keyFactory.generateSecret( keySpec ); |
하지만 위 방법은 AES암호에서는 적용되지 않는다.
AES의 키는 128bit, 192bit, 256bit 여야 하므로 패스워드의 길이제한이 있다.
아래 패스워드의 설정은 영문자 16문자로 설정할 경우 128bit의 키가 된다.
1
| Key secureKey = new SecretKeySpec( "패스워드" .getBytes(), "AES" ); |
공통키 secureKey 를 생성했다면..
아래와 같이 암호화할 수 있다.
1
2
3
| Cipher cipher = Cipher.getInstance( "AES" ); cipher.init(Cipher.ENCRYPT_MODE, secureKey); byte [] encryptedData = cipher.doFinal( "암호화할 평문" .getBytes()); |
복호는 아래와 같이 한다.
1
2
3
| Cipher cipher = Cipher.getInstance( "AES" ); cipher.init(Cipher.DECRYPT_MODE, secureKey); byte [] plainText = cipher.doFinal(encryptedData); |