I get a BadPaddingException when trying to decrypt some encrypted data. The byte array is 128 bytes when the data is encrypted (before converting to base64) and it's also 128 bytes when converting the encrypted data from base64, so this part seems correct.
fun encryptWithRSA(dataToEncrypt: String): String { val modulus = BigInteger("F70F9BC271DD6ED93EE9...F29901", 16) val pubExp = BigInteger("010001", 16) val keyFactory = KeyFactory.getInstance("RSA") val pubKeySpec = RSAPublicKeySpec(modulus, pubExp) val key: RSAPublicKey = keyFactory.generatePublic(pubKeySpec) as RSAPublicKey val cipher = Cipher.getInstance("RSA/ECB/NoPadding") cipher.init(Cipher.ENCRYPT_MODE, key) val encryptedBytes = cipher.doFinal(dataToEncrypt.toByteArray()) val encryptedData = Base64.getEncoder().encodeToString(encryptedBytes) return encryptedData } fun decryptWithRSA(dataToDecrypt: String): String { val PRIVATE_RSA_KEY_PKCS8 = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAPcPm8Jx3W7ZPulQ\n" + "..." + "g4Ba8WBhgQ7D/tCAww4l8VhyGJm5/88O+xq2Kr69RIHcWTvhck76n08CQQDSPVB6\n" + "+MhX/txtOjY8Y+FOFXOeb0EIMhaMQR02+3+wIbN/IMJUyz2Eq/mDX8oX8BwMGlah\n" + "WSWouLwHaZFcDn7Q" val keySpec = PKCS8EncodedKeySpec(parseBase64Binary(PRIVATE_RSA_KEY_PKCS8)) val keyFactory = KeyFactory.getInstance("RSA") val privateKey = keyFactory.generatePrivate(keySpec) val cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding") cipher.init(Cipher.DECRYPT_MODE, privateKey) val bytes = Base64.getDecoder().decode(dataToDecrypt) val decryptedBytes = cipher.doFinal(bytes) val decryptedData = Base64.getEncoder().encodeToString(decryptedBytes) return decryptedData } Here's the full exception log:
javax.crypto.BadPaddingException: Decryption error at sun.security.rsa.RSAPadding.unpadOAEP(RSAPadding.java:502) at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:296) at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363) at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389) at javax.crypto.Cipher.doFinal(Cipher.java:2164) at dev.wirespec.security.Encryption.decryptWithRSA(Encryption.kt:162) at dev.wirespec.services.accounts.AccountsServlet$doGet$1.invokeSuspend(AccountsServlet.kt:31) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594) at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:740)