2016-05-20 36 views
0

我执行下面的命令来我的机器上生成密钥对的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生成的密钥被拒绝?

+0

*“我感兴趣的是没有冒号......上述公钥” * - 它管道'TR '或'sed'去除冒号和空格。另请参阅OpenSSL wiki上的[Elliptic Curve Cryptography](https://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography)。 – jww

+0

我的意思是如何在java中创建相同类型的密钥? – Harry

+0

也许这会帮助:[我如何从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

回答

0

我能够使用SpongyCastle产生通过以下方法所需的市民:

public static String getHexEncodedPublicKey(PublicKey publicKey) throws IOException, InvalidKeyException { 
    ECPublicKeyParameters ecPublicKeyParameters 
      = (ECPublicKeyParameters) ECUtil.generatePublicKeyParameter(publicKey); 
    byte[] encoded = ecPublicKeyParameters.getQ().getEncoded(false); 
    return Hex.toHexString(encoded); 
}