반응형
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Component;
public class AES256 {
//AES256은 256bit=32byte의 암호화 키가 필요함.
private final String key = "1234567890123456789012";
private final String iv = key.substring(0, 16); // 16byte의 초기화벡터값
//암호화메소드
public String encrypt(String plainText) throws Exception {
//암호화 모드는 CBC를, 패딩은 PKCS5을 사용
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
c.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);
byte[] encrypted = c.doFinal(plainText.getBytes("UTF-8"));
//base64로 인코딩
return String(Base64.encodeBase64(encrypted));
}
//복호화메소드
public String decrypt(String cipherText) throws Exception {
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
c.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);
byte[] decodedBytes = Base64.decodeBase64(cipherText);
byte[] decrypted = c.doFinal(decodedBytes);
return new String(decrypted, "UTF-8");
}
}
* 패딩
암복호화 할 때 인풋이 암호 블럭 사이즈의 배수와 맞지 않는 경우 배수에 맞춰 빈공간을 채우는 것을 패딩이라고 함.
* IV
CBC모드에서 최초의 평문블록을 암호화 할 때 '한 단계 앞의 암호문블록' 역할을 할 비트열
패딩 참고
반응형
'코딩 관련 > Java' 카테고리의 다른 글
[JAVA] SHA256 해시 암호화 Util (0) | 2022.03.23 |
---|---|
[JAVA] 위경도 변환 / 위경도 거리 계산 / 위경도 연산 / 위경도 거리 구하기 / 위경도 좌표 구하기 (0) | 2022.03.21 |
[JAVA] response entity, api 데이터 조회, api json 데이터 작업 (0) | 2021.12.17 |
[JAVA] file.delete 안됨 / file 삭제 / java 디렉토리 삭제 / java 파일 삭제 / java 파일 삭제 안 됨 / try catch / try with resources (0) | 2021.11.12 |
[Java] 현재 경로 / 디렉터리 경로 / 현재 디렉터리 / 디렉터리 내용 출력 (0) | 2021.11.09 |