Triple DES 는 DES 알고리즘을 세번 적용한 것으로 DES 알고리즘에 비해 보안성이 뛰어납니다. Java 에서는 기본적(1.4부터인가요?)으로 Triple DES 를 지원하고 있습니다. 여기서는 Triple DES 를 이용하여 암호화 하고 복호화 하는 방법에 대해 간략히 알아보고자 합니다.
암호화의 방법에는 크게 대칭키 방식과 비대칭키 방식이 있음을 알고 계실 것입니다. 오늘 보고자하는 Triple DES 는 대칭키 방식으로 암호화할 때나 복호화할 때 모두 같은 키를 사용하는 방법입니다. 따라서 키를 생성해야 하는데, 키를 생성하는 방법은 다음과 같습니다.
KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
keyGenerator.init(168);
Key key = keyGenerator.generateKey();
keyGenerator.init(168);
Key key = keyGenerator.generateKey();
KeyGenerator 는 javax.crypto 패키지 안에 있습니다. init(168)은 168bit 의 크기를 갖는 키를 생성하겠다는 의미이며, 112 를 사용할 수 도 있습니다. 이 때 만들어지는 키의 내용을 확인해 보려면 다음과 같은 코드를 사용할 수 있습니다.
for (int i = 0; i < key.getEncoded().length ; i++) {
System.out.print((key.getEncoded())[i] + " ");
}
System.out.print((key.getEncoded())[i] + " ");
}
키의 크기를 168로 할 경우, 위의 코드는 24개의 값을 보여주게 됩니다.
키가 만들어 졌으니 이 키를 이용해서 암호화를 수행해야 합니다.
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
cipher.init(Cipher.ENCRYPT_MODE, key);
Cipher 를 통해 암호화/복호화를 수행할 수 있으며 DESede/ECB/PKCS5Padding 은 각각 algorithm/mode/padding 을 의미합니다. init()를 통해 동작 형태를 지정할 수 있으며, 위의 코드는 암호화를 의미합니다.
실제 암호화는 doFinal() 메소드를 통해서 수행하게 됩니다.
byte[] plainText = "Welcome to Shinnara's World".getBytes("UTF8");
byte [] cipherText = cipher.doFinal(plainText);
byte [] cipherText = cipher.doFinal(plainText);
다음 코드를 통해 암호화된 내용을 확인해 보실 수 있습니다.
for (int i = 0; i < cipherText.length ; i++) {
System.out.print(cipherText[i] + " ");
}
System.out.print(cipherText[i] + " ");
}
이제 암호화된 내용을 다시 복호화하는 방법입니다. 키의 내용이 byte[] encodedkey 로 전달되었다고 가정합니다.
SecretKeyFactory sfk = SecretKeyFactory.getInstance("DESede");
SecretKey sk = sfk.generateSecret(new DESedeKeySpec( encodedkey));
SecretKey sk = sfk.generateSecret(new DESedeKeySpec( encodedkey));
복호화 모드로 Cipher 를 만듭니다.
cipher.init(Cipher.DECRYPT_MODE, sk);
복호화 하는 것 역시 doFinal 메소드를 사용합니다.
byte [] decryptedText = cipher.doFinal(cipherText);
내용을 확인해보면, 암호화 하기 전의 내용이 제대로 표현되었음을 알 수 있습니다.
너무 쉽죠? ^^
댓글을 달아 주세요