'AES(Advanced Encryption Standard) 고급 암호화 표준'
AES는 암호화 및 복호화에 동일한 키를 사용하는 대칭키 알고리즘으로 높은 안전성과 빠른 속도로 인해 양방향 암호화에서 가장 많이 사용되는 방식이며, AES 암호화의 종류는 AES-128, AES-192, AES-256이 있으며 뒤에 붙은 숫자는 키의 길이를 의미한다. AES의 종류가 무엇이냐에 따라 Secret Key의 길이가 달라진다.
(128bit = 16byte, 192bit = 24byte, 256bit = 32byte)
암호화 : 'plain text -> pain bytes -> encrypt -> encrypted bytes -> encrypted base64 test'
복호화 : 'encrypted base64 text -> encrypted bytes -> decrypt -> plain bytes -> plain text'
AES 암호화에는 아래 네가지가 필요하다.
SecretKey, IV(Initialize Vector), Cipher Mode(EBC/CBC/...), Padding Mode(PKCS5/PKCS7/...)
AES는 암호화 알고리즘을 말하며, CBC는 해당 알고리즘으로 문자를 어떻게 암호화할건지를 말한다, 한글자씩 잘라서 할 수도있고, 문자전체를 암호화할 수도 있고 다양하다 CBC는 XOR연산을 통해 이전 암호문과 연산하는 방식이다. PKCS5는 padding 환경을 설정하는 것으로 블록암호는 단위로 나워져있기 때문에 전체글자를 암호화 하고 남은 글자에 공백? 등 의미없는 글자로 채워넣어서 오류가 안나게 해결해준다.
암호화 형식, 운영 모드, 패딩등 자세한건 검색해보자
암호화 : 알고리즘
운영 모드 : 적용 방식
패딩 : 남은 글자수에 채워넣기
key = abcdefghabcdefghabcdefghabcdefgh --> iv = abcdefghabcdefgh
@Component
public class Crypto {
public static String alg = "AES/CBC/PKCS5Padding";
private final String key = "abcdefghabcdefghabcdefghabcdefgh"; // 32byte
private String iv = "AD80FJK2I3DNN3FM"; // 16byte
public String encrypt(String value) {
try {
Cipher cipher = Cipher.getInstance(alg);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);
byte[] encrypted = cipher.doFinal(value.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encrypted);
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
public String decrypt(String value) {
try {
Cipher cipher = Cipher.getInstance(alg);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(),"AES");
IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);
byte[] decodedByte = Base64.getDecoder().decode(value);
byte[] decrypted = cipher.doFinal(decodedByte);
return new String (decrypted,"UTF-8");
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}