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

gop*_*her 8 encryption android elliptic-curve kotlin

我需要使用 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
Run Code Online (Sandbox Code Playgroud)

div*_*eek 8

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

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

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

(就其价值而言,我是拥有 AndroidKeyStore 的 Google 工程师。几年来我一直计划添加 ECDH 支持,但它总是被其他被认为具有更高优先级的功能抢占先机。我会得到尽管如此。)


kel*_*aka 1

不建议使用公钥加密进行加密。一般做法是混合加密,其中交换分组密码密钥,然后执行对称加密。

密钥交换后最常见的问题是身份验证和完整性。现代实践是使用经过身份验证的加密模式,如 AES-GCM。GCM 模式为您提供身份验证和完整性。你可以在这里看到一个实现