Есть ли метод DH/ECDH, который я могу использовать между NodeJS, CSharp и WebCrypto?

Я создаю линии связи между расширениями браузера, приложением NodeJS (сервером) и приложением C#. Мне нужно обмениваться ключами между каждым экземпляром, используя такой метод, как Диффи-Хеллман или ECDH, чтобы я мог начать шифрование конфиденциальных данных.

Линии связи следующие:

Браузер ‹--> Узел ‹--> CSharp

Браузер должен взаимодействовать только с Node, и приложению CSharp также необходимо взаимодействовать только с Node.

Мне нужно найти метод обмена ключами, такой как ECDH, который работает в большинстве браузеров (может быть браузерным кодом Node) и имеет совместимую реализацию на стороне NodeJS. Мне нужно найти другой способ сделать то же самое между NodeJS и C#.

Я вижу множество примеров на C# с использованием ECDH (например: https://blogs.msdn.microsoft.com/shawnfa/2007/01/22/elliptic-curve-diffie-hellman/), но я не вижу никаких упоминаний кривой ECDH, как с Node. Есть ли какой-то общий способ обмена ключами между этими платформами?


person Perry Mitchell    schedule 09.11.2016    source источник


Ответы (1)


На самом деле WebCrypto не поддерживает DH - он был исключен из последних версий стандарта. Таким образом, единственным вариантом является ECDH.

В качестве примера вы можете проверить эта ссылка. Также есть «живой пример» того же кода здесь. Обратите внимание, что на данный момент PKI.js — единственная библиотека, работающая с WebCrypto и имеющая все необходимое для шифрования CMS.

Что касается Node.js - вы можете использовать ту же библиотеку PKI.js и любой WebCrypto "shim" или "polifill".

Что касается C# - Microsoft Crypto API поддерживает ECDH (на самом деле поддержка идет через CNG, но это не так важно).

person Yury Strozhevsky    schedule 10.11.2016
comment
Спасибо! Идея с прокладками должна отлично сработать. После дальнейшего изучения кажется, что CSharp имеет спецификацию кривой, доступную для ECDH (msdn.microsoft.com/en-us/library/), но как мне сопоставить их с Node? Например, у меня есть ECDiffieHellmanP521 и ECDiffieHellmanP384 на стороне C#, но нет никаких признаков чего-то подобного на стороне Node, за исключением, возможно, secp521r1 и secp384r1. - person Perry Mitchell; 10.11.2016
comment
По крайней мере, вы можете попробовать их. Это казалось бы правильным. - person Arlen Beiler; 30.08.2017
comment
Я попробовал ECDiffieHellmanP256 на стороне С# и кривую Prime256v1 в javascript. при вычислении секрета с использованием открытого ключа со стороны С# выдает ошибки. Ошибка в обработчике событий для (неизвестно): Ошибка: неизвестный формат точки в ShortCurve.decodePoint (background.js) в KeyPair._importPublic (background.js) в новой KeyPair (background.js) в Function.fromPublic (background.js:34695) :10) в EC.keyFromPublic (background.js:34473:18) в ECDH.computeSecret (background.js:31187:28) - person Shivanshu Goyal; 20.12.2017