Mar*_*gin 6 encryption android bouncycastle kotlin spongycastle
尝试使用SpongyCastle为RSA/ECB/OAEPwithSHA-512andMGF1Padding所有受支持的Android设备版本上的非对称加密/解密任务提供首选加密算法并出现问题.
加密似乎工作正常.但解密证明有些麻烦:
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()
Run Code Online (Sandbox Code Playgroud)
我现在从keyStore中获取此值并尝试将其用于解密/加密:
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()
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但解密是我的问题所在:
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.
}
Run Code Online (Sandbox Code Playgroud)
初始化decryptionCipher给了我:
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)
}`
Run Code Online (Sandbox Code Playgroud)
您不能使用 BC/SC 使用由管理的密钥进行解密,AndroidKeyStore因为私钥内容受到保护并且其参数(例如私有指数)是隐藏的,因此任何使用该密钥初始化密码的尝试都将失败。
No provider for RSA/ECB/OAEPwithSHA-512andMGF1Padding使用 SC的错误消息可能是由于库的错误处理不正确,但private exponent cannot be extractedBC的错误是明确的。加密之所以有效,是因为它使用不受保护的公钥。
您需要AndroidKeyStore用于解密(或也使用 SC/BC 来生成密钥)。
| 归档时间: |
|
| 查看次数: |
857 次 |
| 最近记录: |