android - 使用 RSA OAEP 解密的 Android 上的 MGF1 不支持 SHA-256 摘要?
问题描述
我正在使用一种协议,该协议使用一种创建 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 加密消息的算法。例如,这个Apple 算法。
我有以下代码
class RsaOaep {
private val cipher = Cipher.getInstance(transformation)
companion object {
// Results in "RSA/ECB/OAEPWithSHA-256AndMGF1Padding"
private const val transformation = "$KEY_ALGORITHM_RSA/$BLOCK_MODE_ECB/$ENCRYPTION_PADDING_RSA_OAEP"
// Note that MGF1ParameterSpec.SHA256 is not supported on Android!!!
private val spec = OAEPParameterSpec("SHA-256","MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT)
}
fun wrap(publicKey: Key, data: ByteArray): ByteArray {
val secretKey = SecretKeyGenerator().generateSecretKey()
cipher.init(Cipher.WRAP_MODE, publicKey, spec)
return cipher.wrap(secretKey)
}
fun decrypt(wrappedKey: ByteArray, privateKey: Key): ByteArray {
cipher.init(Cipher.UNWRAP_MODE, privateKey, spec)
return cipher.unwrap(wrappedKey, SecretKeyGenerator.KEY_ALGORITHM, Cipher.SECRET_KEY)
}
}
但我的 Android 应用程序无法解密它们。我收到以下错误。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example, PID: 9813
java.security.InvalidAlgorithmParameterException: Unsupported MGF1 digest: SHA-256. Only SHA-1 supported
at android.security.keystore.AndroidKeyStoreRSACipherSpi$OAEPWithMGF1Padding.initAlgorithmSpecificParameters(AndroidKeyStoreRSACipherSpi.java:228)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:147)
at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2980)
at javax.crypto.Cipher.tryCombinations(Cipher.java:2891)
at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2796)
at javax.crypto.Cipher.chooseProvider(Cipher.java:773)
at javax.crypto.Cipher.init(Cipher.java:1288)
at javax.crypto.Cipher.init(Cipher.java:1223)
at com.example.RsaOaep.decrypt(RsaOaep.kt:21)
此限制被硬编码到Android 源代码中。
- 为什么会这样?
- 什么时候会改变?... 和
- 我该如何解决它?
解决方案
推荐阅读
- python - Python tkinter 在类或帧之间传递变量
- c# - 以编程方式获取 BIOS 引导菜单键
- python - Geoviews + Datashader在投影点时很慢
- mysql - 未来预期销售查询的功能将不会运行 - MySQL
- powershell - 如何捕获异常以使异常消息不在控制台上打印?
- python - Python CSV 文件读取和保存
- c# - 相关删除性能问题
- machine-learning - 正在寻找合适的方法来根据残差或预测误差检查模型的优劣?
- regex - 使用 Perl 打印整个字符串,直到出现子字符串匹配
- google-app-engine - 如何思考微服务?