자바개발자라면 누구나 알고 있겠지만.. 막상 외워서 할 수 있는 사람은 몇명 없을듯…
나중에 필요하면 찾아쓰기위해 아래와 같이 정리해둠.
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); |
