Начнем с быстрых мыслей эксперимента.
У вас есть сеть из 3 компьютеров, используемых Алисой, Боб и Чарли. Все 3 участника могут отправлять сообщения, но так же, как все остальные клиенты, которые подключались к сети, могут прочитать его. Это единственная возможная форма связи между участниками.
Если Алиса отправляет сообщение через провода, и Боб, и Чарли получит его. Другими словами, Алиса не может отправить прямое сообщение для Боб без Чарли, также получающего его.
Но Алиса хочет отправить конфиденциальное сообщение Боб и не хочет, чтобы Чарли мог читать это.
Кажется невозможным с эти строгими правилами, верно? Красивая вещь, которую эта проблема решается в 1976 году Уитфилдом Диффи и Мартина Хелманом.
Это упрощенная версия реального мира, но мы сталкиваемся с одной и той же проблемой при общении через самую большую сеть, которая когда-либо существовала.
Обычно вы не подключены к Интернету, но вы являетесь частью локальной меньшей сети, называемой Ethernet.
Эта небольшая сеть может быть проводной или беспроводной (Wi-Fi), но остается базовая концепция. Если вы отправите сигнал через сеть, этот сигнал можно прочитать все остальные клиенты, подключенные к той же сети.
Как только вы выделяете сообщение на сервер вашего банка с информацией о вашей кредитной карте, все остальные клиенты в локальной сети получат сообщение, включая маршрутизатор. Затем он перевернет его на фактический сервер банка. Все остальные клиенты будут игнорировать сообщение.
Но что, если есть вредоносный клиент в сети, который не будет игнорировать ваши конфиденциальные сообщения, но вместо этого прочитал? Как это возможно, у вас все еще есть деньги на вашем банковском счете?
Шифрование
На данный момент вроде ясно, что нам нужно использовать какое-то шифрование, чтобы убедиться, что сообщение будет читаемо для Alice и Bob, но полный гибберский для Чарли.
Зашифрующая информация выполняется алгоритмом шифрования, который принимает ключ (например, строку) и возвращает зашифрованное значение, называемое зашифрованным текстом. Зашифровальный текст – просто совершенно случайная строка.
Важно, чтобы зашифрованное значение (зашифрованное текст) можно расшифровать только с исходным ключом. Это называется симметричным ключевым алгоритмом, потому что вам нужен тот же ключ для расшифровки сообщения, как он был зашифрован. Есть также асимметричные ключевые алгоритмы, но нам не нужны их прямо сейчас.
Чтобы облегчить это понять, вот алгоритм фирмы шифрования, реализованный в JavaScript:
function encrypt(message, key) {
return message.split("").map(character => {
const characterAsciiCode = character.charCodeAt(0)
return String.fromCharCode(characterAsciiCode+key.length)
}).join("");
}В этой функции я сопоставил каждый символ в другой символ на основе длины данного ключа.
Каждый символ имеет целочисленное представление, называемое код ASCII. Есть словарь, который содержит все символы с его кодом, называется таблицей ASCII. Поэтому мы увеличивали это целое число по длине ключа:
Расшифрование зашифрованного текста довольно похоже. Но вместо того, чтобы добавить, мы вычитаем клавишу длиной от каждого символа в зашифрованном тексте, поэтому мы вернем исходное сообщение.
function decrypt(cipher, key) {
return cipher.split("").map(character => {
const characterAsciiCode = character.charCodeAt(0)
return String.fromCharCode(characterAsciiCode-key.length)
}).join("");
}Наконец вот манекетное шифрование в действии:
const message = "Hi Bob, here is a confidential message!";
const key = "password";
const cipher = encrypt(message, key);
console.log("Encrypted message:", cipher);
// Encrypted message: Pq(Jwj4(pmzm(q{(i(kwvnqlmv|qit(um{{iom)
const decryptedMessage = decrypt(cipher, key);
console.log("Decrypted message:", decryptedMessage);
// Decrypted message: Hi Bob, here is a confidential message!Мы применили некоторую степень шифрования к сообщению, но этот алгоритм был полезен только для демонстрационных целей, чтобы получить ощущение того, как ведут себя алгоритмы шифрования симметричных ключей.
Существует пара проблем с этой реализацией, помимо обработки угловых чехлов и типов параметра плохо.
Прежде всего, каждый из 8 клавиши символов может расшифровать сообщение, которое зашифровано ключом «пароль». Мы хотим, чтобы алгоритм шифрования сможешь расшифровать сообщение, если мы даем ему один и тот же ключ, с которым сообщение было зашифровано сообщение. Дверной замок, который можно открыть всеми другими ключом, не так полезно.
Во-вторых, логика слишком проста – каждый символ смещен то же количество в таблице ASCII, которая слишком предсказуема. Нам нужно что-то более сложное, чтобы усложнить сообщение без ключа.
В-третьих, нет минимальной длины ключей. Современные алгоритмы работают с по крайней мере 128-битные длинные ключи (~ 16 символов). Это значительно увеличивает количество возможных ключей, и с этой жесткостью шифрования.
Наконец, требуется слишком мало времени для шифрования или расшифровки сообщения. Это проблема, потому что она не займет слишком много времени, чтобы попробовать все возможные ключи и взломать зашифрованное сообщение.
Это рука в руке с ключом.
Существует широкий ассортимент симметричных алгоритмов шифрования, который рассмотрел все эти претензии, которые часто используются вместе, чтобы найти хорошее соотношение скорости и сильной безопасности для любой ситуации.
Более популярные симметричные ключевые алгоритмы являются Twofish , Змей , AES ( Rijndael ), Взрыв , CAST5 , RC4. , TDES и Идея Отказ
Если вы хотите узнать больше о криптографии в целом. Этот разговор Отказ
Обмен ключами
Похоже, мы сократили исходное заданное пространство. С шифрованием мы можем создать сообщение, которое имеет смысл для Сторон, которые имеют право прочитать информацию, но не читают для других.
Когда Алиса хочет написать конфиденциальное сообщение, она выберет ключ и зашифрует ее сообщение с ним и отправит зашифрованный текст через провода. И Боб, и Чарли получит зашифрованное сообщение, но ни один из них не может интерпретировать его без ключа Алисы.
Теперь единственный вопрос для ответа – это то, как Алиса и Боб могут найти общий ключ, просто обмениваясь через сеть и предотвратить выяснение Чарли.
Если Алиса отправляет свой ключ непосредственно через провода Чарли перехватила бы ее и сможет расшифровать все сообщения Alice. Так что это не решение. Это называется проблемой обмена ключами в информатике.
ОБМЕН
Этот крутой алгоритм обеспечивает способ генерации общего ключа между двумя людьми таким образом, чтобы ключ нельзя увидеть, наблюдая за общением.
В качестве первого шага мы скажем, что существует огромное простое число, известное всем участникам, это публичная информация. Мы называем это «P» или модуль Отказ
Есть также еще один публичный номер под названием “G” или база , что меньше, чем P Отказ
Не беспокойтесь о том, как эти цифры генерируются. Ради простоты давайте просто скажем, Алиса выбирает очень большое простое число ( P ) и номер, который значительно меньше, чем P Отказ Затем она отправляет их через провода без какого-либо шифрования, поэтому все участники узнают эти цифры.
Пример: Чтобы понять это через пример, мы будем использовать небольшие числа. Допустим, p = 23. и Отказ
В качестве второго шага оба Алиса ( A ) и BOB ( B ) выберут секретный номер, который они никому не скажут, он просто локально живет на своих компьютерах.
Пример: Скажем, Алиса выбрала 4 ( a = 4 ), и Боб выбрал 3 ( b = 3 ).
Как следующий шаг, они будут делать немного математики на своих секретных числах, они рассчитают:
- База ( G ) В силе их секретного номера,
- и возьмите рассчитанный номер по модулю на P Отказ
- Позвоните в результате А (для Алисы) и B (для Боба).
Modulo – это простое математическое утверждение, и мы используем его, чтобы найти остаток после деления одного числа другим. Вот пример: 23 мод , потому что 23/4 – 5 и 3 остается.
Может быть, легче увидеть все это в коде:
// base
const g = 5;
// modulus
const p = 23;
// Alice's randomly picked number
const a = 4;
// Alice's calculated value
const A = Math.pow(g, a)%p;
// Do the same for Bob
const b = 3;
const B = Math.pow(g, b)%p;
console.log("Alice's calculated value (A):", A);
// Alice's calculated value (A): 4
console.log("Bob's calculated value (B):", B);
// Bob's calculated value (B): 10Теперь Алиса, и Боб отправят свои расчетные значения ( A , B ) через сеть Так что все участники узнают их.
В последний шаг Алиса и Боб возьмут рассчитанные значения друг друга и выполняют следующее:
- Алиса возьмет расчетное значение Боба ( b ) в силе его секретного числа ( a ),
- и рассчитать модуль этого номера на P и позвонит результат s (секрет).
- Боб сделает то же самое, но с расчетной стоимостью Алисы ( A ), а его секретное число ( B ).
На данный момент они успешно сгенерировали общий секрет ( S ), даже если сейчас трудно увидеть прямо сейчас. Мы рассмотрим это более подробно за секунду.
В коде:
// Alice calculate the common secret
const secretOfAlice = Math.pow(B, a)%p;
console.log("Alice's calculated secret:", secretOfAlice);
// Alice's calculated secret: 18
// Bob will calculate
const secretOfBob = Math.pow(A, b)%p;
console.log("Bob's calculated secret:", secretOfBob);
// Bob's calculated secret: 18Как вы можете видеть, как Алиса, и Боб получил номер 18, который они могут использовать в качестве ключа для шифрования сообщений. Это кажется волшебным в этот момент, но это просто математика.
Посмотрим, почему они получили тот же номер, расщепляя расчеты в элементарные части:
На последнем шаге мы использовали Модульная арифметическая идентичность и его распределительные свойства для упрощения вложенных модульных утверждений.
Итак, Алиса и Боб у одного и того же ключа, но посмотрим, что Чарли увидел от всего этого. Мы знаем, что P а также g публичные номера, доступные для всех.
Мы также знаем, что Алиса и Боб отправили свои расчетные значения ( A , B ) через сеть, так что можно также поймать Чарли.
Чарли знает почти все параметры этого уравнения, просто А и B оставаться скрытым. Остаться с примером, если он знает что А 4 и P 23, g к власти А Может быть 4, 27, 50, 73, … и бесконечные числа, которые приводят к 4 в пространстве модуля.
Он также знает, что только подмножество этих чисел возможны варианты, потому что не все номера представляют собой экспонент 5 ( G ), но это все еще бесконечное количество вариантов.
Это не кажется слишком безопасным с небольшими числами. Но в начале я сказал это P Это действительно большое количество, часто 2000 или 4000 бит долго. Это делает практически невозможным угадать ценность А или b в реальном мире.
Обычный ключ Алиса и Боб, оба обладают только могут быть созданы, узнав А или преступность Кроме того, помимо информации, пройденной через сеть.
Если вы более визуальные, вот отличная диаграмма показывает весь этот процесс путем смешивания ведер краски вместо номеров.
Здесь P а также g Общие константы, представленные желтой «обычной краской». Секретные номера Алисы и Боб ( A , B ) – «Секретные цвета», а «Общий секрет» – это то, что мы называли S Отказ
Это отличная аналогия, потому что она представляет собой необратимость работы модуля. Поскольку смешанные краски не могут быть проницательными в их оригинальные компоненты, результат работы модуля не может быть изменен.
Резюме
Теперь оригинальная проблема может быть решена путем шифрования сообщений с использованием общего ключа, который был обменен с алгоритмом диффи-Хедмана.
С помощью этой Алисы и Боб могут надежно общаться, и Чарли не может прочитать свои сообщения, даже если он является частью одной и той же сети.
Спасибо за чтение этого далеко! Я надеюсь, что у вас есть ценность от этого поста и поняла некоторые части этого интересного коммуникационного потока.
Если было трудно следовать по математике этого объяснения, здесь Это отличное видео, чтобы помочь вам понять алгоритм без математики, с более высокого уровня.
Если вам понравился этот пост, вы можете следовать за мной на Twitter Чтобы найти более захватывающие ресурсы о программировании и разработке программного обеспечения.
Оригинал: “https://www.freecodecamp.org/news/diffie-hellman-key-exchange/”