如何在 java 中生成与 openssl 生成的相同类型的 ecdsa 密钥对?
How to generate same type of ecdsa keypair in java as generated by openssl?
我正在执行以下命令在我的机器上生成 ecdsa 密钥对:
openssl ecparam -genkey -name secp256k1 -noout -outform DER -out private.key
并在执行下一个命令 openssl ec -inform DER -in private.key -noout -text
时,我得到以下输出:
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
现在我感兴趣的是上面没有冒号的 public 键,即 04640af7e6e1a97fd3b2ecadf14196eec1c2e7024a5442abe8da9f88e10246aa329138b59e37fc96d9360207de7459c4a8e02b213ad4707d5e92542265800fdffd
。我需要将此 public 密钥发送到 api 调用,该调用验证密钥是否有效。 openssl
生成的密钥在与 api 调用一起发送时被服务器接受为有效。
但是在 java 中生成的 public ecdsa 密钥在与 api 调用一起发送时被拒绝。我正在使用以下代码生成密钥对
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());
}
我的问题是如何生成与 OpenSSL 生成的相同类型的 ECDSA 密钥对? OpenSSL 生成的密钥与 java 生成的代码有什么区别,OpenSSL 生成的密钥被接受而 java 生成的密钥被拒绝?
我能够使用 SpongyCastle 通过以下方法生成所需的 public:
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);
}
我正在执行以下命令在我的机器上生成 ecdsa 密钥对:
openssl ecparam -genkey -name secp256k1 -noout -outform DER -out private.key
并在执行下一个命令 openssl ec -inform DER -in private.key -noout -text
时,我得到以下输出:
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
现在我感兴趣的是上面没有冒号的 public 键,即 04640af7e6e1a97fd3b2ecadf14196eec1c2e7024a5442abe8da9f88e10246aa329138b59e37fc96d9360207de7459c4a8e02b213ad4707d5e92542265800fdffd
。我需要将此 public 密钥发送到 api 调用,该调用验证密钥是否有效。 openssl
生成的密钥在与 api 调用一起发送时被服务器接受为有效。
但是在 java 中生成的 public ecdsa 密钥在与 api 调用一起发送时被拒绝。我正在使用以下代码生成密钥对
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());
}
我的问题是如何生成与 OpenSSL 生成的相同类型的 ECDSA 密钥对? OpenSSL 生成的密钥与 java 生成的代码有什么区别,OpenSSL 生成的密钥被接受而 java 生成的密钥被拒绝?
我能够使用 SpongyCastle 通过以下方法生成所需的 public:
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);
}