К началу второй половины XX века ученые стали все больше приходить к выводу, что возможностей симметричной криптографии явно недостаточно для решения ряда современных задач. С появлением компьютеров и увеличением их вычислительной мощности взломы даже самых сложных симметричных шифров, используемых в то время, перестали быть серьезной проблемой. Поэтому мир постепенно стал переходить к математической криптографии. Результатом этого перехода стала настоящая революция, которая выразилась в появлении принципиально нового раздела криптографии. Речь идет о криптографии асимметричной, или, как ее еще называют, криптографии с открытым ключом.
В 1976 году два криптографа, Уитфилд Диффи и Мартин Хеллман, опубликовали работу под названием «Новые направления в современной криптографии». Основная идея, изложенная в работе, состояла в методе, при котором, помимо одного секретного ключа, формируется также и второй – открытый, математически связанный с секретным ключом. При этом процесс восстановления секретного ключа из открытого представляет собой исключительно сложную математическую задачу. Конечный результат этой идеи воплотился в возможности распространять секретный ключ по открытым каналам, не рискуя при этом раскрыть его третьим лицам. Для этого сторонам необходимо было лишь обменяться между собой открытыми ключами с добавлением вспомогательной расчетной информации. А затем, при помощи математических операций, восстановить общий секретный ключ на стороне получателя. Этот алгоритм получил название «Диффи – Хеллмана», по имени его создателей, и открыл новую криптографическую эпоху, в которой начали появляться и развиваться исключительно криптостойкие алгоритмы шифрования, использующиеся, в частности, и в технологии блокчейн.
Каким же образом работает шифрование с открытым ключом? На самом деле принцип достаточно прост – каждый пользователь генерирует себе секретный ключ, пусть даже и случайным образом. Затем при помощи математических операций, зависящих от конкретного алгоритма шифрования, он получает из этого секретного ключа второй ключ, который имеет статус публичного. То есть владелец публичного ключа может открыто его распространять: поместить на сайте, в почтовом сообщении или вообще напечатать в газете. Раскрывать свой публичный ключ необходимо, поскольку он обязательно понадобится тому, кто захочет отправить сообщение владельцу этой пары ключей – для шифрования сообщения. Фокус в том, что расшифровать сообщение, закодированное публичным ключом, можно только лишь при помощи соответствующего ему секретного ключа и никак иначе. Как мы видим, подобная система не в пример удобнее, чем симметричная форма криптографии, где постоянная необходимость распространения общего секретного ключа по незащищенным каналам создает серьезную уязвимость для технологии шифрования в целом.
Однако следует отметить, что и симметричные системы шифрования продолжают использоваться в наше время. Дело в том, что симметричные алгоритмы обладают очень высокой скоростью шифрования и расшифровки. В системах, где этот параметр является критичным, а также при условии, что стороны смогут обеспечить безопасный обмен секретными ключами между собой, применение симметричного шифрования может оказаться вполне оправданным и эффективным. Довольно часто при передаче данных в сети интернет применяется комбинация алгоритмов асимметричной и симметричной криптографии. В частности, при установлении соединения используется передача общего секрета при помощи алгоритма Диффи – Хеллмана, а затем этот общий секрет используется обеими сторонами как ключ для шифрования и дешифрования пакетов данных симметричными алгоритмами. Но все же в распределенных системах с большим количеством пользователей безраздельно властвует асимметричная криптография, и блокчейн-проекты – не исключение. Какие же методы асимметричного шифрования наиболее популярны в настоящее время?
Асимметричная криптография
Алгоритмов асимметричного шифрования достаточно много. Но в этой книге мы остановимся лишь на нескольких из них, переходя от относительно простых к более сложным. Алгоритм Диффи – Хеллмана, появившийся первым среди методов асимметричной криптографии, не решал задачу аутентификации сторон, которые совместно генерировали секретный ключ. Однако уже в 1977 году появился алгоритм, который обеспечивал не только сам процесс шифрования, но и был пригоден для создания аутентификации субъекта системы посредством цифровой электронной подписи. Данный алгоритм базировался на задаче так называемой «факторизации» больших целых чисел и получил название в виде аббревиатуры RSA – по фамилиям ученых, его создавших – Рональда Ривеста, Ади Шамира и Леонарда Адлемана. Факторизацией называется процесс разложения натурального числа на произведение простых множителей. В алгоритме RSA секретный ключ представляет собой два больших простых числа, а публичный ключ – произведение этих двух чисел. Использование этого метода в криптографии обусловлено его свойством, благодаря которому задача перемножения нескольких чисел является достаточно легкой, в том числе и для весьма больших значений. В то же время обратное разложение полученного числа на исходные множители является задачей исключительной вычислительной сложности.
Поясним на примере. Допустим, у нас есть три простых числа – 3, 5 и 7. Простые числа – это те, которые без остатка делятся лишь на себя самих и на единицу. Перемножим эти три числа между собой и получим результат – 105. А теперь представим, что у нас имеется только конечный результат 105 и нам необходимо разложить его обратно на простые множители, то есть получить исходные числа 3, 5 и 7. При решении задачи даже для такого небольшого трехразрядного числа человек столкнется с трудностями. А задача о факторизации чисел, имеющих разрядность в десятки позиций, и для современного компьютера может стать весьма нетривиальной. Безусловно, существуют алгоритмы, которые позволяют осуществлять факторизацию несколько эффективнее, чем простым перебором делителей, но однозначно оптимального алгоритма, позволяющего быстро решить эту задачу для больших чисел, пока не изобрели.
Проблема факторизации чисел занимала умы ученых еще сотни лет назад. Одним из первых, кто занялся этой задачей, стал французский математик Пьер де Ферма. Еще в 1643 году он предложил свой метод факторизации, который используется для криптоанализа шифров RSA и в наши дни. Понятно, что для любого алгоритма шифрования всегда найдутся люди, которые будут искать возможности для эффективной атаки на него. Кто-то в преступных целях, а кто-то в научных – чтобы исследовать криптостойкость алгоритма и защитить проекты, базирующиеся на данном решении. Еще в середине 2000-х гг. стали появляться сообщения о том, что группа ученых того или иного университета взломала сначала 512-битный, а затем и 1024-битный ключ RSA. При этом они не задействовали какую-то исключительную вычислительную мощность, а для решения задачи им потребовалось вполне разумное время. Конечно, ни один, даже самый мощный компьютер, с такой вычислительной нагрузкой в одиночку не справится, поэтому для решения подобных задач компьютеры обычно объединяют в специальные вычислительные кластеры.
За последние десять лет вычислительная мощность компьютеров заметно выросла. Согласно закону Мура, производительность компьютерных процессоров удваивается каждые 18 месяцев, поэтому для поддержания криптостойкости алгоритма RSA в различных технологических решениях необходимо постоянно увеличивать длину открытого ключа. Поскольку до бесконечности этот процесс продолжаться не может, от данного алгоритма стали отказываться и переходить к более прогрессивным решениям, в которых достаточная криптостойкость поддерживается для ключей с разумной разрядностью – в пределах 256–1024 бит. Одним из таких стал алгоритм формирования цифровой подписи DSA, построенный на модели дискретного логарифмирования. В данном алгоритме используется так называемая модульная арифметика, которая представляет собой задачу поиска степени, в которую необходимо возвести заданное число, чтобы, разделив результат по модулю на другое заданное число, получить желаемый остаток от деления. Чтобы стало понятнее, рассмотрим следующий пример: