DiffieHellman (DiffieHellman) ключевая теория обмена алгоритм и его реализация

Этот справочный документ источник https://segmentfault.com/a/1190000010917737 и https://zh.wikipedia.org/wiki/%E6%A8%A1%E9%99%A4   и  https://www.cnblogs.com /DarkValkyrie/p/10962231.html  (основная формула этой статьи руководителей большой помощи)

 Каков алгоритм обмена ключами Диффи-Хеллмана?
  Диффи-Хеллмана: для совместного использования KEY обеспечения безопасности через незащищенные сети, оно является неотъемлемой частью OAKLEY. Уитфилд и Мартин Хеллман в 1976 году представил замечательный протокол обмена ключами, названный Диффи-Хеллмана обмена ключами протокола / алгоритм (Диффи-Хеллмана обмена ключами / Соглашение Algorithm). Этот оригинальный механизм , который требует , чтобы обе стороны могут безопасно обмениваться данными симметричный ключ определяется этим методом. Затем вы можете использовать ключ шифрования и дешифрования. Однако следует отметить, обмен ключами протокола / алгоритм обмена ключами может быть использован, но не для шифрования и расшифровки сообщений. Обе стороны намерены использовать ключ, чтобы использовать другие симметричные ключевые операции алгоритма шифрования для обеспечения шифрования и расшифровки сообщений.
 
Введение алгоритма по модулю арифметическое правило ---
  • операция Modulo с четырьмя основными арифметическим схожими, но за исключением разделения. Его правила заключаются в следующем:
  1. (А + б)% р = (а% р + б% р)% р (1)
  2. (А - Ь)% р = (а% р - р% б)% р (2)
  3. (А * б)% р = (а * р% б% р)% р (3)
  4. а ^ Ь% р = ((а% р) ^ б) р% (4)
  • Ассоциативный закон:
  1. ((А + б)% р + с)% р = (а + (B + C)% р)% р (5)
  2. ((А * б)% р * с)% р = (а * (Ь * с)% р)% р (6)
  • Коммутативный:
  1. (А + б)% р = (Ь + а) р% (7)
  2. (А * б)% р = (б * а)% р (8)
  • Распределительный закон:
  1. (А + б)% р = (а% р + б% р)% р (9)
  2. ((А + б)% р * с)% р = ((а * с)% р + (б * с)% р)% р (10)
 
Первая ключевой алгоритм обмена DiffieHellman основа теории чисел
  1. (а ^ Ха по модулю р) ^ Xb по модулю р = а ^ (Ха * Xb) по модулю р
  операции по модулю 2. Эквивалентность и коммутативности
    1>. (А по модулю п) по модулю п = мод п Эквивалентность
    2>. а ^ Ь% р = ((а% р) ^ б) р%
 Принцип алгоритма:
    1. Если предположить, что клиент, выбор сервера двух простых чисел а, р (открыто), а затем
  • Клиент: натуральное число, выбранное Xa, Ya = а ^ Xa по модулю р, Ya и передает на сервер;

  • Сервер: выбор натурального числа Xb, Yb = а ^ Xb по модулю р, и посылает клиент Yb;

  • Клиент: подсчитано Ka = Yb ^ Xa тойр

  • Сервер: вычисляя Kb = Ya ^ XB по модулю р

отвлечение

    Ka = Yb ^ Отправить по модулю р

          = (А ^ Xb мод  р) ^ Ха мод  р   

                 ==> (А ^ Xb  MOD Р) ^ Ха  МО Р уравнения можно разделить на четыре (а ^ Xb) ^ Ха мод р

          = А ^ (Xb * Xa) по модулю р

          = (А ^ Ха мод  р) ^ Xb мод  р  

          = Я ^ Xb тойр

          = Kb
Мы можем видеть, даже если клиент, сервер не знает друг друга в друг друга Xa, 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 ( 'шестигранной'));

  

 

рекомендация

отwww.cnblogs.com/pig1314/p/11618632.html