자바 AES256 암호화 복호화 3분만에 하는방법

JAVA AES256 양방향 암호화 방식


실제 프로젝트를 진행 하면서 사용 하였던 AES256 암호화 기법을 소개하려고 합니다. 실제로 아직까지 많은 자바 개발자들이 이용하고 있습니다. 아파치에서 제공하는 common.codec 을 사용하며, 별도의 많은 파일은 필요하지 않습니다. commons-codec-1.10.jar 파일을 필요로 합니다. 이것은 저가 하단쪽에 첨부해드릴게요. ㅎㅎ 


대칭키(비밀키) 방식의 AES256 암호화 장단점

예전 AES128(128비트 블록암호화)를 사용하던 암호화가 보안에 취약하여, 개선된 버전이 AES256(256비트 블록암호화) 입니다. 주로 평문 데이터를 암호화하는데 많이 쓰이며, 비밀키 하나로 데이터를 암호화 하고 복호화를 하며 사용하게 됩니다. 장점으로는 AES128과 비교하였을때는 당연히 보안성과 안전성이 높다고 말할수 있으며, 더 멀리 나아가 비대칭키(공개키 암호화시스템)보다 속도가 빠르다는 이점을 가지고 있습니다. 비대칭키와 대칭키에 대한 개념설명은 따로 포스팅 하겠습니다. 단점으로는 키 한개로 암호화복호화를 하기 때문에 유출이 된다면, 암호화는 의미가 없어지겠죠. 




패딩(padding) 이란?

아래 코드에도 나오겠지만, 위에서 블록암호화를 진행하기 위해서는 패딩기법이 필요합니다. 데이터를 특정크기로 맞추기 위해서, 특정크기보다 부족한 부분의 공간을 의미없는 문자들로 채워서 비트수를 맞추는 것입니다. 암호화시에는 반드시 필요한 방법입니다.

Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); 다음과 같이 쓰일수 있습니다.


AES256 암호화 및 복호화 코드

import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

/**
 * 양방향 암호화 알고리즘인 AES256 암호화를 지원하는 클래스
 */
public class AES256Util {
	private String iv;
	private Key keySpec;

	/**
	 * 16자리의 키값을 입력하여 객체를 생성한다.
	 * 
	 * @param key
	 *            암/복호화를 위한 키값
	 * @throws UnsupportedEncodingException
	 *             키값의 길이가 16이하일 경우 발생
	 */
	final static String key = "비밀키입력하는곳";

	public AES256Util() throws UnsupportedEncodingException {
		this.iv = key.substring(0, 16);
		byte[] keyBytes = new byte[16];
		byte[] b = key.getBytes("UTF-8");
		int len = b.length;
		if (len > keyBytes.length) {
			len = keyBytes.length;
		}
		System.arraycopy(b, 0, keyBytes, 0, len);
		SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

		this.keySpec = keySpec;
	}

	/**
	 * AES256 으로 암호화 한다.
	 * 
	 * @param str
	 *            암호화할 문자열
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws GeneralSecurityException
	 * @throws UnsupportedEncodingException
	 */
	public String encrypt(String str) throws NoSuchAlgorithmException,
			GeneralSecurityException, UnsupportedEncodingException {
		Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
		c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));
		byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
		String enStr = new String(Base64.encodeBase64(encrypted));
		return enStr;
	}

	/**
	 * AES256으로 암호화된 txt 를 복호화한다.
	 * 
	 * @param str
	 *            복호화할 문자열
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws GeneralSecurityException
	 * @throws UnsupportedEncodingException
	 */
	public String decrypt(String str) throws NoSuchAlgorithmException,
			GeneralSecurityException, UnsupportedEncodingException {
		Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
		c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));
		byte[] byteStr = Base64.decodeBase64(str.getBytes());
		return new String(c.doFinal(byteStr), "UTF-8");
	}
}


위와같이 자바 파일을 생성하여 객체생성 하여, 암호화 복호화를 진행하면 될거 같네요. 


java.security.InvalidKeyException: Illegal key size 에러

자주 나는 에러중 한개가 인데, 키값의 길이가 부족할때 발생하는 에러입니다. 


UnsupportedEncodingException  에러

JAVA의 기본 정책으로는 AES128 암호화 방식까지만 사용이 가능하므로 AES256 방식으로 암호화를 하게 되면 아래와 같은 Exceptioin이 발생합니다. 미국에서는 자국에서만 허용하기로 하였기 때문에, 저희는 라이브러릴 따로 추가 해야 합니다.

local_policy.jar

US_export_policy.jar


마지막으로 AES256 사용시 필요한 라이브러리도 첨부 하겠습니다. 총 3개의 라이브러리가 필요하겠네요. 아마 다들 가지고 있긴 할거에요 ㅎㅎ 

commons-codec-1.10.jar

이 글을 공유하기

댓글

Designed by JB FACTORY