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

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);