我尝试使用SpongyCastle来为所有支持的Android设备版本提供首选加密算法RSA/ECB/OAEPwithSHA-512andMGF1Padding
以进行非对称加密/解密任务,但出现了问题。
加密似乎没有问题。 但是解密遇到了一些麻烦:
RSA/ECB/OAEPwithSHA-512andMGF1Padding
没有提供程序
KeyGen规范如下:
val generatorSpec = KeyPairGeneratorSpec.Builder(context)
.setAlias(ALIAS)
.setSubject(X500Principal(ASYMMETRIC_KEY_COMMON_NAME_PREFIX + ALIAS))
.setSerialNumber(BigInteger.TEN)
.setStartDate(creationDate.time)
.setEndDate(expiryDate.time)
.build()
val keyPairGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore")
keyPairGenerator.initialize(generatorSpec)
keyPairGenerator.generateKeyPair()
我现在正在从密钥库中获取此值,并尝试将其用于解密/加密:
private fun rsaEncrypt(data: ByteArray, key: KeyStore.PrivateKeyEntry): ByteArray {
val encryptionCipher = Cipher.getInstance("RSA/ECB/OAEPwithSHA-512andMGF1Padding", "SC")
encryptionCipher.init(Cipher.ENCRYPT_MODE, key.certificate.publicKey)
val outputStream = ByteArrayOutputStream()
val cipherOutputStream = CipherOutputStream(outputStream as OutputStream, encryptionCipher)
cipherOutputStream.write(data)
cipherOutputStream.close()
return outputStream.toByteArray()
}
这个看起来很正常,但是解密是我的问题所在:
private fun rsaDecrypt(data: ByteArray, key: KeyStore.PrivateKeyEntry): ByteArray {
val decryptionCipher = Cipher.getInstance("RSA/ECB/OAEPwithSHA-512andMGF1Padding", "SC")
decryptionCipher.init(Cipher.DECRYPT_MODE, key.privateKey)
// Rest of code for cipher streaming etc. etc.
}
初始化解密Cipher时出现以下错误:
java.security.ProviderException: RSA/ECB/OAEPwithSHA-512andMGF1Padding没有提供程序
这很奇怪,因为我的cipher实例返回正常,加密也正常工作。
我还尝试将提供程序指定为“BC”,而不是“SC”,这会导致无法提取私有指数错误
,我认为这是设计问题。
尝试使用不支持的算法将在Cipher初始化和Encryption上中断,通过Provider SC doesn't provide xxx
,那么是什么原因呢?
TLDR:加密Cipher与解密Cipher具有相同的提供程序。但只有解密会失败...... 一定有我漏掉的东西,但我想不到是什么。我已经在这上面工作了一段时间,所以任何帮助都将不胜感激!
编辑:出于兴趣,我正在提供SpongyCastle:
init {
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME)
Security.addProvider(BouncyCastleProvider())
keyStore.load(null)
}