Криптография с открытым ключом
В симметричном шифровании один и тот же ключ используется и для шифрования, и для расшифрования. В криптографии с открытым ключом у нас есть отдельный ключ для шифрования и другой ключ для расшифрования. Это имеет смысл, если ключ расшифрования трудно определить даже при известном ключе шифрования.
Если это так, вы можете сообщить всем, как шифровать сообщения, которые они хотят отправить вам, но только вы будете знать, как эти сообщения расшифровать. Отсюда название: ключ шифрования можно сделать публичным, тогда к ак соответствующий ключ расшифрования остается секретным.
Обычно в криптографии с открытым ключом ключи длиннее, а алгоритмы медленнее, чем в симметричном шифровании. Но криптография с открытым ключом позволяет делать то, что невозможно при симметричном шифровании.
Упомянутая выше возможность получать конфиденциальные сообщения даже от незнакомых людей — один такой пример. Цифровая подпись — другой: с помощью криптографии с открытым ключом можно электронно подписывать сообщения и аутентифицировать пользователей и их сообщения.
Обозначим через остаток при делении на . Здесь называется модулем. Например, и .
Также мы используем простые числа. Целое число больше 1 является простым, если оно делится только на 1 и на само себя. Например, 7, 101 и 7823 — простые числа, а 6, 15 и 100 — нет.
Для данных целых , и легко, по крайней мере в принципе, вычислить . Это модульное возведение в степень относительно легко выполнять даже тогда, когда целые , и очень велики. При больших и степень становится огромной. К счастью, нам не нужно вычислять это огромное число целиком. Вместо этого можно вычислять остаток для каждого промежуточного значения перед продолжением. Рассмотрим простой пример: , , . Тогда .
Сначала вычисляем . Затем берем остаток этого промежуточного результата: . Далее возводим 21 в степень 3. Результат — 9261. Снова берем остаток по модулю 1003 и получаем 234. Последний шаг — возвести 234 в степень 2: результат 54756. Снова взяв остаток, получаем итоговый результат: .
С другой стороны, когда даны произвольные целые , и , очень трудно найти целое , такое что . Эта задача называется задачей дискретного логарифмирования. Мы используем обозначение
Поскольку модульное возведение в степень можно выполнять относительно быстро даже для больших чисел, а обратная задача поиска дискретного логарифма становится очень сложной для больших чисел, модульное возведение в степень с большими числами является примером односторонней функции.
Посмотрим ближе на дискретный логарифм на малых числах. Выберем и ниже увидим график, изображающий .
Обратите внимание, что график не гладкий и не растет как ’обычная’ экспоненциальная функция, определенная для вещественных чисел. Вместо этого график выглядит как случайно движущийся.
Протокол согласования ключей — это метод, с помощью которого две стороны, скажем Alice и Bob, договариваются об общем секретном ключе через небезопасный канал, но так, чтобы никто другой, подслушивающий канал, не смог узнать общий секрет. Пример такого метода — протокол согласования ключей Diffie-Hellman.
Обмен ключами Diffie-Hellman начинается с того, что Alice и Bob договариваются о модуле и числе . Затем Alice выбирает случайное число и отправляет Bob число . Аналогично Bob выбирает случайное число и отправляет Alice число . Теперь Alice может вычислить , а Bob — . Оба значения равны , и это значение можно использовать как новый общий секретный ключ.
В нашем HTTPS-примере (TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384_256 bit keys,TLS 1.2)
используется определенный вариант обмена ключами Diffie-Hellman.
RSA
Теперь посмотрим, как выглядят криптосистемы с открытым ключом. Наиболее распространенная система называется RSA. Она основана на следующем математическом факте:
Если и — простые числа, а и таковы, что
то для всех значений выполняется , где .
Чтобы создать ключи RSA, Alice сначала должна найти два больших простых числа и . Оба простых числа должны быть длиной не менее 1000 бит. Затем ей нужно выбрать целое , такое что можно найти другое целое , для которого выполняется
Открытый ключ Alice теперь является парой , где . Закрытый ключ, который Alice нужен для расшифрования сообщений, — это пара . Alice не должна раскрывать простые числа и никому.
Предположим, что Alice передала свой открытый ключ Bob. Теперь Bob может зашифровать любое "сообщение" , которое закодировано как целое число от 0 до , вычислив . Bob отправит результат Alice. Alice может расшифровать шифртекст , потому что знает секретную расшифровывающую экспоненту . Она вычисляет .
Традиционная подпись — это чернила на бумаге. Она основана на предположении, что только один человек может писать подпись определенным образом. Цифровая подпись всегда отличается для каждого сообщения, иначе ее можно было бы просто скопировать в любой документ, и только человек с ключом подписи может вычислить ее правильно. Подпись может проверить любой, у кого есть ключ проверки.
RSA также можно использовать для цифровой подписи и проверки. Alice раскрывает ключ проверки , а сама использует ключ подписи . Если Alice хочет подписать сообщение , она вычисляет подпись как . Когда Bob получает сообщение и подпись , он может проверить, что . Если это верно, то подпись должна быть от Alice, потому что никто другой не знает параметр , который необходим для вычисления подписей Alice.
Обычно подпись вычисляется не для всего сообщения. Вместо этого сначала вычисляется хэш сообщения, а затем подписывается хэш-значение. Это гарантирует, что подписываемое значение не станет слишком большим. На стороне проверки полученное сообщение аналогично сначала подается на вход хэш-функции, и параллельно к подписи применяется ключ проверки . Если выходы обеих операций равны, подпись принимается. Хэш-значение сообщения называется его отпечатком, и его можно использовать вместо всего сообщения, если для хэш-функции не найдены коллизии.
В нашем HTTPS-примере (TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384_256 bit keys,TLS 1.2)
RSA используется для цифровых подписей.
Не забудьте проверить свои баллы в индикаторе в правом нижнем углу материала!