타원 곡선 암호를 사용하려고합니다. Java에서 하나, C에서 두 가지 구현이 필요합니다. secp256k1 커브를 사용하여 생성 된 두 개의 키 쌍을 사용하여 테스트합니다. Java에서 파생 된 비밀을 생성 할 때마다 OpenSSL에서 얻은 것과 다른 수의 값을 얻습니다.BouncyCastle Java API 및 OpenSSL에 의해 생성 된 ECDH 비밀이 다릅니다.
자바 코드 :
/* 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에서 파생 된 암호를 생성 할 때 나는 항상 OpenSSL에서 얻은 것과 다른 번호를 얻습니다." - 정확히 무엇을 의미하니? 프로토콜을 실행할 때마다 비밀이 달라 집니까? 아니면 OpenSSL 클라이언트와 BC 클라이언트 간의 프로토콜 실행이 공유 비밀에 도달하지 않는 경우입니까? – jww