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


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


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

最佳答案

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

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

因此,如果为"RSA"密钥对生成器生成了EC密钥,则可以肯定地确定它与为"EC"密钥对生成的密钥完全相同。只需通过执行EC签名生成/验证或(稍微复杂一点)密钥协议进行测试即可。



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

如果Android密钥存储无法处理SecureRandom,则底层实现可能会忽略。

我这里没有这些Android版本。



注意,给定的生成EC密钥的方法可以被认为是黑客。而且由于Android 5 / API 22距今已有5年之久,因此您可以问问自己是否仍要支持这些版本。

另外,您可以使用Bouncy Castle完全在软件中生成EC密钥对,但随后不涉及Android密钥存储来确保密钥的安全。

10-08 19:13