Я, выполнив следующую команду для создания ECDSA ключей на моей машине: openssl ecparam -genkey -name secp256k1 -noout -outform DER -out private.key
и на выполнение этой следующей команды openssl ec -inform DER -in private.key -noout -text
, я получаю следующий результат:Как сгенерировать такой же тип keypair ecdsa в java, как генерируется openssl?
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, который проверяет, является ли ключ действительным или нет. Ключ, созданный openssl
при отправке с вызовом api, принимается сервером как действительный.
Но общедоступный ключ ecdsa, сгенерированный в java при отправке с вызовом 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());
}
Мой вопрос, как я могу генерировать тот же тип ECDSA пары ключей, сгенерированный OpenSSL? И в чем разница между ключами, генерируемыми OpenSSL, и кодом, сгенерированным java, так что ключ, сгенерированный OpenSSL, принимается, тогда как ключ, сгенерированный java, отклоняется?
* «что я заинтересован в это выше открытом ключе без колонов ...» * - Pipe через 'тра 'или' sed', чтобы удалить двоеточия и пробел. Также см. [Эллиптическая кривая кривых] (https://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography) в вики OpenSSL. – jww
Я имею в виду, как создать тот же самый тип ключа в java ?? – Harry
Возможно, это поможет: [Как я могу получить объект PublicKey из байтов открытого ключа EC?] (Http://stackoverflow.com/q/26159149). Дело в том, что у вас есть ключ EC от Java и OpenSSL. Кажется, у вас проблемы с информацией о презентации, но вы не сказали нам, какой формат вам нужен. И 'openssl ec -inform DER -in private.key -noout -text' создает еще один формат презентации. Почему бы вам не сказать нам, какой формат ожидает API? Его будет либо (1) PEM, либо (2) DER (с необязательным кодированием, например hex или Websafe Base64); и (3) publicKey или (4) subjectPublicKeyInfo. – jww