【发布时间】:2021-12-19 07:34:05
【问题描述】:
我正在使用 ECDSA 的 C 和 Java 实现。 C 实现使用原始格式 - 32 字节私钥、64 字节公钥、64 字节签名。
我正在使用 Bouncy Castle 在 Java 中创建密钥:
public static KeyPair GenerateKeys() throws NoSuchAlgorithmException,
NoSuchProviderException, InvalidAlgorithmParameterException {
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1");
KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
g.initialize(ecSpec, new SecureRandom());
return g.generateKeyPair();
}
并希望将它们存储为字节数组,因为稍后我需要将它们导出到我的 C 应用程序。我注意到:
KeyPair vendorKeys = GenerateKeys();
for (byte byt : vendorKeys.getPublic().getEncoded()) {
System.out.println("byt: " + byt);
}
将返回公钥字节,但长度错误。我想这与格式有关,X.509 用于 PublicKey,PKCS#8 用于私有。寻求帮助,我发现 Java 中有一些类,例如 PKCS8EncodedKeySpec,它们应该可以帮助我获取原始密钥,但无法弄清楚如何去做。
【问题讨论】:
-
您应该能够将私钥和公钥分别转换为
ECPrivateKey和ECPublicKey,然后使用getD()和getQ()获取所需的参数。 -
@Topaco:如果你使用
org.bouncycastle.jce.interfaces中的那些;标准 JCE 不同。而BigInteger并没有为您提供固定大小的编码,甚至来自 BouncyECPoint的 X9.62 编码也不完全正确。但是,您可以使用 Bouncy '{hash}with{PLAIN-,CVC-}ECDSA' or SunEC 9+ '{hash}withECDSAinP1363format' 获得固定格式的 签名。 Michal:目前有几个关于将“原始”密钥进入 JCE的问题,但为了让它们最接近我能找到的是stackoverflow.com/questions/52299691和stackoverflow.com/questions/51347513。 -
@dave_thompson_085 - 我指的是 BouncyCastle(
getD()和getQ()被 BC 使用),但感谢您的澄清。我在回答中说得更清楚了。
标签: java bouncycastle ecdsa