Рассматривая технологию блокчейн в деталях, совершенно невозможно пройти мимо одного из ее самых важных элементов – криптографической части. Криптография в блокчейн является мощнейшим связующим элементом, на котором базируется основная ценность технологии распределенного реестра в целом. Именно криптография стоит на страже целостности хранения и передачи данных, обеспечивает права владения и защищает активы пользователей системы, в первую очередь – финансовые. Без криптографии технология блокчейн просто не смогла бы существовать – она бы утратила все свои преимущества, и в ее использовании не было бы никакого смысла. Но почему же криптография настолько важна? Давайте попробуем разобраться, что же такое криптография и каким образом она стала фактическим ядром блокчейн-технологии.
История криптографии уходит далеко в глубь тысячелетий. Во все времена у людей существовала необходимость передавать секретную информацию на расстоянии. В первую очередь дело обычно касалось информации, имеющей военное значение. В эпоху отсутствия в мире систем коллективной безопасности более слабые в военном отношении государства постоянно становились добычей агрессивных соседей. Единственным шансом для малых государств сохранить свою свободу и независимость было найти себе сильных союзников. Но для заключения подобных соглашений необходимо было обмениваться информацией, которая ни при каких обстоятельствах не должна была стать известна потенциальному противнику. То же самое касалось и приказов военного командования к своим подразделениям, находящимся вдали от дислокации основных сил: для осуществления постоянной координации нужно было передавать и получать информацию о местоположении, численности, снабжении, а также тактике и стратегии предстоящих боевых действий.
Информация передавалась через специально подготовленных людей (гонцов или шпионов), задачей которых было максимально быстро и незаметно для противника передать послание конечному адресату. Тем не менее существовал немалый риск, что такой посланец будет перехвачен, а информация, которую он несет, станет достоянием врагов. Эти риски постоянно учитывались при составлении сообщений, поэтому их практически никогда не писали открытым текстом, а пытались определенным образом зашифровать. Подобная практика предполагала, что ключ к расшифровке текстов имеется только у отправителя и у тех, кому данное послание адресовано. А это означает, что до того, как начать обмен сообщениями, необходимо было приложить определенные усилия к распространению шифровальных ключей между центром и его потенциальными адресатами. Что, в свою очередь, влекло за собой риск, что эта информация может быть перехвачена (или перекуплена) и впоследствии использована для чтения сообщений неприятеля. Разумеется, сам отправитель не будет иметь об этом ни малейшего понятия, поскольку факт обладания тайным ключом не будет предан противником гласности.
Принцип, когда сообщения шифруются и дешифруются одним и тем же ключом, которым владеют обе стороны, вступающие в обмен информацией, называется симметричной криптографией, поскольку в данном случае имеет место явная симметрия в шифровальных ключах. Именно этот принцип и использовался почти все время существования человеческой цивилизации – от глубокой древности и вплоть до конца 70-х годов прошлого века. Какие же приемы использовались в те времена для шифрования? Как и у других областей человеческого знания, у криптографических технологий была своя собственная эволюция. Начиналось все с банальной подстановки одних букв послания вместо других. Например, римский полководец Гай Юлий Цезарь кодировал послания своим генералам методом сдвига букв на три позиции в латинском алфавите. То есть буква B становилась буквой E, C – F и так далее. Подобные подстановочные шифры называют еще моноалфавитными. Впоследствии моноалфавитные шифры были вытеснены полиалфавитными, когда к буквам шифруемого текста циклически применялись несколько моноалфавитных шифров. Этот метод с различными вариациями использовался почти 1000 лет, до начала XX века, когда в обиход вошли электромеханические устройства для шифрования сообщений. Наверное, самой известной реализацией подобного способа криптографии является немецкая роторная шифровальная машина «Энигма», шифры которой считались невскрываемыми.
С современной точки зрения шифр «Энигмы» выглядит криптографически слабым. Однако во времена Второй мировой войны эта шифровальная машина сумела доставить изрядные хлопоты противникам Германии. Еще задолго до начала военных действий, в 1932 году, польской разведке удалось на базе сведений от своих германских агентов получить некоторые коды и принципы устройства машины. Это позволило полякам воссоздать машину у себя в лаборатории и попытаться разобраться в алгоритме ее работы. В 1939 году Германия вторглась в Польшу, однако незадолго до этого все наработки по «Энигме» были переданы британской разведке, которая создала специальную группу по дешифровке сообщений и привлекла в нее талантливого математика и криптографа Алана Тьюринга. К 1940 году команда Тьюринга сумела построить около двухсот криптоаналитических машин, работающих с шифром «Энигмы», но исключительное многообразие вариантов перебора для расшифровки очень долго не позволяло взломать код. Тем не менее Тьюрингу удалось выявить повторяющиеся фразы в зашифрованных сообщениях. Одним из таковых оказалось нацистское приветствие, присутствующее почти в каждом тексте, что позволило существенно сузить диапазон перебора вариантов и наконец взломать шифр. Считается, что именно это событие существенно повлияло на поражение Германии, а дата окончания войны, как полагают некоторые специалисты, приблизилась не менее чем на год.
К началу второй половины XX века ученые стали все больше приходить к выводу, что возможностей симметричной криптографии явно недостаточно для решения ряда современных задач. С появлением компьютеров и увеличением их вычислительной мощности взломы даже самых сложных симметричных шифров, используемых в то время, перестали быть серьезной проблемой. Поэтому мир постепенно стал переходить к математической криптографии. Результатом этого перехода стала настоящая революция, которая выразилась в появлении принципиально нового раздела криптографии. Речь идет о криптографии асимметричной, или, как ее еще называют, криптографии с открытым ключом.
В 1976 году два криптографа, Уитфилд Диффи и Мартин Хеллман, опубликовали работу под названием «Новые направления в современной криптографии». Основная идея, изложенная в работе, состояла в методе, при котором, помимо одного секретного ключа, формируется также и второй – открытый, математически связанный с секретным ключом. При этом процесс восстановления секретного ключа из открытого представляет собой исключительно сложную математическую задачу. Конечный результат этой идеи воплотился в возможности распространять секретный ключ по открытым каналам, не рискуя при этом раскрыть его третьим лицам. Для этого сторонам необходимо было лишь обменяться между собой открытыми ключами с добавлением вспомогательной расчетной информации. А затем, при помощи математических операций, восстановить общий секретный ключ на стороне получателя. Этот алгоритм получил название «Диффи – Хеллмана», по имени его создателей, и открыл новую криптографическую эпоху, в которой начали появляться и развиваться исключительно криптостойкие алгоритмы шифрования, использующиеся, в частности, и в технологии блокчейн.
Каким же образом работает шифрование с открытым ключом? На самом деле принцип достаточно прост – каждый пользователь генерирует себе секретный ключ, пусть даже и случайным образом. Затем при помощи математических операций, зависящих от конкретного алгоритма шифрования, он получает из этого секретного ключа второй ключ, который имеет статус публичного. То есть владелец публичного ключа может открыто его распространять: поместить на сайте, в почтовом сообщении или вообще напечатать в газете. Раскрывать свой публичный ключ необходимо, поскольку он обязательно понадобится тому, кто захочет отправить сообщение владельцу этой пары ключей – для шифрования сообщения. Фокус в том, что расшифровать сообщение, закодированное публичным ключом, можно только лишь при помощи соответствующего ему секретного ключа и никак иначе. Как мы видим, подобная система не в пример удобнее, чем симметричная форма криптографии, где постоянная необходимость распространения общего секретного ключа по незащищенным каналам создает серьезную уязвимость для технологии шифрования в целом.
Однако следует отметить, что и симметричные системы шифрования продолжают использоваться в наше время. Дело в том, что симметричные алгоритмы обладают очень высокой скоростью шифрования и расшифровки. В системах, где этот параметр является критичным, а также при условии, что стороны смогут обеспечить безопасный обмен секретными ключами между собой, применение симметричного шифрования может оказаться вполне оправданным и эффективным. Довольно часто при передаче данных в сети интернет применяется комбинация алгоритмов асимметричной и симметричной криптографии. В частности, при установлении соединения используется передача общего секрета при помощи алгоритма Диффи – Хеллмана, а затем этот общий секрет используется обеими сторонами как ключ для шифрования и дешифрования пакетов данных симметричными алгоритмами. Но все же в распределенных системах с большим количеством пользователей безраздельно властвует асимметричная криптография, и блокчейн-проекты – не исключение. Какие же методы асимметричного шифрования наиболее популярны в настоящее время?
Алгоритмов асимметричного шифрования достаточно много. Но в этой книге мы остановимся лишь на нескольких из них, переходя от относительно простых к более сложным. Алгоритм Диффи – Хеллмана, появившийся первым среди методов асимметричной криптографии, не решал задачу аутентификации сторон, которые совместно генерировали секретный ключ. Однако уже в 1977 году появился алгоритм, который обеспечивал не только сам процесс шифрования, но и был пригоден для создания аутентификации субъекта системы посредством цифровой электронной подписи. Данный алгоритм базировался на задаче так называемой «факторизации» больших целых чисел и получил название в виде аббревиатуры RSA – по фамилиям ученых, его создавших – Рональда Ривеста, Ади Шамира и Леонарда Адлемана. Факторизацией называется процесс разложения натурального числа на произведение простых множителей. В алгоритме RSA секретный ключ представляет собой два больших простых числа, а публичный ключ – произведение этих двух чисел. Использование этого метода в криптографии обусловлено его свойством, благодаря которому задача перемножения нескольких чисел является достаточно легкой, в том числе и для весьма больших значений. В то же время обратное разложение полученного числа на исходные множители является задачей исключительной вычислительной сложности.
Поясним на примере. Допустим, у нас есть три простых числа – 3, 5 и 7. Простые числа – это те, которые без остатка делятся лишь на себя самих и на единицу. Перемножим эти три числа между собой и получим результат – 105. А теперь представим, что у нас имеется только конечный результат 105 и нам необходимо разложить его обратно на простые множители, то есть получить исходные числа 3, 5 и 7. При решении задачи даже для такого небольшого трехразрядного числа человек столкнется с трудностями. А задача о факторизации чисел, имеющих разрядность в десятки позиций, и для современного компьютера может стать весьма нетривиальной. Безусловно, существуют алгоритмы, которые позволяют осуществлять факторизацию несколько эффективнее, чем простым перебором делителей, но однозначно оптимального алгоритма, позволяющего быстро решить эту задачу для больших чисел, пока не изобрели.
Проблема факторизации чисел занимала умы ученых еще сотни лет назад. Одним из первых, кто занялся этой задачей, стал французский математик Пьер де Ферма. Еще в 1643 году он предложил свой метод факторизации, который используется для криптоанализа шифров RSA и в наши дни. Понятно, что для любого алгоритма шифрования всегда найдутся люди, которые будут искать возможности для эффективной атаки на него. Кто-то в преступных целях, а кто-то в научных – чтобы исследовать криптостойкость алгоритма и защитить проекты, базирующиеся на данном решении. Еще в середине 2000-х гг. стали появляться сообщения о том, что группа ученых того или иного университета взломала сначала 512-битный, а затем и 1024-битный ключ RSA. При этом они не задействовали какую-то исключительную вычислительную мощность, а для решения задачи им потребовалось вполне разумное время. Конечно, ни один, даже самый мощный компьютер, с такой вычислительной нагрузкой в одиночку не справится, поэтому для решения подобных задач компьютеры обычно объединяют в специальные вычислительные кластеры.
За последние десять лет вычислительная мощность компьютеров заметно выросла. Согласно закону Мура, производительность компьютерных процессоров удваивается каждые 18 месяцев, поэтому для поддержания криптостойкости алгоритма RSA в различных технологических решениях необходимо постоянно увеличивать длину открытого ключа. Поскольку до бесконечности этот процесс продолжаться не может, от данного алгоритма стали отказываться и переходить к более прогрессивным решениям, в которых достаточная криптостойкость поддерживается для ключей с разумной разрядностью – в пределах 256–1024 бит. Одним из таких стал алгоритм формирования цифровой подписи DSA, построенный на модели дискретного логарифмирования. В данном алгоритме используется так называемая модульная арифметика, которая представляет собой задачу поиска степени, в которую необходимо возвести заданное число, чтобы, разделив результат по модулю на другое заданное число, получить желаемый остаток от деления. Чтобы стало понятнее, рассмотрим следующий пример:
Деление по модулю – это обычное деление целых чисел друг на друга с целым остатком. Подобную арифметическую операцию проходят в младших классах школы, непосредственно перед изучением дробей. После чего про деление с остатком благополучно забывают и не вспоминают до университетского курса высшей математики. Где неожиданно выясняется, что деление с остатком на самом деле играет довольно важную роль в теории чисел и алгебре. В нашем примере мы должны определить, в какую степень нам надо возвести тройку, чтобы потом, разделив полученный результат по модулю на 17, получить число 13 в качестве остатка от деления. Правильный ответ: x = 4. То есть 34 = 81, 81/17 = 4 + остаток 13 (проверка: 4 x 17 = 68 + 13 = 81). Довольно просто, не правда ли? Возводя тройку в различные степени x от единицы и более, а затем деля по модулю полученный результат на 17, мы будем каждый раз получать различные остатки от деления. Однако у них будет одно общее свойство – все эти остатки будут находиться в диапазоне от 1 до 16 включительно, но выстраиваться отнюдь не по порядку (по мере последовательного возрастания степени x). Множество этих чисел называется кольцом вычетов. Кольцом, потому что остатки будут постоянно повторяться для разных показателей степени, в которую возводится базовое число. А теперь представим, что мы оперируем не одно-двухразрядными, а очень большими числами. В этих случаях, если степень заданного числа нам заранее неизвестна, то задача ее нахождения для конкретных величин остатков становится очень и очень сложной. Именно эта сложность и лежит в основе алгоритма DSA.
Как уже упоминалось выше, все подобные алгоритмы шифрования построены на принципе, при котором задача в одну сторону решается очень быстро и просто, а в обратную – исключительно сложно. И алгоритм DSA – не исключение. Если мы будем решать задачу для больших чисел путем простого перебора различных значений, то данный метод будет работать очень медленно. Поэтому вместо обычного перебора были разработаны алгоритмы, которые решают эту задачу гораздо эффективнее. Настолько эффективно, что, принимая во внимание постоянное увеличение производительности современных компьютеров, математики вынуждены были задуматься о необходимости повышения сложности алгоритма шифрования. В противном случае они могли бы столкнуться с проблемой массового взлома шифров уже в относительно недалеком будущем.
Чтобы придать задаче существенное усложнение, в 1985 году был разработан алгоритм дискретного логарифмирования на базе эллиптических кривых (алгоритм ECDSA). О чем в данном случае идет речь и что это за кривая? Эллиптическая кривая – это множество точек, описываемое уравнением y2 = x3 + ax + b. То есть, по сравнению с алгоритмом DSA, операции совершаются не над кольцом целых чисел, а над множеством точек эллиптической кривой, что существенно усложняет задачу восстановления закрытого ключа из открытого. Вот пример обычной эллиптической кривой:
На множестве точек эллиптической кривой могут выбираться такие точки, для которых возможно совершить операцию сложения самих с собой и получить результат в виде другой точки на этой же кривой. То есть решить уравнение X = nP, где n = 2 и более, а X и P являются точками на данной кривой с координатами по осям x и y. Умножение на константу n есть не что иное, как операция последовательного сложения n раз. Таким образом, мы начинаем с того, что нам необходимо сложить начальную точку с ней же самой и получить результат в виде такой же точки, но уже с новыми координатами. Геометрически операция сложения точки эллиптической кривой с самой собой представляет построение касательной к данной точке. Затем мы находим точку пересечения касательной с графиком кривой и строим от нее вертикальную прямую, находя таким образом точку ее пересечения на обратной стороне кривой. Эта точка и будет результатом сложения. Вот как выглядит операция сложения точки с самой собой геометрически:
После чего, уже при следующей итерации, исходной точкой будет являться та, которая была получена в виде результата сложения на предыдущем шаге. Именно от нее мы строим новую касательную, и так далее – n раз. Сложность задачи состоит в обратном поиске n для известных точек X и P, и эта задача не имеет быстрого решения. В данном случае n будет закрытым ключом, а X – открытым. Понятно, что компьютер при расчетах осуществляет операцию сложения не геометрически, а чисто алгебраически, для чего существуют специальные формулы на базе имеющихся координат по осям x и y для каждой из точек.
Отдельно отметим, что далеко не все формы эллиптических кривых подойдут для формирования на их базе криптографических алгоритмов. Существуют довольно «слабые» в этом аспекте эллиптические кривые, которые неустойчивы к различным алгоритмам решения задачи дискретного логарифмирования. Поэтому, чтобы эллиптическая кривая была пригодна для сложных криптографических задач, она должна удовлетворять различным требованиям, которые мы здесь рассматривать не будем, чтобы излишне не усложнять описание общих принципов.
В теории алгоритмов выделяют различные категории сложности решения математических задач: полиномиальную, субэкспоненциальную и экспоненциальную. Сложность алгоритма дискретного логарифмирования на базе эллиптических кривых растет с экспоненциальной скоростью. До сих пор не разработано ни одного решения данной задачи даже за субэскпоненциальное время. То есть за время, пропорциональное функции, которая растет медленнее, чем любая степенная функция. Именно поэтому данный алгоритм получил в наши дни наиболее широкое применение как достаточно криптостойкая модель, использующая ключи с относительно небольшой разрядностью. Если мы сравним вышеописанные алгоритмы между собой, то для случая, когда длина открытого ключа RSA или обычного DSA, например, будет равна 1024 бит, алгоритму, использующему эллиптические кривые для достижения сопоставимой криптостойкости, достаточно будет иметь разрядность всего 160 бит. Разница в эффективности очевидна, поэтому самые популярные блокчейн-проекты, такие как Биткоин или Ethereum (да и многие другие), используют именно криптографию на эллиптических кривых, признанную на текущий момент самой надежной.
Помимо собственно процедуры шифрования данных важнейшим элементом, связанным с шифрованием, в технологии блокчейн является цифровая электронная подпись (ЭЦП). Что это такое и каким образом она используется?