Java에서 제공하는 Keytool을 이용하여 AES 키 생성 예
Java에서 제공하는 암호화 키 생성/보관 시스템인 keytool 은 기본적으로 JKS 유형의 키 저장소를 사용한다
JKS 유형의 키 저장소는 대칭키를 생성하지도 않고 보관하지도 않는다.
요즘 사용되는 고급 암호화 표준(AES) 키를 생성하고 보관하기 위해서는 JCEKS 유형의 키 저장소를 사용해야 한다
AES 는 2001년도에 미국정부에서 1급비밀의 암호화에 사용하는 암호화 알고리듬으로 지정되었으며 암호화/복호화에 동일한 키가 사용되는 대칭키 알고리듬에 속한다. AES는 128비트 비밀키를 사용하여 암호화/복호화를 수행하는데, 아직까지 공격으로부터 해제된 적이 없으며 각국에서 가장 안전한 암호화 알고리듬으로 인정받고 있다
아래의 내용은 Java Keytool을 이용하여 키 저장소에 AES 키를 생성하고 삭제하는 예이다
keytool에서 설정한 keystore 경로, keystore 비번, alias, key 비번 등은 자바 프로그램 코드 안에서 키 저장소의 키를 로드할 때 참조된다
AES 키 생성
C:\Program Files\Java\jdk1.8.0\bin>keytool -genseckey -alias MyAESKey -keyalg AES
-keysize 128 -keystore d:\test\.mykeystore -storepass 000000 -storetype JCEKS
<MyAESKey>에 대한 키 비밀번호를 입력하십시오. 111111
(키 저장소 비밀번호와 동일한 경우 Enter 키를 누름):
새 비밀번호 다시 입력: 111111
C:\Program Files\Java\jdk1.8.0\bin>
AES 키가 생성되었는지 확인
C:\Program Files\Java\jdk1.8.0\bin>keytool -list -keystore d:\test\.mykeystore -storetype JCEKS
키 저장소 비밀번호 입력: 000000
키 저장소 유형: JCEKS
키 저장소 제공자: SunJCE
키 저장소에 2개의 항목이 포함되어 있습니다.
mysecretkey, 2014. 7. 26, PrivateKeyEntry,
인증서 지문(SHA1): 43:C0:FF:D4:B9:A7:E2:B0:83:CA:38:18:7B:75:EF:D2:10:31:58:AE
myaeskey, 2014. 7. 26, SecretKeyEntry,
C:\Program Files\Java\jdk1.8.0\bin>
AES 키를 삭제하는 방법
C:\Program Files\Java\jdk1.8.0\bin>keytool -delete -keystore d:\test\.mykeystore
-alias MyAESKey -storetype JCEKS
키 저장소 비밀번호 입력: 000000
C:\Program Files\Java\jdk1.8.0\bin>
위의 절차를 통해 keystore에 생성된 AES 키를 로드하여 암호화 복호화를 수행하는 예
import java.io.*;
import java.security.*;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Java_AES_Test {
public void run() {
try {
String text = "암호화 대상 문자열 (Original Text)";
//String key = "Bar12345Bar12345"; // 128 bit key
// Create key and cipher
//Key aesKey = new SecretKeySpec(key.toString().getBytes(), "AES");
Key aesKeyFromStore = getAESKey();
Cipher cipher = Cipher.getInstance("AES");
// encrypt the text
cipher.init(Cipher.ENCRYPT_MODE, aesKeyFromStore);
byte[] encrypted = cipher.doFinal(text.getBytes());
System.out.println("암호화된 텍스트 -> " + new String(encrypted));
// decrypt the text
cipher.init(Cipher.DECRYPT_MODE, aesKeyFromStore);
String decrypted = new String(cipher.doFinal(encrypted));
System.out.println("복호화된 텍스트 -> " + decrypted);
}catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
Java_AES_Test app = new Java_AES_Test();
app.run();
}
private static Key getAESKey() throws Exception {
String keystorePath = "d:/test/.mykeystore";
String keystorePwd = "000000";
String alias = "MyAESKey";
String keyPwd = "111111";
FileInputStream is = new FileInputStream(keystorePath);
KeyStore keystore = KeyStore.getInstance("JCEKS");
keystore.load(is, keystorePwd.toCharArray());
Key key = keystore.getKey(alias, keyPwd.toCharArray());
return key;
}
}