【问题标题】:How to encrypt and decrypt data in Android using the elliptic curve key pair of type secp256r1?如何使用 secp256r1 类型的椭圆曲线密钥对在 Android 中加密和解密数据?
【发布时间】:2019-07-18 05:22:18
【问题描述】:

我需要使用 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

【问题讨论】:

  • 遵循建议。使用 ECC 密钥交换,请参阅 ECHKE,然后使用 AES 等分组密码进行加密。
  • @kelalaka,请问您有推荐的文档链接或代码示例吗?对不起,我是android新手,所以我必须要求更多信息。
  • 这与安卓无关。这是密码学中的一般做法。查看实现here
  • 如果您满意,您能接受并关闭这个问题吗?

标签: android encryption kotlin elliptic-curve


【解决方案1】:

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

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

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

(无论如何,我是拥有 AndroidKeyStore 的 Google 工程师。几年来我一直计划添加 ECDH 支持,但它总是被其他被认为具有更高优先级的功能抢先。不过我会解决的。)

【讨论】:

  • 我需要你的帮助question
  • 感谢@divegeek,我也在寻找类似的东西可以使用。我需要使用 ECIES,我搜索了很多,但找不到任何有用的页面。任何对它的参考,让我自己如何实现它都会有很大的帮助。干杯!
  • @divegeek EC 现在似乎受支持了? developer.android.com/training/articles/keystore
  • @Ixx 不,仍然不受支持。那篇文章中有什么暗示它是的吗?如果是这样,请指出,以便我可以修复文章。计划为 Android 12 提供 ECDH 支持,我认为这次它会落地。但不能保证 :-)
  • 2022 年还支持 ECDH 吗?
【解决方案2】:

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

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

【讨论】:

  • 谢谢,它确实解决了我的问题。本来想用公钥加密aes密钥交换对称密钥,因为找不到ecdh算法!!
猜你喜欢
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
相关资源
最近更新 更多