首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Android中使用secp256r1类型的椭圆曲线密钥对对数据进行加密和解密?

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

Stack Overflow用户
提问于 2019-07-18 13:22:18
回答 2查看 3.4K关注 0票数 8

我需要使用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密钥对代码:

代码语言:javascript
复制
        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
EN

回答 2

Stack Overflow用户

发布于 2019-08-24 08:36:44

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

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

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

(无论如何,我是拥有AndroidKeyStore的谷歌工程师。我计划添加ECDH支持已经有几年了,但它总是被其他被认为具有更高优先级的功能抢先一步。不过,我会找到它的。)

票数 10
EN

Stack Overflow用户

发布于 2019-07-18 17:49:46

加密时不建议使用公钥加密。通常的做法是混合加密,其中交换块密码密钥,然后执行对称加密。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57087599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档