我在这篇文章中读过: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密钥存储来确保密钥的安全。