본문 바로가기

기초 문법/자바

[JAVA] AES128 암호화/복호화

 자바에서 AES128를 이용하여 양방향 암호화 및 복호화를 하는 예제입니다. Hash 암호화와는 다르게 양방향이므로 대칭키를 가지고 있으며, AES128, AES192, AES256 등 키의 bit수의 따라 나뉘게 됩니다.

 AES128 은 16byte로써 키의 길이가 16자리인 암호 방식입니다. 

 

 키의 길이에 따라 라운드의 수가 다르며 AES 암호 알고리즘에서 마지막 라운드에서는 MixColumn 단계가 없다.

 AES 이론적인 내용을 참고하시려면 https://www.crocus.co.kr/1230 등을 참고해주시기 바랍니다.

 

 

# Contents


  • 암호화
  • 복호화
  • 전체 코드

 

 

# 암호화


 AES128 암호화 코드 예제입니다. iv는 설정하지 않고 암호화를 하였습니다. 

private static String key = "abcdefghijklmnop";
private static String target = "Java와 JavaScript 에서 AES 암호화/복호화"; 

String str = encrypt(target.getBytes(), key.getBytes());

public static String encrypt(byte[] target, byte[] key){
	SecretKeySpec keySpec = null;
	
	keySpec = new SecretKeySpec(key, "AES");
	Cipher cipher = null;
	try {
		cipher = Cipher.getInstance("AES");
	} catch (NoSuchAlgorithmException e) {
		return null;
	} catch (NoSuchPaddingException e) {
		return null;
	}
	
	try {
		cipher.init(Cipher.ENCRYPT_MODE, keySpec);
	} catch (InvalidKeyException e) {
		return null;
	}
	
	try {
		Encoder encoder = Base64.getEncoder();
		return new String(encoder.encode(cipher.doFinal(target)));
	} catch (IllegalBlockSizeException e) {
		
	} catch (BadPaddingException e) {
		
	}
	return null;
}

 

 결과는 아래와 같습니다.

 

 

# 복호화


 AES128 복호화 코드 예제입니다. iv는 설정하지 않고 복호화를 하였습니다. 

private static String key = "abcdefghijklmnop";
private static String target = "Java와 JavaScript 에서 AES 암호화/복호화"; 

String str = encrypt(target.getBytes(), key.getBytes());
String str2 = decrypt(str.getBytes(), key.getBytes());

public static String decrypt(byte[] target, byte[] key){
	SecretKeySpec keySpec = null;
	
	keySpec = new SecretKeySpec(key, "AES");
	Cipher cipher = null;
	try {
		cipher = Cipher.getInstance("AES");
	} catch (NoSuchAlgorithmException e) {
		
		return null;
	} catch (NoSuchPaddingException e) {
		return null;
	}
	
	try {
		cipher.init(Cipher.DECRYPT_MODE, keySpec);
	} catch (InvalidKeyException e) {
		
		return null;
	}
	
	try {
		Decoder encoder = Base64.getDecoder();
		return new String(cipher.doFinal(encoder.decode(target)));
	} catch (IllegalBlockSizeException e) {
		System.out.println("err");
	} catch (BadPaddingException e) {

	}
	return null;
}

 

 결과는 아래와 같습니다.

 

 

# 전체 코드


 AES128 암호화 및 복호화 코드 예제입니다.

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;


public class Test {
	
	private static String key = "abcdefghijklmnop";
	private static String target = "Java와 JavaScript 에서 AES 암호화/복호화"; 

	public static void main(String[] args)  {
        
        String str = encrypt(target.getBytes(), key.getBytes());
        System.out.println(str);
        
        String str2 = decrypt(str.getBytes(), key.getBytes());
        System.out.println(str2);
    }
    
	
	public static String encrypt(byte[] target, byte[] key){
		SecretKeySpec keySpec = null;
		
		keySpec = new SecretKeySpec(key, "AES");
		Cipher cipher = null;
		try {
			cipher = Cipher.getInstance("AES");
		} catch (NoSuchAlgorithmException e) {
			return null;
		} catch (NoSuchPaddingException e) {
			return null;
		}
		
		try {
			cipher.init(Cipher.ENCRYPT_MODE, keySpec);
		} catch (InvalidKeyException e) {
			return null;
		}
		
		try {
			Encoder encoder = Base64.getEncoder();
			return new String(encoder.encode(cipher.doFinal(target)));
		} catch (IllegalBlockSizeException e) {
			
		} catch (BadPaddingException e) {
			
		}
		return null;
	}
	
	public static String decrypt(byte[] target, byte[] key){
		SecretKeySpec keySpec = null;
		
		keySpec = new SecretKeySpec(key, "AES");
		Cipher cipher = null;
		try {
			cipher = Cipher.getInstance("AES");
		} catch (NoSuchAlgorithmException e) {
			
			return null;
		} catch (NoSuchPaddingException e) {
			return null;
		}
		
		try {
			cipher.init(Cipher.DECRYPT_MODE, keySpec);
		} catch (InvalidKeyException e) {
			
			return null;
		}
		
		try {
			Decoder encoder = Base64.getDecoder();
			return new String(cipher.doFinal(encoder.decode(target)));
		} catch (IllegalBlockSizeException e) {
			System.out.println("err");
		} catch (BadPaddingException e) {
	
		}
		return null;
	}
}

 

 결과는 아래와 같습니다.