개발 공부/기록

[JAVA] AES128로 암복호화 코드 작성하기

journey 2023. 1. 3. 17:00
728x90

개발을 할 때보면 파라미터를 숨겨야 할 때가 있다. 이때 유용하게 사용한 Base64와 AES128가 있다.

 

AES128 암복호화 코드

public class Aes128 {

	private static final Charset ENCODING_TYPE = StandardCharsets.UTF_8;
	private static final String INSTANCE_TYPE = "AES/ECB/PKCS5Padding";
	private SecretKeySpec secretKeySpec;
	private Cipher cipher;

	public Aes128(final String key) { 
		try {
			byte[] keyBytes = key.getBytes(ENCODING_TYPE);
			secretKeySpec = new SecretKeySpec(keyBytes, "AES");
			cipher = Cipher.getInstance(INSTANCE_TYPE);
		} catch (NoSuchPaddingException | NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
    
	/*
	 * 암호화
	 * 
	 * @param str
 	 */
	public String encrypt(final String str) throws Exception {
		cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
		byte[] ecrypted = cipher.doFinal(str.getBytes(ENCODING_TYPE));
		return new String(Base64.getEncoder().encode(ecrypted), ENCODING_TYPE);
	}

	/*
 	 * 복호화
 	 * 
	 * @param str
 	 */
	public String decrypt(final String str) throws Exception {
		cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
		byte[] decrypted = Base64.getDecoder().decode(str);
		return new String(cipher.doFinal(decrypted), ENCODING_TYPE);
	}
}

 

 

암복호화 예제

public static void main(String[] args) throws Exception {

	String key = "aeskey1234567898"; // 128비트(16바이트)의 키

	String te = "암호화할 문자";

	String ret = "복호화할 문자";

	Aes128 aes128 = new Aes128(key);
	
	// 먼저 AES128로 1차 암호화. 마지막 글자가 =로 끝난다.
	String aesEncode = aes128.encrypt(te);
	log.debug("aesEncode: " + aesEncode);
	// AES128로 암호화한 문자를 다시 URL인코더로 2 암호화하기. 중간에 %가 삽입된다.
	String urlEncode = URLEncoder.encode(aesEncode, "UTF-8");
	log.debug("urlEncode: " + urlEncode);
    
	// 복호화 할 땐 반대로 URL디코더로 1차 복호화 후
	String urlDecode = URLDecoder.decode(ret, "UTF-8");
	log.debug("urlDecode: "+urlDecode); 
	// AES128로 2차 복호화한다.
	String aesDecode = aes128.decrypt(urlDecode); 
	log.debug("aesDecode: "+aesDecode);

}

 

암호화 결과

복호화 결과