본문 바로가기

Java Security/AES Key Generation

Java Keytool AES Key Generation

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;

    }

}