首页 > 解决方案 > 如何使用 secp256r1 类型的椭圆曲线密钥对在 Android 中加密和解密数据?

问题描述

我需要使用 NIST P-256 椭圆曲线来加密和解密数据。现在我已经生成了密钥对,但是如何使用它们来加密和解密呢?

官网只说如何使用这个ec密钥对来签名/验证,但是我想知道如何使用这个ec密钥对来加密/解密。

网站:https ://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec#example:-nist-p-256-ec-key-pair-for-signingverification-using-ecdsa

生成 NIST P-256 密钥对代码:

        val kpg: KeyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore")
        val parameterSpec =
            KeyGenParameterSpec.Builder("container", KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
                .setAlgorithmParameterSpec(ECGenParameterSpec("secp256r1"))
                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA384, KeyProperties.DIGEST_SHA512)
                .build()
        kpg.initialize(parameterSpec)
        val keyPair = kpg.generateKeyPair()

        val ecPublicKey = keyPair.public as ECPublicKey
        val ecPrivateKey = keyPair.private as ECPrivateKey

标签: androidencryptionkotlinelliptic-curve

解决方案


AndroidKeyStore 目前不支持使用 EC 密钥进行加密或解密,仅支持使用 RSA 密钥。

要使用 EC 密钥进行加密,您需要使用 ECDH 和密钥派生函数 (KDF) 来计算可用于数据的共享对称密钥,或者使用在内部执行此操作的 ECIES。但从 Android 10 开始,AndroidKeyStore 不支持这两种操作模式。也许在 Android 11 中。

目前,您可以使用具有适当填充模式(推荐 OAEP)的 RSA 来加密您的对称密钥,也可以使用本机 Java 加密提供程序。不幸的是,这不会使用安全硬件来生成、存储或使用密钥,而是会在您的应用程序的进程空间中执行所有这些操作。这里有一个例子。

(对于它的价值,我是拥有 AndroidKeyStore 的 Google 工程师。几年来我一直计划添加 ECDH 支持,但它总是被其他被认为更高优先级的功能抢先。我会得到不过。)


推荐阅读