반응형
AES(Advanced Encryption Standard) 암호화는 대칭키를 쓰는 블록 암호화 방식이다.
암호화 Key에 값에 따라 AES-128, AES-192, AES-256으로 생성된다.
secretKey키의 길이에 따라서 AES-256, 24bit일 경우 AES-192, 16bit의 경우 AES-128로 암화화 되므로 주의해야 한다.입력을 받은 값으로 암호화를 할 경우 해당 자리수만큼의 값을 채우거나, 제거하는 방법 필요
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class AES256 {
final String secretKey = "01234567890123456789012345678912"; //32bit
final byte[] IV = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00 }; // 16bit
//암호화
public String encrypt(String str) throws Exception {
byte[] keyData = secretKey.getBytes();
SecretKey secureKey = new SecretKeySpec(keyData, "AES");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, secureKey, new IvParameterSpec(IV));
byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
String enStr = new String(Base64.encodeBase64(encrypted));
return enStr;
}
//복호화
public String decrypt(String str) throws Exception {
byte[] keyData = secretKey.getBytes();
SecretKey secureKey = new SecretKeySpec(keyData, "AES");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, secureKey, new IvParameterSpec(IV));
byte[] byteStr = Base64.decodeBase64(str.getBytes());
return new String(c.doFinal(byteStr), "UTF-8");
}
}
참고 AESConstants 에 설정된 KeySIZE, 길이가 틀린 경우 Key길이 오류 발생
com.sun.crypto.provider.AESConstants
package com.sun.crypto.provider;
interface AESConstants {
int AES_BLOCK_SIZE = 16;
int[] AES_KEYSIZES = new int[]{16, 24, 32};
}
참고
#aes #aes-256 #java
반응형
'FullStack > 21. Java' 카테고리의 다른 글
[Java] 다양한 싱글톤 생성 방법 (0) | 2021.05.10 |
---|---|
[Java] Exception getMessage, getLocalizedMessage (0) | 2021.03.31 |
[Java] Log Tail 기능 (0) | 2021.03.09 |
[MAVEN] 로컬 jar 참조하기 (0) | 2021.02.09 |
[Logback] 로그파일 경로 확인 방법 (0) | 2021.02.09 |