安卓密钥库中的Spongy Castle RSA加密/解密

7

我尝试使用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)
}
1个回答

5
使用由AndroidKeyStore管理的密钥,无法使用BC/SC进行解密,因为私钥内容受到保护,其参数(如私有指数)被隐藏,因此任何尝试使用该密钥初始化密码器的操作都将失败。
使用SC时出现的错误信息No provider for RSA/ECB/OAEPwithSHA-512andMGF1Padding可能是库错误处理不当造成的,但BC出现的private exponent cannot be extracted错误则很明显。加密可以正常工作,因为它使用未受保护的公钥。
您需要使用AndroidKeyStore进行解密(或使用SC/BC生成密钥)。

谢谢,看起来我对这些密钥和密码如何相互配合的理解有点天真。 我现在要通过SC尝试生成这些密钥,并将它们存储/检索到Keystore中作为PrivateKeyEntry或类似物。你有没有任何关于如何实现这一点的参考资料? 在线上似乎找不到很多例子,可能最终只能回到试错。 - Mark Bergin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接