오류 내용
RSA 2048 크기의 Key로 큰 사이즈의 데이터를 암호화를 할 경우 발생
Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:346)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:391)
at javax.crypto.Cipher.doFinal(Cipher.java:2168)
at RSA.encrypt(RSA.java:58)
at Main.main(Main.java:18)
오류 원인
RSA 알고리즘에서 2048 크기의 Key로는 256바이트 이하만 암호화 가능
해결 방법
아래 링크에 해결방법 나와 있음
해결 예시
평문을 AES로 암호화 하고, AES KEY값을 RSA로 암호화 하고 상대에게 암호문(AES암호화) + AES_KEY(RSA암호화)를 전달하는 형태로 구현
// 평문
String originData = "Lorem stra, ................... per inceptos himenaeos.";
byte[] plainText = originData.getBytes();
System.out.println("원본 : " + originData);
///////////// 암호화 과정 /////////////
// AES로 평문 암호화
Key aeskey = AES.generateKey();
String dataAesBase64 = AES.encrypt(plainText, aeskey);
// RSA 개인키로 AES_KEY 암호화
String AesKeyRsaBase64 = RSA.encrypt(aeskey.getEncoded(), Cert.PRIVATE_KEY);
// 상대에게 DATA(AES암호화) + AES_KEY(RSA암호화) 형태로 전달
Map<String, Object> map = new HashMap<String, Object>();
map.put("ENC_DATA", dataAesBase64);
map.put("ENC_AES_KEY", AesKeyRsaBase64);
String encTotalData = map.toString();
System.out.println("암호문 : " + encTotalData);
///////////// 암호화 과정 끝 /////////////
///////////// 복호화 과정 /////////////
// RSA 공개키로 AES_KEY 복호화
String aesKeyRsaBase64 = (String) map.get("ENC_AES_KEY");
String aesKeyBase64 = RSA.decrypt(aesKeyRsaBase64, Cert.PUBLIC_KEY);
// AES로 DATA 복호화
byte[] aesKeyByte = Base64.getDecoder().decode(aesKeyBase64);
SecretKey aesKey = new SecretKeySpec(aesKeyByte, 0, aesKeyByte.length, "AES");
String dataBase64 = AES.decrypt((String) map.get("ENC_DATA"), aesKey);
String resultData = new String(Base64.getDecoder().decode(dataBase64));
System.out.println("복호화 : " + resultData);
///////////// 복호화 과정 끝 /////////////
'개발' 카테고리의 다른 글
React spreadsheet 조사 (0) | 2021.10.30 |
---|---|
Current request is not of type [org.springframework.web.multipart.MultipartHttpServletRequest] (0) | 2021.03.24 |
JAVA object to byte[] 변환 방법 (0) | 2021.01.30 |
JAVA RSA invalid key format 오류 (0) | 2021.01.24 |
openssl, java에서 RSA 개인키, 공개키 생성, 전자서명 방법 (0) | 2021.01.24 |