使用RSA解密时出现BadPaddingException

Android开发

尝试解密某些加密数据时收到BadPaddingException。数据加密时(转换为base64之前),字节数组为128字节;从base64转换加密的数据时,字节数组也为128字节,因此这部分看起来是正确的。

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
}

这是完整的异常日志:

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)
艾曼·阿里夫(Ayman Arif)

Encrpyt和Decrypt中的填充参数不匹配:

encryptWithRSA()方法中是:

val cipher = Cipher.getInstance("RSA/ECB/NoPadding")

decryptWithRSA()方法中是:

val cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding")

选择一种填充类型进行加密和解密,它应该可以工作。

注意:正如Dave所指出的,没有密码夹是一个严重的安全漏洞,因此最好将其包含在密码中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从其他客户端解密RSA时出现BadPaddingException

使用相同密钥解密AES时出现BadPaddingException

javax.crypto.BadPaddingException:解密错误使用Java RSA加密时,

javax.crypto.BadPaddingException:当我尝试使用私钥解密RSA字符串时发生解密错误

解密时的AES BadPaddingException

尝试解密指纹API密码时出现BadPaddingException

我在解密使用RSA生成的公共密钥(.jks)编码的128位AES密钥时遇到BadPaddingException

解密RSA数据Java时出错:javax.crypto.BadPaddingException:解密错误

RSA解密期间的javax.crypto.BadPaddingException

在C#中使用RSA加密和Java中的解密时出现填充错误

使用OpenSSL rsa密钥解密时出错

AES256 OpenSSL C++ 和 Java 加密:解密时出现 BadPaddingException

RSA OAEP,Golang加密,Java Decrypt -BadPaddingException:解密错误

使用RSA / PEM文件解密测试消息时出错

尝试使用RSA解密时,密钥不存在

尝试使用私钥解密消息时,node-rsa错误

使用 XML 私钥解密 RSA

使用 RSA 公钥解密

不使用密钥的RSA解密

使用Facebook隐藏解密文件时出现OutOfMemoryException

尝试使用openssl解密文件时出现错误

在 C 中使用 openssl 解密时出现分段错误

使用加密进行解密时,使用节点 js 出现错误的解密错误

BadPaddingException:解密错误

使用SSL连接到Tibco EMS时出现javax.crypto.BadPaddingException

Java中的RSA BadPaddingException-在Android中加密在JRE中解密

执行RSA解密时无效的密文

错误decrjavax.crypto.BadPaddingException:给定最终块未正确填充。如果在解密过程中使用了错误的密钥,则会出现此类问题

使用RSA解密字符串时,开头会返回其他零