*AES-256암호화(적용)
//AES-256 암호화
String encryptAES256(String bodyData, String clientKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
String iv = clientKey.substring(0,16);
Cipher cipher = Cipher.getInstance("AES/CBC//PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(clientKey.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] bytePlain = cipher.doFinal(bodyData.getBytes());
String encryptedText = Base64.encodeToString(bytePlain, Base64.NO_WRAP);
return encryptedText;
}
- AES-256 암호화를 수행
"bodyData"는 암호화할 평문 문자열이며, "clientKey"는 암호화에 사용할 비밀키입니다.
암호화는 CBC(Cipher Block Chaining) 모드를 사용하며, PKCS5 패딩으로 인코딩된 데이터를 처리합니다.
Cipher 클래스는 JCA(Java Cryptography Architecture)에서 제공하며, SecretKeySpec 클래스는 SecretKey 인터페이스를 구현한 구체 클래스입니다.
IvParameterSpec 클래스는 초기화 벡터(IV)를 구현합니다. 초기화 벡터는 암호화에서 사용되는 임의의 비밀값으로, 암호화된 데이터를 보안하고 무작위성을 증가시킵니다.
Cipher.init() 메소드를 사용하여 암호화 모드로 초기화하고, 암호화된 데이터를 byte 배열로 반환합니다. 이 byte 배열은 Base64로 인코딩되고, 인코딩 된 문자열이 반환됩니다.
-PKCS5 패딩
암호화된 데이터의 마지막 블록이 블록 크기에 맞지 않을 경우, 부족한 크기만큼 패딩을 추가하는 방식입니다. 패딩 값은 추가되는 바이트 수로 지정되며, 각 바이트의 값은 패딩 바이트 수와 같습니다.
예를 들어, 블록 크기가 16바이트이고 마지막 블록이 12바이트라면, 패딩 값으로 04 04 04 04를 추가합니다. 이렇게 함으로써, 마지막 블록도 16바이트로 맞춰지게 됩니다.
PKCS5 패딩은 PKCS7 패딩과 유사하게 동작하지만, 블록 크기가 8바이트인 DES 암호화에 적합한 PKCS5 패딩이 개발되었습니다. 하지만, 이후에는 블록 크기가 8바이트인 대부분의 암호화에서 PKCS7 패딩이 사용되고 있습니다.
*참고
https://shary1012.tistory.com/224
[android] 안드로이드 AES256 암호화 복호화 (feat. java)
암호화 방식이 많이 있지만, 자주 사용하는 방식중에 하나인 AES256 이다. [code] public class AES256Util { private String iv; private Key keySpec; public AES256Util(String key) throws UnsupportedEncodingException { this.iv = key.subst
shary1012.tistory.com
https://easy-coding.tistory.com/55
Android AES(128, 192, 256) 암복호화
AES 암복호화 key값의 길이에 따라 AES128, AES192, AES256 으로 구분됨 AES128 : 키값 16bytes AES192 : 키값 24bytes AES256 : 키값 32bytes 예제 코드(AES256) import android.util.Base64; import java.security.spec.AlgorithmParameterSpec;
easy-coding.tistory.com
*AES-256 암호화 및 복호화 샘플코드
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AES {
private static final String algorithm = "AES/CBC/PKCS5Padding";
private static final String key = "0123456789abcdef0123456789abcdef";
private static final String iv = "abcdef0123456789";
public static byte[] encrypt(byte[] plaintext) throws Exception {
Cipher cipher = Cipher.getInstance(algorithm);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
return cipher.doFinal(plaintext);
}
public static byte[] decrypt(byte[] ciphertext) throws Exception {
Cipher cipher = Cipher.getInstance(algorithm);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
return cipher.doFinal(ciphertext);
}
}
'+)기록 > 과제' 카테고리의 다른 글
정리사항 49 - byte[] to Base64 / Base64 인코딩 옵션 (0) | 2023.04.21 |
---|---|
정리사항 48 - 인텐트로 값 전달 및 화면 전환 / 문자열 특정 인덱스 값 변경 (0) | 2023.04.19 |
정리사항 46 - 비트맵이미지 BASE64변환 (0) | 2023.04.18 |
*암호화 공부 (0) | 2023.04.12 |
정리사항 45 - RSA암호화, 대칭키 생성 (0) | 2023.04.11 |