EC Android 5

EC on Android 5

我在这篇文章中读到: 可以在 Android 5 上使用椭圆曲线。据此:

Prior to API Level 23, EC keys can be generated using KeyPairGenerator of algorithm "RSA" initialized KeyPairGeneratorSpec whose key type is set to "EC" using setKeyType(String). EC curve name cannot be specified using this method -- a NIST P-curve is automatically chosen based on the requested key size.

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

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

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

因此 if"RSA" 密钥对生成器生成了一个 EC 密钥,您可以非常确定它与为 "EC"一个。通过执行 EC 签名生成/验证或稍微复杂一些的密钥协议来简单地进行测试。


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

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

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


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

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