我在这篇文章中读过: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
。这两种方法之间有什么区别吗?当我将带有EC的RSA用作密钥类型和EC时,最终是否相同?
答案 0 :(得分:1)
EC密钥对与RSA完全不兼容。
对于这些特定曲线,只有一种EC键(尽管编码时同一点有不同的表示形式)。 ECDH(关键协议)/ ECIES和ECDSA的密钥也完全相同。
因此如果为"RSA"
密钥对生成器生成了EC密钥,您可以确定它在规范方面与为"EC"
生成的密钥相同。只需通过执行EC签名生成/验证或稍微复杂一点的密钥协议进行测试即可。
您可以通过创建自己的确定性 SecureRandom
实现进行测试,并要求EC实现使用该实现。这也是因为EC密钥对生成没有RSA密钥对生成器那么多的选择,因此算法实现很可能是相同的。因此,如果您从相同的值开始,则可能会产生相同的密钥对。然后,您可以比较公钥值或使用一个公钥来验证 other 私钥的签名。
如果Android密钥存储无法处理,则底层实现可能会忽略SecureRandom
。
我这里没有这些Android版本。
请注意,可以将给定的生成EC密钥的方法视为黑客。而且由于Android 5 / API 22距今已有5年之久,所以您可以问自己是否仍要支持这些版本。
或者,您可以使用Bouncy Castle在软件中完全生成EC密钥对,但是随后不涉及Android密钥存储来确保密钥的安全。