根据维基百科,ECDSA 中的公钥是私钥(随机数)乘以椭圆曲线 C 上的某个基点 G。而且我们在签名和验证中都使用了 C。
我可以使用一些 G1 和 C1 生成公钥,使用其他曲线 C2 进行签名和验证吗?
我知道这听起来很奇怪,但我的实际目标是在 ECDSA 中使用 GOST 私钥(我已经拥有它们并且必须使用它们)。因此,GOST public 可能是从特殊的 C1、G1 和 JavaSHA256withECDSA
可能使用其他知道的曲线生成的。
- 如何检测曲线使用的
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA", "BC");
? 如果签名和验证返回 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
可能不相等,这就是我问这个问题的原因。
更新
回答
我可以使用一些 G1 和 C1 生成公钥,使用其他曲线 C2 进行签名和验证吗?
不,C1 必须等于 C2。
检测 BC 曲线是可能的——我查看了 BC 的 SignatureSpi 源,发现曲线参数取自密钥。并发现 C2 等于已知 C1。换句话说,不是,SHA256withECDSA
而是prKey.getAlgorithm()
决定。
但!!密钥的兼容性并不意味着使用它是安全的。GOST 曲线具有特殊的不变量,可能会影响某些 ECDSA 步骤 - 这是一个有趣但非常困难的问题 - ECDSA 中是否存在 GOST 曲线的任何弱点。所以,答案是“兼容但在使用前仔细检查数学人员”
请注意,KBKDF 不会从 ECDSA 中的 GOST 曲线弱点中拯救出来(如果它确实存在于“数学-加密-场景”后面)