자바에서 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;
}
}
결과는 아래와 같습니다.
'기초 문법 > 자바' 카테고리의 다른 글
[Java] SSL and TrustStore and KeyStore 간단한 설명 및 예제 (0) | 2021.09.30 |
---|