首页 > 解决方案 > 使用 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 源代码中。

标签: androidkotlincryptographyrsa

解决方案


推荐阅读