본문 바로가기

Java

AES 암호화/복호화

구글링으로 관련된 정보를 찾아보니 많이 나왔다.
이 중 나에게 필요한 것만 다시 추출하여 만들어보았다.
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

/**
 * @author 윤성탁
 */
public class EncryptionUtils {
	private static final String AES_CBC_PKCS5 = "AES/CBC/PKCS5Padding";
	private static final String AES = "AES";

	public static String encode(String text, byte[] key) throws Exception {
		SecretKeySpec keySpec = new SecretKeySpec(key, AES);
		Cipher cipher = Cipher.getInstance(AES_CBC_PKCS5);
		cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]));
		
		byte[] encrypted = cipher.doFinal(text.getBytes("utf-8"));
		
		return new String(Base64.encodeBase64(encrypted));
	}
	
	public static String decode(String encode, byte[] key) throws Exception {
		SecretKeySpec keySpec = new SecretKeySpec(key, AES);
		
		Cipher cipher = Cipher.getInstance(AES_CBC_PKCS5);
		cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]));
		
		byte[] decodeBytes = cipher.doFinal(Base64.decodeBase64(encode));
		
		return new String(decodeBytes, "utf-8");
	}
}
AES 모드 : http://blog.daum.net/_blog/BlogTypeView.do?blogid=0Z2do&articleno=2
패딩 및 모드 : http://acaasia.blogspot.kr/2013/07/padding-mode.html
Base64 인코딩 이유 : 문자깨짐을 막기 위한?

참고) 128bit가 아닌 256bit AES는??
- JDK에 맞는 것을 선택하여 JAVA_HOME의 security디렉토리 아래의 파일들을 덮어씌워야한다.
- https://dukeom.wordpress.com/2013/01/08/aes256-%EC%95%94%ED%98%B8%ED%99%94-java-%EC%83%98%ED%94%8C/