我試圖使用橢圓曲線密碼。我需要兩個相同的東西的實現,一個是Java,一個是C。我使用兩個密鑰對測試它們,這兩個密鑰對使用曲線secp256k1生成。當我在Java中生成派生祕密時,我總是從OpenSSL獲得的數字中得到不同的數字。由BouncyCastle Java API和OpenSSL生成的ECDH機密不同
Java代碼:
/* privateKey and peerPublicKey are generated with the following parameters */
ECParameterSpec paramSpec = ECNamedCurveTable.getParameterSpec("secp256k1");
/* ... */
Provider BC = new BouncyCastleProvider();
KeyAgreement agr = KeyAgreement.getInstance("ECDH", BC);
agr.init(privateKey);
agr.doPhase(peerPublicKey, true);
byte[] secret = agr.generateSecret();
C代碼
/* pkey and peerkey are generated using EC_KEY_new_by_curve_name(NID_secp256k1) */
/* and than wrapped in an EVP_PKEY */
EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(pkey, NULL);
uint8_t *secret = NULL;
size_t secret_len;
EVP_PKEY_derive_init(ctx);
EVP_PKEY_derive_set_peer(ctx, peerkey);
EVP_PKEY_derive(ctx, NULL, &secret_len);
secret = malloc(secret_len);
EVP_PKEY_derive(ctx, secret, &secret_len);
我敢肯定的是,鑰匙是有效的,他們都在C和Java代碼是相同的,但我不」不明白爲什麼派生的祕密是不同的。我錯過了什麼嗎?
感謝
「當我在Java中生成派生祕密時,我總是從我從OpenSSL獲得的數字獲得不同的數字。」 - 你的意思是什麼?協議的每次執行是否導致不同的祕密?或者,OpenSSL客戶端和BC客戶端之間的協議執行沒有達到共享密鑰? – jww