【发布时间】:2022-01-24 18:17:50
【问题描述】:
大家好,我有一个使用加密和 JWT 的应用。
我在我的 Pixel 5 OS12 设备上进行了测试,没有任何问题。我刚刚在我的新 Pixel 6 Pro 上进行了测试,我得到了一个糟糕的填充异常?
javax.crypto.BadPaddingException: 错误:04000089:RSA 例程:OPENSSL_internal:PKCS_DECODING_ERROR
设备发送我需要解码的 base64 字符串,然后用我的私钥解密 RSA
val decoded = android.util.Base64.decode(full, android.util.Base64.NO_WRAP)
fun decryptByPrivateKey3(encryptedData: ByteArray?): ByteArray? {
val privateKey = getKeyFromString()
return try {
val cipher1: Cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
cipher1.init(Cipher.DECRYPT_MODE, privateKey)
cipher1.doFinal(encryptedData)
} catch (e: java.lang.Exception) {
Timber.d("Error Decrypting Key $e")
null
}
}
奇怪的原因是它是标准代码。如果我删除了 RSA/ECB/PKCS1Padding,它会通过,但会导致我的 JWT 签名出现问题。(因为这是秘密消息)
任何人在不同的手机上对此有疑问?
【问题讨论】:
-
您确认
privateKey和encryptedData在这两种情况下是相同的吗? -
加密数据作为base64解码接收,然后用RSA和私钥解密。在我的像素 5 上,没有任何问题像魅力一样发挥作用,但在我的像素 6 pro 甚至三星 s9 等其他设备上,我得到了一个糟糕的填充异常。设备使用 rsa public 对其进行签名,我使用与设备相同的密钥对中的私有 rsa 密钥解密
-
您能否发布一个示例私钥和密文,该示例在一台设备上有效,而在另一台设备上无效?还有
getKeyFromString()的实现。 -
实际上你是对的。我猜每个设备的键都会改变..因为使用我的像素总是相同的键。我检查了我的数据库,它根本不一样。经过测试,它工作正常。谢谢!