我执行下面的命令来我的机器上生成密钥对的ECDSA: openssl ecparam -genkey -name secp256k1 -noout -outform DER -out private.key
和执行下一个命令openssl ec -inform DER -in private.key -noout -text
,我得到下面的输出:如何在java中生成与openssl生成的相同类型的ecdsa密钥对?
read EC key
Private-Key: (256 bit)
priv:
//private key
pub:
04:64:0a:f7:e6:e1:a9:7f:d3:b2:ec:ad:f1:41:96:
ee:c1:c2:e7:02:4a:54:42:ab:e8:da:9f:88:e1:02:
46:aa:32:91:38:b5:9e:37:fc:96:d9:36:02:07:de:
74:59:c4:a8:e0:2b:21:3a:d4:70:7d:5e:92:54:22:
65:80:0f:df:fd
ASN1 OID: secp256k1
现在我很感兴趣的是,上述公开没有冒号的键即04640af7e6e1a97fd3b2ecadf14196eec1c2e7024a5442abe8da9f88e10246aa329138b59e37fc96d9360207de7459c4a8e02b213ad4707d5e92542265800fdffd
。我需要将这个公钥发送给api调用,以确认密钥是否有效。当通过api调用发送时由openssl
生成的密钥被服务器接受为有效。
但是,在使用api调用发送时,在java中生成的公共ecdsa密钥被拒绝。我用下面的代码来生成密钥对
public KeyPair getECDSAKeyPair() throws NoSuchProviderException, NoSuchAlgorithmException,
InvalidAlgorithmParameterException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "SC");
ECGenParameterSpec spec = new ECGenParameterSpec("secp256k1");
keyPairGenerator.initialize(spec, new SecureRandom());
return keyPairGenerator.generateKeyPair();
}
public String getHexPublicKeyString(KeyPair keypair) {
PublicKey publicKey = keypair.getPublic();
return Hex.toHexString(publicKey.getEncoded());
}
我的问题是我怎么能产生相同类型的ECDSA密钥对由OpenSSL的产生? OpenSSL生成的密钥和java生成的代码之间有什么区别,这样OpenSSL生成的密钥被接受,而java生成的密钥被拒绝?
*“我感兴趣的是没有冒号......上述公钥” * - 它管道'TR '或'sed'去除冒号和空格。另请参阅OpenSSL wiki上的[Elliptic Curve Cryptography](https://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography)。 – jww
我的意思是如何在java中创建相同类型的密钥? – Harry
也许这会帮助:[我如何从EC公钥对象中获取PublicKey对象?](http://stackoverflow.com/q/26159149)。问题是,你有一个来自Java和OpenSSL的EC密钥。您似乎在演示细节方面存在问题,但您还没有告诉我们您需要什么格式。 'openssl ec -inform DER -in private.key -noout -text'创建另一种表示格式。你为什么不告诉我们API期望的格式?它将成为(1)PEM或(2)DER(可选编码,如十六进制或Websafe Base64);和(3)publicKey或(4)subjectPublicKeyInfo。 – jww