在另一台计算机上导出并重新导入 ECDSA 私钥后,密钥会有所不同



我尝试从现有(大型(项目中导出ECDSA私钥并将其导入新项目 - 这样做之后密钥会有所不同。这是密钥最初生成的方式:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDSA", "BC");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256k1");
keyGen.initialize(ecSpec, random);
KeyPair keyPair = keyGen.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();

然后我得到 Byte 数组,将其转换为十六进制并将其传输到另一台机器:

byte[] privateKeyBytes = privateKey.getEncoded();
String keyString = getHexString(privateKeyBytes);

并在另一侧导入它:

KeyFactory fact = KeyFactory.getInstance("ECDSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(hexStringToByteArray(msg));
PrivateKey key = fact.generatePrivate(keySpec);

现在打印密钥(System.out.println(key((后,第一行有所不同:

Before:
EC Private Key [a7:3d:a5:d6:13:8f:42:d2:65:25:67:27:30:02:61:cb:1e:7a:1c:de]
After: 
EC Private Key [29:8c:4c:22:0a:eb:b4:2b:c0:2d:15:d6:52:dc:e1:df:c5:1f:05:6b]

而 X 和 Y 保持不变。我确认导入/导出后字节数组是相同的,这不包括getHexString/hexStringToByteArray。

我尝试使用相同的代码再次在第一台机器上导入密钥,这有效,也在第二台机器上生成一个新密钥并重新导入,也有效。只是组合会导致问题。

系统信息:java 版本:openjdk 版本"11.0.3" 2019-04-16(两台机器(,都是 Ubuntu 18.04 64 位

刚刚发现问题 - 第一台机器使用的是"自定义"bcprov,它的行为在某些方面有所不同。在第二台机器上使用它后,密钥匹配。

谢谢你的时间!

最新更新