android - 如何使用 secp256r1 类型的椭圆曲线密钥对在 Android 中加密和解密数据?
问题描述
我需要使用 NIST P-256 椭圆曲线来加密和解密数据。现在我已经生成了密钥对,但是如何使用它们来加密和解密呢?
官网只说如何使用这个ec密钥对来签名/验证,但是我想知道如何使用这个ec密钥对来加密/解密。
生成 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
解决方案
AndroidKeyStore 目前不支持使用 EC 密钥进行加密或解密,仅支持使用 RSA 密钥。
要使用 EC 密钥进行加密,您需要使用 ECDH 和密钥派生函数 (KDF) 来计算可用于数据的共享对称密钥,或者使用在内部执行此操作的 ECIES。但从 Android 10 开始,AndroidKeyStore 不支持这两种操作模式。也许在 Android 11 中。
目前,您可以使用具有适当填充模式(推荐 OAEP)的 RSA 来加密您的对称密钥,也可以使用本机 Java 加密提供程序。不幸的是,这不会使用安全硬件来生成、存储或使用密钥,而是会在您的应用程序的进程空间中执行所有这些操作。这里有一个例子。
(对于它的价值,我是拥有 AndroidKeyStore 的 Google 工程师。几年来我一直计划添加 ECDH 支持,但它总是被其他被认为更高优先级的功能抢先。我会得到不过。)
推荐阅读
- java - Spring Boot Tomcat 不会在特定端口上启动
- css - Css动画:用颜色从左到右填充一个div
- r - R中的F_meas中的错误'输入数据必须具有相同的两个级别'?
- access-token - 无法使用新的基本 Instagram API 获取 Instagram 访问令牌
- flutter - ChangeNotifierProxyProvider 构建器与更新问题
- sapui5 - 必需的模块缺少方法
- python - 定义 DQN 的输出大小
- flutter - Flutter TextField 输入在保存/完成后不会消失
- python - 有没有办法在 python 中为不和谐机器人导入带有装饰器的函数
- rspec - Rails 5.0 升级中的 Rails 功能测试失败