진행중인 프로젝트에서 회원 개인정보 암호화를 해야해서 공부하게 되었다.
양방향 알고리즘을 사용하고 자바의 암복호화를 담당하는 JAVA Cipher class를 사용할 것이다.
cipher class는 AES,DES,RSA 등 다양한 방식을 제공한다.
public class AES256 {
public static String alg = "AES/CBC/PKCS5Padding";
private final String key = "abcdefghabcdefghabcdefghabcdefgh"; // 32byte
private final String iv = "0123456789abcdef"; // 16byte
public String encrypt(String text) throws Exception {
Cipher cipher = Cipher.getInstance(alg);
SecretKeySpec keySpec = new SecretKeySpec(iv.getBytes(),"AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivParameterSpec);
byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encrypted);
}
public String decrypt(String cipherText) throws Exception {
Cipher cipher = Cipher.getInstance(alg);
SecretKeySpec keySpec = new SecretKeySpec(iv.getBytes(), "AES");
IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);
byte[] decodedBytes = Base64.getDecoder().decode(cipherText);
byte[] decrypted = cipher.doFinal(decodedBytes);
return new String(decrypted, "UTF-8");
}
}
Cipher cipher = Cipher.getInstance(”AES/CBC/PKCS5Padding”);
cipher instance를 만들때 필수값 3가지가 있다.
비밀키 / 블록 암호 운용방식 / 패딩 기법
1. 비밀키(Secret Key) 선택
2. 블록 암호 운용 방식(Block Cipher Mode) 선택
a. CBC(Cipher Block Chaning) - 권장하는 방식
블록을 그대로 암호화 하지 않고 이전에 암호화 했던 블록과 XOR 연산을 한 다음에 암호화를 수행한다.
그래서 같은 내용을 갖는 원문 블록이라도 전혀 다른 암호문을 갖게된다. 그런데 첫번째 블록은 이전에 암호화 블록이 없기 때문에 IV(initialization vector)를 암호문 대신 이용한다. AES는 128Bit(16Byte) 단위로 암호화 하기 때문에 IV 역시 16Byte크기이다.
IV(초기화 벡터)
암호를 복호화할 사람에게 미리 제공되어야하고 키와 달리 공개되어도 상관없다.
송수신자가 IV를 어떤것으로 사용할지 정해두거나 파일에 IV를 기록해두는 방식으로 공유한다.
b. ECB(Electronic Code Book)
가장 간단한 구조로 암호화하려는 메세지를 여러블록으로 나누어 각 블록을 독립적으로 암호화 하는 방식이다.
단점으로는 키가 고정되어 있을 경우 평문 내에서 동일한 블록들은 암호화한 결과 또한 동일하다는 점이다. 즉 한개의 블록만 해독되도 나머지 블록이 해독된다.
3. 패딩 기법(Padding Mode) 선택