【问题标题】:EC on Android 5安卓 5 上的 EC
【发布时间】:2019-09-21 10:03:59
【问题描述】:

我在这篇文章中读到:Generate elliptic curve KeyPair via KeyStore on API Level <23 有可能在 Android 5 上使用椭圆曲线。据此:

在 API 级别 23 之前,可以使用算法“RSA”的 KeyPairGenerator 生成 EC 密钥,该算法初始化 KeyPairGeneratorSpec,其密钥类型使用 setKeyType(String) 设置为“EC”。使用此方法无法指定 EC 曲线名称 - NIST P 曲线会根据请求的密钥大小自动选择。

我可以使用RSA,然后将密钥类型设置为EC。这两种方法有什么区别吗?当我使用 RSA 和 EC 作为密钥类型和 EC 时,最终会不会一样?

【问题讨论】:

  • KeyPairGenerator.getInstance( KeyProperties.KEY_ALGORITHM_EC) 与 KeyPairGenerator.getInstance( KeyProperties.KEY_ALGORITHM_RSA) 与 setKeyType("EC")

标签: android cryptography android-keystore elliptic-curve


【解决方案1】:

EC 密钥对与 RSA 完全不兼容。

这些特定曲线只有一种类型的 EC 密钥(尽管编码时同一点有不同的表示)。 ECDH(密钥协议)/ECIES 和 ECDSA 也完全相同。

所以如果为"RSA" 密钥对生成器生成了一个EC 密钥,您可以非常确定它与为"EC" 生成的那个在规范方面是相同的。只需通过执行 EC 签名生成/验证或 - 稍微复杂一些 - 密钥协商来进行测试。


您可以通过创建自己的确定性 SecureRandom 实现来进行测试,并要求 EC 实现使用它。这也是因为 EC 密钥对生成没有 RSA 密钥对生成器那么多的选择,所以算法实现很可能是相同的。因此,如果您从相同的值开始,那么它很可能会产生相同的密钥对。然后您可以比较公钥值或使用一个公钥来验证 other 私钥的签名。

如果 Android 密钥库无法处理,底层实现可能会忽略给定的 SecureRandom。

不过,我这里没有这些 Android 版本。


请注意,生成 EC 密钥的给定方法可以被认为是一种 hack。由于 Android 5 / API 22 是 5 年前的版本,您可以问问自己是否仍要支持这些版本。

或者,您可以使用 Bouncy Castle 在软件中完全生成 EC 密钥对,但 Android 密钥存储不会参与以确保您的密钥安全。

【讨论】:

    猜你喜欢
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2023-03-10
    • 2010-09-28
    • 2011-11-05
    相关资源
    最近更新 更多