![](/img/trans.png)
[英]Android Pay: Public, Private Key Pair generation (Elliptic Curve with NISTP-256)
[英]Should elliptic curve for public key generation and signature computation be the same?
根据wiki ,ECDSA中的公钥是私钥(随机数)乘以椭圆曲线C上的某个基点G.并且我们在签名和验证中都使用了C.
我可以使用一些G1和C1进行公钥生成,使用其他曲线C2进行签名和验证吗?
我知道这听起来很奇怪,但我的实际目标是在ECDSA中使用GOST私钥 (我已经拥有它们并且必须使用它们)。 因此,GOST public可以从特殊的C1,G1和Java的SHA256withECDSA
生成SHA256withECDSA
可能使用其他知道的曲线。
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA", "BC");
使用的曲线Signature ecdsaSign = Signature.getInstance("SHA256withECDSA", "BC");
? 如果sign and verify返回true,是否表示我给ECDSA的GOST键与ECDSA兼容?
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA", "BC"); ecdsaSign.initSign(privateKeyGOST); ecdsaSign.update("aaaa".getBytes("UTF-8")); byte[] signature = ecdsaSign.sign(); Signature ecdsaVerify = Signature.getInstance("SHA256withECDSA", "BC"); ecdsaVerify.initVerify(publicKeyGOST); ecdsaVerify.update("aaaa".getBytes("UTF-8")); System.out.println(); System.out.println(ecdsaVerify.verify(signature)); //TRUE
注意,GOST密钥生成曲线和SHA256withECDSA
内部曲线可能不相等,这就是我问这个问题的原因。
UPDATE
回答
我可以使用一些G1和C1进行公钥生成,使用其他曲线C2进行签名和验证吗?
不,C1必须等于C2。
可以检测BC曲线 - 我在BC的SignatureSpi源中查看并看到了从键中获取的曲线参数。 并且发现C2等于已知的C1。 换句话说,不是SHA256withECDSA
而是prKey.getAlgorithm()
决定。
但!! 密钥的兼容性并不意味着使用它是安全的。 GOST曲线具有特殊的不变量,可能会对某些ECDSA步骤产生影响 - 这很有趣但很难提问 - 是否有ECDSA中GOST曲线的任何弱点。 所以,答案是“兼容,但在使用前仔细检查数学人员”
注意,KBKDF不能保存ECDSA中的GOST曲线弱点(如果它真的存在于“math-crypto-scenes”之后)
我会按顺序回答:
- 如何检测Signature使用的曲线ecdsaSign = Signature.getInstance(“SHA256withECDSA”,“BC”);
你不能,因为公钥和私钥应该包含参数,而不是算法。 但是,底层库仅支持某些曲线参数。 在Bouncy Castle的情况下,那些是F(p)和F(2 ^ m)曲线。 这些至少包括NIST和Brainpool曲线。
- 如果sign and verify返回true,是否表示我给ECDSA的GOST键与ECDSA兼容?
是的,你可以放心地假设。 如果情况并非如此,则验证会出现严重错误。 你现在可能已经明白这是因为C1 = C2。
请注意,您不应该使用这样的密钥,特别是如果密钥也用于GOST算法本身。 最好不要混合价值观。 您应该使用SHA-256的(最左边)字节而不是秘密密钥值(如果必须使用它)。 使用基于密钥的密钥派生函数(KBKDF)会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.