Этот справочный документ источник https://segmentfault.com/a/1190000010917737 и https://zh.wikipedia.org/wiki/%E6%A8%A1%E9%99%A4 и https://www.cnblogs.com /DarkValkyrie/p/10962231.html (основная формула этой статьи руководителей большой помощи)
- операция Modulo с четырьмя основными арифметическим схожими, но за исключением разделения. Его правила заключаются в следующем:
- (А + б)% р = (а% р + б% р)% р (1)
- (А - Ь)% р = (а% р - р% б)% р (2)
- (А * б)% р = (а * р% б% р)% р (3)
- а ^ Ь% р = ((а% р) ^ б) р% (4)
- Ассоциативный закон:
- ((А + б)% р + с)% р = (а + (B + C)% р)% р (5)
- ((А * б)% р * с)% р = (а * (Ь * с)% р)% р (6)
- Коммутативный:
- (А + б)% р = (Ь + а) р% (7)
- (А * б)% р = (б * а)% р (8)
- Распределительный закон:
- (А + б)% р = (а% р + б% р)% р (9)
- ((А + б)% р * с)% р = ((а * с)% р + (б * с)% р)% р (10)
-
Клиент: натуральное число, выбранное Xa, Ya = а ^ Xa по модулю р, Ya и передает на сервер;
-
Сервер: выбор натурального числа Xb, Yb = а ^ Xb по модулю р, и посылает клиент Yb;
-
Клиент: подсчитано Ka = Yb ^ Xa тойр
- Сервер: вычисляя Kb = Ya ^ XB по модулю р
отвлечение
Ka = Yb ^ Отправить по модулю р
= (А ^ Xb мод р) ^ Ха мод р
==> (А ^ Xb MOD Р) ^ Ха МО Р уравнения можно разделить на четыре (а ^ Xb) ^ Ха мод р
= А ^ (Xb * Xa) по модулю р
= (А ^ Ха мод р) ^ Xb мод р
= Я ^ Xb тойр
Код Пример Nodejs
Как уже упоминалось выше в связи со следующим резюме просмотра кода, который является одним из клиента точек, сервер используют один и тот же простое число а, р.
Требовать Crypto = Var ( 'Crypto'); вар primeLength = 1024; // длина простого р вар генератор = 5; // Наглядный // создать экземпляр клиента DH вар = crypto.createDiffieHellman Client (primeLength, генератор); / / Сформировавшаяся пара открытый ключ, MOD Xa Ya = а ^ PVAR clientKey client.generateKeys = (); // Создание сервера экземпляра DH, используя клиент с таким же простым числом а, Р вар = crypto.createDiffieHellman сервер (клиент. getPrime (), client.getGenerator ()); // генерировать пары открытый-закрытый ключ, Xb Yb = A ^ P MOD вар server.generateKeys ServerKey = (); // вычислить ^ Xa Yb = MOD Ka Р вар = Клиент clientSecret .computeSecret (server.getPublicKey ()); // вычислить Ya ^ Xb = MOD Kb P вар serverSecret = server.computeSecret (client.getPublicKey ()); // так как простое число р генерируется динамически, так что каждая печать не как //但是clientSecret === serverSecret console.log (clientSecret.toString ( 'шестигранной')); console.log (serverSecret.toString ( 'шестигранной'));