Почему симметричный ключ ECC-DH этого сайта отличается от OpenSSL

Я использую (на этом сайте) библиотеку Javascript и OpenSSL Ruby для вычисления симметричного ключа эллиптической кривой Диффи-Хеллмана.

Однако, по моим результатам, OpenSSL Ruby сгенерировал только один ключ в отличие от того, который используется на сайте с симметричными ключами X и Y. Я сбит с толку, так как мой симметричный ключ OpenSSL не совпадает ни с одним из этих x и y на сайте.

Симметричные (общие секретные) ключи, которые я использовал secp224r1 кривая:

Ruby OpenSSL

   13506351678569412185536677668115375188438201041599149052762191980775

Использование библиотеки JS сайта

x: 26210366144026557327555572210249241206666031403062020900473236895358
y: 19676808255388748321882118528911150828003358302170965920476006073155

Мои вопросы:

1) Почему OpenSSL Ruby выдает только один ключ, тогда как этот размер дает два ключа: x и y (как я предполагал, x и y не будут соединяться друг с другом, так как размер бит будет слишком длинным по сравнению с симметричным Ruby ключ)

2) Есть ли способ преобразовать два симметричных ключа (библиотеки OpenSSL и JSBN-EC выше) друг в друга? Все мои попытки конвертировать потерпели неудачу.

В течение недели я боролся за реализацию Ruby OpenSSL с этой библиотекой JSBN-EC. Я также пробовал (библиотека SJCL), но похожие результаты (симметричные ключи не совпадают). Пожалуйста помоги.

1 ответ

Решение

Мне удалось решить это с рабочими симметричными ключами на клиенте (JSBN-EC) и на сервере OpenSSL Ruby.

Я обнаружил, что моя проблема на самом деле заключается в самом коде. После исправления я получил симметричный ключ в Ruby OpenSSL следующим образом:

#Ruby: OpenSSL
...
...
symm_key = ec.dh_compute_key(point)
symm_key.unpack('B*').first.to_i(2) #Converts to binary, then to integer
#--> 6922380353406615622038660570577625762884344085425862813095878420328

В то время как на стороне клиента, используя JSBN-EC

#Javascript: JSBN-EC
...
...
var curve = get_curve();
var P = new ECPointFp(curve,
curve.fromBigInteger(server_pub_key_x),
curve.fromBigInteger(server_pub_key_y));
var a = client_priv_key;
var S = P.multiply(a);

console.log('SYMM_KEY X: '+S.getX().toBigInteger().toString());
//--> 6922380353406615622038660570577625762884344085425862813095878420328
console.log('SYMM_KEY Y: '+S.getY().toBigInteger().toString());
//--> 14426877769799867628378883482085635535383864283889042780773103726343

Поэтому, судя по всему, симметричный ключ, который соответствует значению Ruby OpenSSL, является значением X симметричного ключа JSBN-EC.

6922380353406615622038660570577625762884344085425862813095878420328
==
6922380353406615622038660570577625762884344085425862813095878420328

Я не знаю, для чего сейчас значение Y Похоже, мне это не понадобится. Ура!:)

Другие вопросы по тегам