带有 Android 密钥库的海绵城堡 RSA Encryption/Decryption
Spongy Castle RSA Encryption/Decryption with Android Keystore
正在尝试使用 SpongyCastle 为所有受支持的 Android 设备版本上的非对称 encryption/decryption 任务提供首选加密算法 RSA/ECB/OAEPwithSHA-512andMGF1Padding
,但出现问题。
加密似乎工作正常。
但是解密有点麻烦:
No provider for 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()
我现在从 keyStore 中获取这个值并尝试将其用于 decryption/encryption:
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.
}
初始化解密密码给我:
java.security.ProviderException: No provider for RSA/ECB/OAEPwithSHA-512andMGF1Padding
这很奇怪,因为我的密码实例返回正常并且加密工作正常。
还尝试将提供者指定为“BC”而不是“SC”,这给出了 private exponent cannot be extracted error
我认为这是设计使然。
尝试提供一种 不受 支持的算法会破坏密码初始化和通过 Provider SC doesn't provide xxx
进行的加密,所以给出了什么?
TLDR:加密密码与解密具有相同的提供者。但只有解密中断....
一定有什么我在这里遗漏的东西,但似乎无法确定。我已经为此工作了一段时间,非常感谢您的帮助!
编辑: 为了感兴趣,我通过以下方式提供 SpongyCastle:
init {
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME)
Security.addProvider(BouncyCastleProvider())
keyStore.load(null)
}
您无法使用 AndroidKeyStore
管理的密钥使用 BC/SC 进行解密,因为私钥内容受到保护并且其参数(例如私有指数)被隐藏,因此任何尝试初始化使用该密钥的密码将失败。
使用 SC 的错误消息 No provider for RSA/ECB/OAEPwithSHA-512andMGF1Padding
可能是由于库的错误处理不正确,但 BC 的 private exponent cannot be extracted
错误很明显。加密有效,因为它使用未受保护的 public 密钥。
您需要使用 AndroidKeyStore
进行解密(或者使用 SC/BC 也可以生成密钥)。
正在尝试使用 SpongyCastle 为所有受支持的 Android 设备版本上的非对称 encryption/decryption 任务提供首选加密算法 RSA/ECB/OAEPwithSHA-512andMGF1Padding
,但出现问题。
加密似乎工作正常。 但是解密有点麻烦:
No provider for 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()
我现在从 keyStore 中获取这个值并尝试将其用于 decryption/encryption:
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.
}
初始化解密密码给我:
java.security.ProviderException: No provider for RSA/ECB/OAEPwithSHA-512andMGF1Padding
这很奇怪,因为我的密码实例返回正常并且加密工作正常。
还尝试将提供者指定为“BC”而不是“SC”,这给出了 private exponent cannot be extracted error
我认为这是设计使然。
尝试提供一种 不受 支持的算法会破坏密码初始化和通过 Provider SC doesn't provide xxx
进行的加密,所以给出了什么?
TLDR:加密密码与解密具有相同的提供者。但只有解密中断.... 一定有什么我在这里遗漏的东西,但似乎无法确定。我已经为此工作了一段时间,非常感谢您的帮助!
编辑: 为了感兴趣,我通过以下方式提供 SpongyCastle:
init {
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME)
Security.addProvider(BouncyCastleProvider())
keyStore.load(null)
}
您无法使用 AndroidKeyStore
管理的密钥使用 BC/SC 进行解密,因为私钥内容受到保护并且其参数(例如私有指数)被隐藏,因此任何尝试初始化使用该密钥的密码将失败。
使用 SC 的错误消息 No provider for RSA/ECB/OAEPwithSHA-512andMGF1Padding
可能是由于库的错误处理不正确,但 BC 的 private exponent cannot be extracted
错误很明显。加密有效,因为它使用未受保护的 public 密钥。
您需要使用 AndroidKeyStore
进行解密(或者使用 SC/BC 也可以生成密钥)。