Java AES-256 양방향 암호화
AES-256은 Advanced Encryption Standard의 줄임말로, 256비트 길이의 키를 사용하는 암호화 알고리즘입니다.
주로 외부 사이트에 데이터를 주고 받을 때 많이 사용합니다.
AES 암호화의 종류는 AES-128, AES-192, AES-256이 있습니다.
이중에 사용할 암호화는 AES-256 입니다.
예전 프로젝트 자바 버전이 낮을경우를 생각해서 Java 1.8 이상 이하 예제를 공유합니다.
자바 1.8 이하
import
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.Key;
테스트
String str = "AES 암호화 테스트";
System.out.println("암호화 : "+this.aesEncode(str));
System.out.println("복호화 : "+this.aesDecode(this.aesEncode(str)));
1. 암호화
public String aesEncode(String str) throws UnsupportedEncodingException {
if (str == null) {
return "";
}
String key = "123456789ABCDEF!"; // 서로 정한 암호 키
String 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);
Key keySpec = new SecretKeySpec(keyBytes, "AES");
String encStr = str;
try {
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"));
encStr = new String(Base64.encodeBase64(encrypted)); // base64 인코딩
} catch (Exception e) {
e.printStackTrace();
}
return encStr;
}
2. 복호화
public String aesDecode(String str) throws UnsupportedEncodingException {
if (str == null) {
return "";
}
String key = "123456789ABCDEF!";
String 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);
Key keySpec = new SecretKeySpec(keyBytes, "AES");
String decStr = str;
try {
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes("UTF-8")));
byte[] byteStr = Base64.decodeBase64(str.getBytes());
decStr = new String(c.doFinal(byteStr),"UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return decStr;
}
결과
암호화 : +d5xDBbqj0IpXqA7KLRCGz0SIuPeIYyYnQwyh0erqUU=
복호화 : AES 암호화 테스트
자바 1.8 이상
import
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
테스트
public void aesTest() throws Exception {
String str = "AES 암호화 테스트";
System.out.println("암호화 : "+this.aesEncode(str));
System.out.println("복호화 : "+this.aesDecode(this.aesEncode(str)));
}
1. 암호화
public String aesEncode(String str) throws Exception {
String algorithm = "AES/CBC/PKCS5Padding";
String key = "123456789ABCDEF!"; // 서로 정한 키
IvParameterSpec iv = new IvParameterSpec(key.substring(0, 16).getBytes());
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv);
byte[] encrypted = cipher.doFinal(str.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encrypted);
}
2. 복호화
public String aesDecode(String str) throws Exception {
String algorithm = "AES/CBC/PKCS5Padding";
String key = "123456789ABCDEF!";
IvParameterSpec iv = new IvParameterSpec(key.substring(0, 16).getBytes());
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv);
byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(str));
return new String(decrypted, "UTF-8");
}
결과
암호화 : +d5xDBbqj0IpXqA7KLRCGz0SIuPeIYyYnQwyh0erqUU=
복호화 : AES 암호화 테스트
'공부 > JAVA' 카테고리의 다른 글
JAVA 문자열 뒤집기 (0) | 2024.03.04 |
---|---|
String 기능 모음 (0) | 2024.03.04 |
for 문 종류 및 방법 (0) | 2024.02.12 |
java 특정 날짜 요일 구하기, 날짜 하루 더하기 뺴기 (2) | 2017.01.11 |
CSV 파일 읽어오기 (0) | 2015.12.17 |