Android에서 RSA 암호화 후 암호화한 데이터를 서버로 보내서 복호화를 하려고 하는데 계속해서 오류가 났다,,,
BadPaddingException: Decryption error
나 같은 경우에는 클라이언트에서 RSA 키 쌍 생성 후에 공개 키(Public Key)는 서버에 저장,
개인 키(Private Key) 는 암호화 후 클라이언트에 저장을 했다.
공개 키나 암호화 한 데이터를 전달할 때 인코딩하면서 문제가 생긴건가 싶어서 Android 와 서버에서의 값을
모두 비교해봤지만 전부 동일했고, 심지어 Android 에서 바로 복호화 했을 때는 정상적으로 복호화가 되었다...!
[Android]
public static String encrypt(String plainText, String strPrivateKey) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] bytePrivateKey = Base64.decode(strPrivateKey, Base64.NO_WRAP);
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(bytePrivateKey);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
return Base64.encodeToString(encryptedBytes, Base64.NO_WRAP);
}
[Server]
public static String decrypt(String encryptedText, String strPublicKey) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] bytePublicKey = Base64.getDecoder().decode(strPublicKey);
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(bytePublicKey);
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText.getBytes());
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes);
}
진짜.. 다를 게 없는데 복호화시 오류가 나서 이것저것 삽질하느라 시간을 많이 썼는데 결국 아래처럼 코드 수정 후 해결했다.
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
해결책은 형식을 명시적으로 지정하는 것... 하루 꼬박 날린 것 같은데 나와 같이 삽질하는 사람이 없길 바라면서 글을 작성한다😢