Генерация общего ключа из открытого ключа с использованием библиотеки Elliptic JS - PullRequest
1 голос
/ 22 октября 2019

Я пытаюсь использовать библиотеку Elliptic JS для генерации общего ключа, который может использоваться двумя людьми (из их примера).

Проблема в том, что в примере генерируетсяновая пара ключей каждый раз - я хочу, чтобы один человек использовал свой личный ключ, а другой - открытый ключ.

Вот что у меня есть:

var EC = require('elliptic').ec;
var ec = new EC('curve25519');

var key1 = ec.keyFromPrivate('BLAHBLAHBLAH1');
var publicKey1 = key1.getPublic();

///// HOW DO I START WITH KEY2 BEING THE PUBLIC KEY, NOT KEYFROMPRIVATE? /////

var key2 = ec.keyFromPrivate('BLAHBLAHBLAH2');
var publicKey2 = key2.getPublic();

var shared1 = key1.derive(publicKey2);
var shared2 = key2.derive(publicKey1);

console.log(shared1.toString(16));
console.log(shared2.toString(16));

Любые идеи были бы чрезвычайно полезны!

1 Ответ

1 голос
/ 22 октября 2019

Так что, может быть, лучше объяснить это немного.

При использовании криптографии с эллиптической кривой закрытый ключ - это просто число (большой).

открытый ключ на самом деле является точкой на кривой (как на самом деле x, y).

Вы должны сгенерировать закрытый ключ first , чтобы получить соответствующий открытый ключкоордината, как вы, возможно, знаете, функция люка в ECC основывается на том, что не может выводить закрытый ключ из точки открытого ключа.

Открытый ключ получается путем скалярного умножениязакрытого ключа с помощью специальной точки на кривой, называемой точкой генератора.

Итак ... при этом единственный способ начать с открытого ключа, который вы знаете, - это иметь (в какой-то моментпредыдущий), сгенерировал и сохранил закрытый ключ, вычислил соответствующий открытый ключ с использованием стандартных методов (который, к вашему сведению, на самом деле представляет собой процесс, в котором один скаляр умножает число закрытого ключа на известный генератор (специальная общеизвестная точка x, y) на кривой, а затем сохраните открытый ключ для будущего использования.

И последнее, что вы делаете здесь (вы, возможно, уже знаете), это ECDH (Эллиптическая кривая Диффи-Хеллмана), генерирующая общий секрет с использованием протокола Диффи-Хеллмана.

В этом протоколе обычно каждый раз используются пары эфемерных (временных) ключей. Таким образом, у каждого сеанса есть новый ключ сеанса, что означает, что прямая секретность не основана на одном частном ключе.

Кроме того, помните, что производный секрет ECDH не готов к использованию в качестве симметричного ключа. Он должен быть передан через HKDF (функция вывода ключа) как случайный секрет! = Единообразный секрет, подходящий для криптографического использования.

Любые вопросы, пожалуйста, задавайте ниже, хорошее объяснение того, почему важно использовать эфемерные ключи в ECDH здесь от @ Maarten.

Пожалуйста, дайте мне знать, если это не ясно.

...