Симметричное хеширование что это
Одним из ключевых слов, которые новички слышат, когда узнают о блокчейне, являются понятия хэша и алгоритма хэширования, которые кажутся распространёнными для безопасности. Запуск децентрализованной сети и консенсуса, такой как биткойн или сеть эфириум с десятками тысяч узлов, соединенных через p2p, требует, как “надежности”, так и эффективности проверки. То есть, эти системы нуждаются в способах кодирования информации в компактном формате, позволяющем обеспечить безопасную и быструю проверку ее участниками
Криптографические хэши используются везде, от хранения паролей до систем проверки файлов. Основная идея состоит в том, чтобы использовать детерминированный алгоритм (алгоритмический процесс, который выдает уникальный и предопределенный результат для задачи входных данных), который принимает один вход и создает строку фиксированной длины каждый раз. То есть, использование одного и того же ввода всегда приводит к одному и тому же результату. Детерминизм важен не только для хэшей, но и для одного бита, который изменяется во входных данных, создавая совершенно другой хэш. Проблема с алгоритмами хэширования - неизбежность коллизий. То есть, тот факт, что хэши являются строкой фиксированной длины, означает, что для каждого ввода, который мы можем себе представить, есть другие возможные входы, которые приведут к тому же хэшу. Коллизия - это плохо. Это означает, что, если злоумышленник может создавать коллизии, он может передавать вредоносные файлы или данные, как имеющие правильный и неправильный хэш и скрываться под правильным хешем. Цель хорошей хэш-функции состоит в том, чтобы сделать чрезвычайно сложным для злоумышленников найти способы генерации входных данных, которые хешируются с одинаковым значением. Вычисление хэша не должно быть слишком простым, так как это облегчает злоумышленникам искусственное вычисление коллизий. Алгоритмы хэширования должны быть устойчивы к «атакам нахождения прообраза». То есть, получая хеш, было бы чрезвычайно сложно вычислить обратные детерминированные шаги, предпринятые для воспроизведения значения, которое создало хэш (т.е нахождение прообраза).
Напомним, что «хорошие» алгоритмы хэширования имеют следующие свойства:
- Изменение одного бита во входных данных должно создать эффект изменения всего хеша;
- Вычисления хеша не должно быть слишком простым, высокая сложность нахождения прообраза;
- Должен иметь очень низкую вероятность коллизии;
Вы когда-нибудь слышали о том, что если вы поместите 23 человека в комнату, есть 50% шанс, что у двух из них будет один и тот же день рождения? Доведение числа до 70 человек в комнате дает вам 99,9% шанс. Если голуби рассажены в коробки, причем число голубей больше числа коробок, то хотя бы в одной из клеток находится более одного голубя. То есть фиксированные ограничения на выход означают, что существует фиксированная степень перестановок, на которых можно найти коллизию.
На самом деле MD5 настолько слаб к сопротивлению к коллизиям, что простой бытовой Процессор Pentium 2,4 ГГц может вычислить искусственные хэш-коллизии в течение нескольких секунд. Кроме того, его широкое использование в более ранние дни текущей сети создало тонны утечек MD5 предварительных прообразов в интернете, которые можно найти с помощью простого поиска Google их хэша.
NSA (Агентство национальной безопасности) уже давно является пионером стандартов алгоритмов хэширования, с их первоначальным предложением алгоритма Secure Hashing Algorithm или SHA1, создающий 160-битные выходы фиксированной длины. К сожалению, SHA1 просто улучшил MD5, увеличив длину вывода, количество однонаправленных операций и сложность этих односторонних операций, но не дает каких-либо фундаментальных улучшений против более мощных машин, пытающихся использовать различные атаки. Так как мы можем сделать что-то лучше?
В 2006 году Национальный институт стандартов и технологий (NIST) запустил конкурс, чтобы найти альтернативу SHA2, которая будет принципиально отличаться в своей архитектуре, чтобы стать стандартом. Таким образом, SHA3 появился как часть большой схемы алгоритмов хэширования, известной как KECCAK (произносится Кетч-Ак). Несмотря на название, SHA3 сильно отличается своим внутренним механизмом, известным как «конструкция губки», которая использует случайные перестановки для «Впитывания» и «Выжимания» данных, работая в качестве источника случайности для будущих входов, которые входят в алгоритм хэширования.
Когда дело дошло до интеграции алгоритма хеширования в блокчейн протоколы, биткоин использовал SHA256, в то время как Ethereum использовал модифицированный SHA3 (KECCAK256) для своего PoW. Однако важным качеством выбора хэш-функции для блокчейна с использованием доказательства работы является эффективность вычислений указанного хэша. Алгоритм хеширования биткойна SHA256 может быть вычислен достаточно просто с помощью специализированного оборудования, известного как специализированные интегральные схемы (или ASIC). Много было написано об использовании ASIC в майнинг пуле и о том, как они делают протокол направленным на централизацию вычислений. То есть доказательство работы стимулирует группы вычислительно эффективных машин объединяться в пулы и увеличивать то, что мы обозначаем “хэш-мощностью”, или мерой количества хэшей, которые машина может вычислить за интервал времени. Ethereum, выбрал модифицированный SHA3 известный как KECCAK 256. Кроме того, алгоритм PoW в Ethereum - Dagger-Hashimoto, должен был быть трудно вычисляемым для аппаратного обеспечения.
SHA3 не был единственным прорывом, который вышел из конкурса хеширования NIST в 2006 году. Несмотря на то, что SHA3 выиграл, алгоритм, известный как BLAKE, занял второе место. Для реализации шардинга Ethereum 2.0 использует более эффективное. Алгоритм хэширования BLAKE2b, который является высокоразвитой версией BLAKE от конкурентов, интенсивно изучается за его фантастическую эффективность по сравнению с KECCAK256 при сохранении высокой степени безопасности. Вычисление BLAKE2b фактически в 3 раза быстрее, чем KECCAK на современном процессоре.
Кажется, что независимо от того, что мы делаем, мы просто либо (1) увеличиваем сложность внутренних хеш-операций, либо (2) увеличиваем длину хеш-выхода, надеясь, что компьютеры атакующих не будут достаточно быстрыми, чтобы эффективно вычислять ее коллизию. Мы полагаемся на двусмысленность предварительных прообразов односторонних операций для обеспечения безопасности наших сетей. То есть цель безопасности алгоритма хеширования состоит в том, чтобы сделать как можно более сложным для любого, кто пытается найти два значения, которые хешируются на один и тот же вывод, несмотря на то, что существует бесконечное количество возможных столкновений. «Как насчет будущего квантовых компьютеров? Будут ли алгоритмы хэширования безопасными?» Короткий ответ и текущее понимание заключаются в том, что да, алгоритмы хэширования выдержат испытание временем против квантовых вычислений. То, что квантовые вычисления смогут сломать, - это те проблемы, которые имеют строгую математическую структуру, основанную на аккуратных трюках и теории, такой как шифрование RSA. С другой стороны, алгоритмы хэширования имеют менее формальную структуру во внутренних конструкциях. Квантовые компьютеры действительно дают повышенную скорость в вычислении неструктурированных проблем, таких как хэширование, но в конце концов, они все равно будут грубо атаковать так же, как компьютер сегодня попытается это сделать. Независимо от того, какие алгоритмы мы выбираем для наших протоколов, ясно, что мы движемся к вычислительно-эффективному будущему, и мы должны использовать наше лучшее суждение, чтобы выбрать правильные инструменты для работы и те, которые, мы надеемся, выдержат испытание временем.
Дмитриев Марк - Технический аналитик и управляющий криптоактивами инвестиционного фонда GT Blockchain Investments
Три кита криптографии — хеш, шифрование симметричное, шифрование асимметричное (с открытым ключом). Основываются криптографические алгоритмы на сложности вычисления больших чисел, но подробнее об этом, если вас конкретно интересует «начинка», стоит читать не в общих обзорах, именуемых ликбезом. Здесь же содержится простое изложение, без лишних заморочек, то есть поверхностное.
Хеш — функция, функция «в одну сторону», так как восстановить данные, из которых путем хеширования получен хеш (результат хеш-функции), невозможно. На вход подается информация, на выходе имеем её отпечаток, строку фиксированной длины. Подобрать входные данные, которые дадут такой же результат должно быть сложной задачей. Отсюда следствие — если у вас есть проверенный хеш образа диска, документа и т.п., то вы можете вычислить хеш полученного файла и сравнить — если совпадут, значит это то самое. Подобным же образом обходятся зачастую с паролями — если хеш полученного пароля совпадет с имеющимся (в /etc/shadow к примеру), то проверка пройдена успешно.
Шифрование симметричное — шифрование в котором используется, соответственно, симметричный ключ. Это говорит о том, что если вы что то архиважное зашифровали один ключом, то обратную операцию надо проделать им же. Также может использоваться при проверке знания секрета — шифруем некую информацию этим самым секретом, или его хешем, передаем результат второй стороне. Вторая сторона, которая как предполагается знает секрет, расшифровывает данные, их дополняет, шифрует, пересылает обратно. Первая сторона, получив ответ опять же его расшифровывает и смотрит правильно ли вторая сторона изменила данные. Понятно, что если вторая или первая сторона подсовывает неверный секрет, процесс сорвется. Это было весьма общее описание процессов происходящих в протоколе Kerberos.
Аутентификация, немного о криптографической стороне дела
Зачастую аутентификация основывается на проверке знания секрета. Самый простой способ это получить от вас пароль в чистом виде (!) и сравнить с хранящимся в базе. Тут есть вариант — проверять хеш пароля, что позволит не знать пароль серверу, а хранить его хеш. Но заметьте — пароль проходит в открытом виде по сети! Второе — вы не знаете кому отправили свой пароль, сервер может быть подставным. Обходной маневр — использовать только в связке с SSL/TLS, но в таком случае у сервера должен быть корректный, не просроченный сертификат, выданный доверенным центром, а не как обычно.
Второй вариант — сервер знает секрет, вы его знаете — используется метод, описанный в абзаце по симметричному шифрованию. Это лучше чем сравнение с запомненным хешем — пароль по сети не бегает вообще, сервер так же не получает ваш секрет — вы проводите с сервером взаимную аутентификацию. На этом методе вырос весьма серьезный протокол — Kerberos, с одним нюансом — пароли знают только выделенные сервера в сети. Kerberos используется в Microsoft Active Directory, в качестве примера привожу как самый известный продукт — все таки у нас ликбез.
Третий вариант, сложный, PKI. За рамки ликбеза его описание выходит, интересно — почитайте сами. По сути схож с Kerberos — есть центр, но основан на асимметричном шифровании.
Плюсы и минусы симметричного шифрования
Самыми главными плюсами симметричного шифрования является его скорость и простота реализации. За счёт этого оно хорошо подходит для хранения и обработки больших объёмов данных. На этом, собственно, плюсы — всё. Что касается минусов. Самая главная его проблема — это обмен ключами. Ведь у каждого участника должен быть один и тот же ключ. А его нужно как-то передать, по какому-то каналу связи. А это означает ровно одно — этот ключ можно перехватить. Соответственно даже самый лучший алгоритм надёжен ровно настолько на сколько надёжен канал передачи ключей. Кстати, из-за того что ключ известен каждой стороне, использование симметричного шифрования делает невозможным подтверждение аутентичности и авторства данных. Т.к. невозможно сформировать цифровую подпись.
Аутентификация и авторизация
Аутентификация это процесс установления личности. Когда вы вводите пароль на Хабр, вы аутентифицируетесь. Никаких прав вы при этом не получаете.
Авторизация это процесс, в котором проверяются права пользователя на выполнение каких либо действий в системе. Например по умолчанию вы имеете право писать в личный блог, но система не даст вам опубликовать хабратопик в коллективный блог, если у вас будет мало кармы. Здесь авторизация на совершение какого либо действия производится по количеству кармы, в файловых системах вам выдают право на совершение действий через ACL, членство в группе и так далее.
Еще раз — через процесс аутентификации получить право на выполнение чего либо нельзя, этим занимается процесс авторизации, а аутентификация только устанавливает личность.
Симметричное шифрование
В свою очередь, само симметричное шифрование можно разделить на два подвида. Это блочные и поточные шифры.
Kerberos
Алгоритм описан с некоторыми отступлениями, для улучшения восприятия. Если вам потребуется точное описание работы, не для общего сведения, советую почитать более серьезную литературу
Каждый день, работники корпоративного сектора активнейшим образом используют квинтэссенцию криптографической мысли — протокол Kerberos, бороздя просторы корпоративной же сети построенной на базе решений от Microsoft, ведь все процессы идентификации пользователей и компьютеров сервисами (IMAP,SMTP, доступ к файлам) он берет на свои плечи.
Протокол Kerberos это протокол аутентификации использующий хеш-функции и симметричные шифры. Как ни удивительно, но Kerberos это не очередное порождения Microsoft в стремлении «чтобы свое, и чтобы ни с чем не совместимо, и чтобы они нам душу отдали за спецификации», создан протокол в стенах массачусетского технологического института — MIT, где активно используется все эти годы в кампусной сети ВУЗа.
Перечитайте описание симметричных шифров, в конце там есть пример. Так вот в чем недостаток решения, предложенного в том абзаце? А получается, что пароли надо размещать на каждом сервере сети, да еще каждой службе надо будет иметь к ним доступ, к незашифрованым паролям, да еще на каждый сервер эти пароли надо внести. Выглядит это несколько дыряво.
В протоколе Kerberos для хранения паролей выделен отдельный сервер — Key Distribution Center (сервер распределения ключей), ключи есть у каждого участника процесса — и у пользователей и у сервисов. Ключ получается из пароля путем хеширования, так как пользователь не сможет запомнить требуемое для алгоритма шифрования количество символов. Хеширование возвращает всегда строку фиксированной длины, что как раз подходит для алгоритмов шифрования с симметричным ключом.
KDC генерирует случайный, симметричный ключ и делает достаточно сложную конструкцию, называемую билетом, которую лучше посмотреть на картинке:
Теперь у обоих есть общий ключ. И вот теперь можно аутентифицировать друг друга, способ уже описан — шифруем полученным от KDC, сгенерированным ключом имя пользователя, IP адрес, время и отсылаем серверу. Сервер расшифровывает, и получив ожидаемое имя пользователя признает в нем Пупкина. Теперь очередь сервера представиться — он прибавляет к полученному времени 1 (единицу) и, зашифровав все обратно, отсылает пакет пользователю. Ясно, что если в полученном пакете, после дешифрации будет обнаружена та же временная метка, которую пользователь отсылал, но увеличенная на единицу, то сервер признается подлинным.
А вот про время я упомянул не зря. Доступ выдается на определенное время (часто на 10 часов), время проставляется в билете, и по истечении срока действия билет считается просроченным — сервер больше такой билет не примет, что впрочем не смертельно — получите новый. Гораздо печальнее будет, если время на вашем ПК разойдется более чем на 5 минут с KDC — войти в систему не сможете, так как протокол Kerberos требует от участников процесса синхронного времени — чтобы билеты истекали на всех машинах сети одновременно, и не было возможности использовать просроченный билет для доступа куда либо.
Итак, билет действует 10 часов, не требуя больше ввода пароля, для обращения к серверу. Но ведь так утомительно вводить пароль на каждый сервер в сети, тем более, что вы могли заметить — никто так не делает, после одного ввода пароля при логине в Windows вы больше не вводите пароли на доступ к расшареным сетевым папкам. А все от того, что получать билеты ведь тоже можно по билету! Подобная конструкция называется TGT — билет для получения билетов. Тут все так же как и было показано, получаем билет на доступ к сетевой службе, выдающей билеты (TGS — Ticket-Granting Service), которая признает Пупкина Пупкиным. А раз Пупкин это Пупкин, то можно ему выдавать билеты на Пупкина для доступа к различным серверам сети.
Таким образом, в течении действия TGT вы можете получать билеты на доступ к сетевым службам без повторного ввода пароля. Удобно работает, правда?
Заметьте, что Kerberos выдает билеты на доступ к любой службе сети, есть ли у вас право ей пользоваться или нет, протоколу аутентификации безразлично — его дело удостоверить вашу личность, а правами занимаются совсем другие механизмы.
P.S. В остальных ОС Kerberos также работает. Windows в качестве примера выступает из-за большей распространенности, и, как следствие, большей наглядности в повседневной жизни.
P.P.S. В комментариях есть ссылки на более подробное изложение некоторых аспектов, если интересно узнать больше и подробнее — читайте.
Привет всем читателям Хабра! Не так давно решил разобраться с алгоритмами шифрования и принципами работы электронной подписи. Тема, я считаю, интересная и актуальная. В процессе изучения попробовал несколько библиотек, однако самой удобной с моей точки зрения является библиотека PyCrypto. У неё прекрасная документация, сопровождаемая примерами.
После прочтения материала вы усвоите следующие моменты:
- Что такое шифрование;
- Чем отличается симметричное шифрование от асимметричного;
- В каком случае эффективнее применять симметричное, а в каких асимметричное шифрование;
- Что такое хеш данных и для чего он используется в шифровании;
Целью данной статьи является познакомить читателя с основными алгоритмами шифрования. При написании статьи, я постарался как можно большее внимание уделить вопросу практического применения. Для программирования использовался язык Python 3.6. При написании кода старался делить его на отдельные части и комментировать все ключевые моменты.
В данной статье я не разбирал цифровую подпись, однако после понимания асимметричного шифрования смысл этой технологии станет понятен.
Абсолютно стойкие шифры
И возникает логичный вопрос. Если существуют абсолютно стойкие системы, то почему бы их не использовать? И проблема защиты информации будет решена. Но не тут-то было. Потому что абсолютно стойкие системы существуют только на бумаге. В виде теорем и прочей теоретической тошниловки. А использовать их на практике невозможно, в виду нереальной сложности и огромной стоимости шифрующего оборудования. Чтобы было понятней, даже государства, которые, казалось бы, обладают огромными ресурсами, не смогли до сих пор внедрить использование абсолютно стойких систем. Из этого всего, вполне логичным, будет вывод, что чем надежнее шифр тем труднее и дороже его использование в практических целях. А соответственно наиболее важна не надежность шифра, а возможность его применения. Т.е. соотношение надежности и цены.
Сюжет
Целью разведгруппы являются любые данные, которые могут пролить свет на конфигурацию, вооружение и назначение будущей станции. Для хранения данных планируется разработать специальное оборудование и ПО.
Штаб утвердил два варианта этой операции:
План А — возвращение агентов с данными повстанческим силам;
План Б — дистанционная передача планов с самой Звезды смерти, используя оборудование станции. Передача информации при этом будет быстрой, но после передачи агент вероятнее всего будет вычислен и пойман.
Вы являетесь программистом в команде, которая отвечает за разработку ПО.
При планировании операции рассматриваются несколько возможных негативных сценариев:
- Противник перехватит сигнал, поймет по его содержимому о планировании атаки и уведет объект ближе к лояльным Империи силам. В этом случае потери среди сопротивления будут выше;
- Один из шпионов будет пойман и на допросе раскроет план операции, что может привести к компрометации ключей шифрования (про них будет сказано ниже);
- Шпион с загружеными данными может быть перехвачен имперскими силами, которые внесут изменения в содержимое, дезинформируя сопротивление о слабых местах станции. В этом случае, при атаке флот повстанцев будет направлен в ложном направлении и постепенно уничтожен;
- Содержимое должно быть надежно зашифровано и защищено от изменений;
- В случае утери ключей шифрования или их компрометации, должна быть возможность получения новых ключей шифрования дистанционно на частоте, которая может прослушиваться противником.
Шифрование информации
Давайте решим проблему шифрования информации:
Для шифрования и дешифрования информации используется ключ шифрования. Именно ключ делает шифрование обратимым. Каждый агент будет снабжен ключом шифрования. После загрузки данных агент произведет их шифрацию и отправку в штаб сопротивления.
Асимметричное шифрование для кодирования данных использует два связанных друг с другом ключа: открытый и закрытый.
Механизм действия такой:
Давайте приступим в программированию! Для разработки необходимого ПО мы будем использовать библиотеку Python под названием pycrypto. У нее отличная документация и в ней представлены все распространенные алгоритмы шифрования.
Для начала разработаем функционал для симметричного шифрования по названием Advanced Encryption Standard (AES). Он является одним из самых распространённых алгоритмов симметричного шифрования.
Хеш документа — это просто строка из символов, которая уникальна для какого-либо набора данных. При любом изменении данных хеш очень сильно меняется. Другими словами, хеш — это своеобразный «отпечаток пальца» для какого-либо набора данных.
Но что делать, если ключи шифрования будут по каким-то причинам скомпрометированы? Тогда расшифровать информацию может кто угодно.
Будет правильно, если до отправки агентов штаб сгенерирует несколько пар ключей и назначит каждому агенту закрытый ключ. Лучше сгенерировать именно несколько пар, чтобы у каждого агента был индивидуальный ключ. Это необходимо, чтобы точно персонифицировать владельца ключа.
Тогда в случае компрометации ключей центр создаст новый СИММЕТРИЧНЫЙ ключ, закодирует его каждому агенту открытыми ключами и отправит по открытому каналу.
- Агент сгенерирует пару ключей (открытый и закрытый) на месте, затем отправит открытый ключ повстанческим силам;
- В штабе сопротивления создадут новый ключ для СИММЕТРИЧНОГО шифрования;
- Симметричный ключ закодируют при помощи открытого ключа, который прислал агент;
- Зашифрованный симметричный ключ отправят агенту, который раскодирует его с помощью закрытого ключа.
- Агент отправляет ОТКРЫТЫЙ ключ из пары, ЗАКРЫТЫЙ ключ находится у него;
- Штаб сопротивления отправляет ключ симметричного шифрования, зашифрованный присланным агентом открытым ключом.
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA4JDLu7Vtvg2yqbH6Y0eJPfoEsOlKzgmOodqhA1CqkEG4OpKi
sGW7ciGP4v37GE6edHBCEy4UNkVQtnpPBjzTHvKd1pO70B84vD5OSrS7uNw2EYkj
d/ZwhrJMrcQKRwPkkM4OiewaaAaK0vPWJIKwlW61DY9X7LfNz7aOKMTbKnm1vdR0
919AV98FUmNoQBgka6nXFGmNbi7D43MtLwxBZIXfFupEiANSvOs+57hgaCho7OWM
GUOjLkG6HBscPhJ2W1H5DU9GjwL24ynTvKifgo1/2ue61MV1Pzh5CVaicJKNaRtg
Pd99gFhBGINsXV2X6Jh/W5nNsCddU4EI0AlO8wIDAQABAoIBAARM4YnjrIlSK9Sy
EtBp40frjMFyhjsx1ahlzmWI2utORt/gRPtJx3AlEmNPZ8qMXt5t8+X4IOz1INmN
uAuviH90N++O/q66mlSIgOlPUrT0ipiFXseCUZ9StMMzGNtJSMw5FfAwNEU/stLd
VoF2ezkxWIg88XsX/fn3Tfub4XKLvu4raJGcJ+Fo2GI9hYEGKnHhSuHvDHekTLlQ
z46O+cIwtehbFGcKesyK3zDD1uP5YLPIWpiqt1TgKjJzRF0l4ZJLk+RT7kU2pGIQ
mosOnr+06WyMIg724yQyAIwtS9X0czKBGUESrtTTb1HCXLeTwnncOTxh6q2z42LF
tn34+DECgYEA6EEp4oTvjfTQfUQPMByuAjF1hpdFHQqRymygiFgoF+Mg3QmL0w8j
/84H/q7s8FSx+3th8MK87bFq4lrry+h/mYwmvF5zZbhxcnl2uaX+KUPgpT6TgvAo
WOv2wc4BSaoo9DrxrZId86vpO2qbopw6gkBsvw47HSoQ+FSqXtZ0p8kCgYEA94Zj
b1ulctUjybiszO93TAjkzx3lU3yL+B1eZiQXtJa3mgG+ka1R/uMfr0NlT+Jzo0My
wHV30YRJDxziCrDol9OgSSU0sXwEcUxUIBLBwXLCp1EmMsYG9PB/x4OTWve35a8F
O+rMxuvWaZeIOfVCfL8UEcWweYaVdWIonJN+ltsCgYEAjeSZ2UlMLZce9RjqioNL
EA31dlfeoqJ9dYUuAn6RaB6cSk51vWlnnfXazo9CNIYaAsFbkcL3t+QHn+jaXEZc
BowocjbmG4Q20zBAB6XRBJbynSIA7yMYE1N9+uOHx+CMisGkO12krOUfZex4zzzR
RhhkF8ly9htoKL9ZIv20YXkCgYBzH3UF6PkVZJ5lhtgP5Nx2Z7iLwBrV7ppnBrnO
BcFkw6iXH3KT7KmzQ82LxWvMcMVZzLpBGyFkOAOG3OchE9DKNKpa+sv8NHMYguip
li+5mneAPFTozoOTznuPvtl9OLO2RuXHTVh6uFub9tdsJW8L+A8MiQagLwE6fDHp
SQxaewKBgQDIyzL1THpW3+AMNrOZuI/d3Em5wpGJiZbDSBRosvsfGm/sHaz4Ik5E
nWnftgktmsAD60eORTTh9/ww/nm7f3q9kzT8Sv1MmqeRXq9VFIOeP/+8SSE/7LzD
izlb5xEtVD8LuY54jHyiOxiZC++TQswMnOKKi0Gx26MDoO7Tx9akVw==
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4JDLu7Vtvg2yqbH6Y0eJ
PfoEsOlKzgmOodqhA1CqkEG4OpKisGW7ciGP4v37GE6edHBCEy4UNkVQtnpPBjzT
HvKd1pO70B84vD5OSrS7uNw2EYkjd/ZwhrJMrcQKRwPkkM4OiewaaAaK0vPWJIKw
lW61DY9X7LfNz7aOKMTbKnm1vdR0919AV98FUmNoQBgka6nXFGmNbi7D43MtLwxB
ZIXfFupEiANSvOs+57hgaCho7OWMGUOjLkG6HBscPhJ2W1H5DU9GjwL24ynTvKif
go1/2ue61MV1Pzh5CVaicJKNaRtgPd99gFhBGINsXV2X6Jh/W5nNsCddU4EI0AlO
8wIDAQAB
-----END PUBLIC KEY-----
Как видите, ключи асимметричного шифрования представляют из себя длинные математически сгенерированные последовательности символов.
Итак, мы сгенерировали ключи. Теперь давайте напишем функцию для кодирования данных:
- Агент генерирует пару ключей:
Message: SOME_KEY_asdfasdfasdfasdfsdfgrtwhetynt was encrypted to
41e940507c96397e3feb4a53390c982633bb1775a52957996a8069bd22063086a0e831bf775a17909276aba0d0478ee6c953837c8ea5d20d40e1c8eb463aaa1bc5c93c71677b1a85e90439c9dbda8a98ce168acb38368155437c66815b84aa2fbdda0eb909e4e6079b4410c720eddd955ed048193bf87f8f9976a17ee32a58a71dfddf3db116343d949d29c25f72c511a440a50a5d4f1e01c37b24a1cb4127e191d3231328b2f120c7dbd0cb5bf19823f0978b8ed17d25952de4b146ef9724fff359eb2af503fdfd72b91525a5503b076ba9aaaeac55af3f8d210c12d579d45dd70362123c0b4b36ef9c2f7705e6f884a25553eb0e11e5077f11fa986d0ff280
Привет, друг. Мы с тобой уже рассмотрели немало тем в области работы сетей в целом, и информационной безопасности в частности. И очень часто в своих материалах я упоминал такие слова как криптография, шифрование, алгоритмы шифрования, хэши, ну и всякие словечки наподобие. И, вроде бы, в контексте эти слова были уместны и понятны. Но, я тут подумал, что, на самом деле мало кто понимает, что именно означают эти термины. А уж раскрыть концепцию и принципы работы всего этого — вообще смогут единицы.
И для начинающего, либо для любителя, это вполне нормально. А вот когда люди, считающие себя серьёзными хацкерами, либо анонимусами, с пеной у рта доказывают, что какой-то алгоритм уязвим и пользоваться им нельзя, при этом не могут даже приблизительно сформулировать что такое криптография, алгоритм шифрования, в чём суть уязвимости, а главное уязвимости к чему. Это вызывает снисходительную улыбку. Но ты ведь не хочешь таким быть, правда? Поэтому я решил кратко и, по возможности, понятно рассказать что такое криптография в целом, и шифрование в частности. Я постараюсь не углубляться в теоретические глубины. Потому что криптография бездонна, а сосредоточусь на практической части вопроса. Больше внимания посвящая именно алгоритмам шифрования.
Хеширование
И третий, интересующий нас вид шифрования, это хеширование. Его ещё называют хеш-функция или функция свёртки. Это одностороннее шифрование. При котором, с использованием алгоритма хеширования, начальные данные, независимо от их длины, превращаются в битовую строку фиксированной длины. Именно эта битовая строка и называется хешем. Идеальным считается такой алгоритм хеширования, который делает невозможным обратное преобразование хеша в данные. Т.е. имея на руках хеш — невозможно узнать начальные данные.
При этом, для применения на практике, как раз начальные данные знать и не нужно. Нужно знать, что с использованием определенного алгоритма генерация хэша от какого-то текста создает тот же хэш. Соответственно, мы можем хранить например пароль, в виде хеша. И даже если его украдут — узнать пароль не смогут. А когда пользователь вводит пароль то хеш введенного пароля сверяется с сохраненным хешем, и если они совпали — значит пароль правильный. По такому же принципу может проверяться целостность файлов.
Самая главная проблема хеш-функций называется коллизией. Суть её в том что хеши не всегда уникальны. И иногда, правда очень редко, случаются ситуации, что два разных входных блока дают одинаковый хеш. Именно поэтому основной уязвимостью алгоритмов хеширования считается построение коллизий т.е. их искусственное создание. Для примера именно подобную уязвимость эксплуатировал червь Stuxnet в Windows. Он получал от системы абсолютно белый сертификат, таким способом становясь неуязвимым для антивирусов.
Примеры алгоритмов хеширования: MD4, MD5, SHA1, SHA2.
Ну, а на этом нашу ознакомительную экскурсию в мир криптографии можно считать оконченной. Теперь у тебя есть базовое понимание что такое криптография и алгоритмы шифрования. Но не забывай возвращаться, нам нужно узнать ещё очень много.
Алгоритм шифрования называется шифром, а ключ — это секрет, обычно строка символов, которая позволяет кому-то понять шифр. В шифрах используются два основных типа техник: подстановка и перестановка (также называемая транспортировкой). Шифры подстановки заменяют буквы, цифры и символы открытого текста другими буквами, цифрами или символами. Шифры перестановки используют буквы открытого текста, но меняют их порядок. Для создания сложности эти методы часто комбинируются, наслаиваются друг на друга, подвергаются влиянию внешних данных и изменяются с течением времени.
Две основные техники шифрования, используемые в шифрах, — это подстановка и перестановка (также называемая транспортировкой).
Первые шифры были аппаратными, то есть они запоминались, писались от руки или создавались с помощью нецифровых машин. Однако с появлением компьютеров алгоритмы шифрования на основе программного обеспечения стали доминирующей формой шифрования.
Современная криптография в значительной степени основана на предположениях о вычислительной трудности — представлении о том, что конкретная проблема не может быть решена эффективно. Таким образом, хотя большинство криптографических функций теоретически возможно взломать, на практике их невозможно взломать, учитывая современные ограничения вычислительной техники. Таким образом, современные криптографические алгоритмы стремятся найти правильный баланс между вычислительной эффективностью и вычислительной безопасностью, опираясь на математику и информатику для принятия решений относительно таких факторов, как длина ключа. Именно поэтому многие криптографические функции основаны на времени и бюджете, которые требуются современным вычислительным системам для поиска решений трудноразрешимых математических проблем, таких как проблема дискретного логарифма, проблема факторизации целых чисел и теоретические проблемы эллиптических кривых.
Существует три общих класса современной криптографии на основе программного обеспечения: хэш-функции, симметричное шифрование и асимметричное шифрование.
Хэш-функции преобразуют данные любой длины в фиксированную битовую длину, называемую хэшем. Хэш — это уникальный идентификатор данных, сродни отпечатку пальца, по сути, проверяющий исходный набор данных. Хеширование данных широко используется для индексации данных и эффективного извлечения их из базы данных. Оно также используется для безопасного хранения данных, например, в случае веб-сайтов, которые хранят только соленый хэш паролей пользователей, чтобы предотвратить утечку паролей в случае взлома базы данных.
Самым популярным безопасным алгоритмом хэширования на сегодняшний день является SHA-256, который создает строки длиной 256 бит (т.е. 256 последовательных 1 и 0). 256-битные хэши часто представляются в шестнадцатеричном формате строк, поэтому их длина может составлять 32 или 64 символа. SHA-256 существует в рамках набора хэш-функций SHA-2, пришедшего на смену ныне криптографически неполноценному SHA-1. SHA-3 также был представлен в 2015 году на основе криптографического примитива Keccak.
Изменение одного символа в хэше, например, добавление запятой во втором входе, полностью изменит результат и покажется наблюдателям совершенно случайным.
Наиболее популярным симметричным шифром является Advanced Encryption System (AES). AES предлагает ключи длиной 128, 192 и 256 бит — существенное улучшение по сравнению с 56-битными ключами, используемыми в предыдущем и ныне небезопасном стандарте шифрования данных (DES). Для сравнения, 56-битный ключ имеет 256, или 72 квадриллиона, возможных ключей, которые можно взломать перебором менее чем за 24 часа. В противном случае, для того чтобы перебрать 2 в степени 128 возможных ключей, даже при объединении всех компьютеров мира, потребуется триллионы и триллионы лет.
Наиболее популярными алгоритмами асимметричного шифрования являются RSA (названный в честь его изобретателей Рамиса, Шамира и Адлемана), ECC (Elliptic Curve Cryptography), Diffie Hellman (популярный протокол обмена ключами) и DSS (Digital Signature Standard). Некоторые алгоритмы асимметричного шифрования устойчивы к квантованию, а другие — нет, и в будущем их, возможно, придется модернизировать или отказаться от них.
Блокчейн использует две основные формы криптографии: криптографию с открытым ключом и хэш-функции. Однако все чаще используются и другие криптографические методы для обеспечения масштабирования, конфиденциальности и внешних подключений к блокчейну. Ниже перечислены некоторые способы использования криптографических функций в блокчейн.
Каждый пользователь блокчейна должен иметь пару открытый/закрытый ключ и адрес блокчейна, чтобы отправлять транзакции в сети. Закрытый ключ используется для генерации открытого ключа, а открытый ключ используется для генерации адреса блокчейна — как правило, это хэш открытого ключа с последними 20 байтами, добавленными к префиксу, например 0x. Обратите внимание, что многие блокчейн-кошельки и традиционные биржи абстрагируются от создания пары открытый/закрытый ключ и взаимодействия пользователя с ней.
Адрес блокчейна похож на реальное имя, связанное с банковским счетом пользователя (например, Pay to the Order…), только в блокчейне это псевдоанонимная строка цифр и букв. Адрес блокчейна — это место, где пользователь хранит средства и развертывает смарт-контракты. Закрытый ключ сродни пин-коду, который пользователь должен ввести, чтобы совершить действия со своим счетом, например, перевести средства или внести изменения в смарт-контракты. Открытый ключ похож на номер банковского счета пользователя и используется для проверки подписей закрытого ключа.
Майнеры/валидаторы и полные узлы, которые управляют блокчейном, запускают протокол проверки цифровой подписи, чтобы проверить действительность транзакции. Протокол проверки берет исходные данные транзакции и хэширует их. Он также расшифровывает цифровую подпись с помощью открытого ключа пользователя, чтобы получить хэш. Если эти два хэша совпадают, то транзакция считается действительной. Благодаря сочетанию хэширования и криптографии с открытым ключом для поддержки цифровых подписей блокчейн гарантирует, что только владелец закрытого ключа может получить доступ к средствам, хранящимся на соответствующем адресе блокчейна.
Производство блоков — это процесс, в ходе которого майнеры/валидаторы объединяют ожидающие транзакции в структуры данных, называемые блоками, и предлагают их в сети. Блок обычно состоит из списка всех транзакций, включенных в блок, и заголовка блока, содержащего метаданные блока. Чтобы создать блок, майнер/валидатор должен сгенерировать правильный хэш блока, иначе блок будет отклонен.
В блокчейнах Proof-of-Work (PoW) (например, в Bitcoin) проводится открытое соревнование между майнерами, где первый, кто сгенерирует достоверный хэш (т.е. хэш, начинающийся хотя бы с определенного количества нулей) методом перебора, будет выбран для предложения своего блока в реестр. Блокчейн PoW использует хэш-функции в производстве блоков для обеспечения устойчивости к атакам Сивиллы — защиты от того, что один субъект контролирует процесс производства блоков, подделывая альтернативные личности. Поскольку мощность хэширования — единственный способ для майнера PoW увеличить свои шансы стать автором блока, получение контроля над большей мощностью хэширования в сети сопровождается пропорциональными финансовыми затратами в виде выполнения большего количества вычислений. Это не только предотвращает атаки типа “отказ в обслуживании”, но и требует от майнеров “работы”, чтобы даже получить шанс на вознаграждение.
Блокчейн Proof-of-Stake (PoS), такой как Ethereum 2.0, также генерирует хэши при производстве блоков, но этот процесс специально разработан таким образом, чтобы быть легким, поскольку нет конкуренции между валидаторами. Вместо этого валидаторы PoS обычно выбираются в качестве авторов блоков случайным образом, часто на основе веса их доли. Блокчейн PoS создает устойчивость к атаке Сивиллы, требуя от валидаторов внесения криптовалюты (т.е. ставки) для участия в производстве блоков. Таким образом, валидаторы PoS должны вкладывать финансовые ресурсы, чтобы увеличить свои шансы быть выбранными в качестве автора блока. Зачастую их доля подлежит сокращению (т.е. конфискации), если они нарушают определенные правила протокола, например, включают в свой блок недействительные транзакции или подписывают два блока на одной высоте.
Как правило, правильный хэш блока должен иметь следующие исходные данные:
- Корень Меркла — хэш всех включенных в блок транзакций, содержащийся в структуре данных дерева Меркла.
- Nonce (это сокращение от number used once «число, используемое один раз») — произвольное число/буквенное сочетание, которое создает действительный хэш, удовлетворяющий текущей цели сложности. Блокчейны PoW периодически регулируют сложность угадывания Nonce для достижения определенной частоты блоков (например, каждые десять минут), в то время как в сетях PoS Nonce относительно легко генерируются.
- Дополнительные метаданные блока — в разных блокчейнах они разные, но могут включать в себя следующее: текущую версию программного обеспечения блокчейна, метку времени, целевую сложность майнинга, корень состояния всей цепи или номер текущего блока.
- Хэш предыдущего блока — действительный хэш блока, который был проверен ранее.
Блоки состоят из данных транзакции, корня Меркла, других метаданных блока, действительного ключа (nonce) и хэша предыдущего блока.
Блоки включают хэш-значение предыдущего блока, чтобы криптографически связать их вместе в цепочку, сохраняя хронологический порядок реестра. Именно поэтому блокчейн считается неизменяемым, так как для отмены ранее подтвержденных блоков, называемых реорганизацией блоков или просто реорганизацией, потребовалось бы много вычислительной мощности и/или финансовых рисков. Даже если изменяется только одна транзакция в блоке, меняется весь хэш этого блока, и, таким образом, другие узлы могут легко заметить его. Обратите внимание, что не все перерегистрации являются злонамеренными; например, перерегистрации 1 блока на вершине цепочки более распространены из-за асинхронных сетевых условий. Однако глубокие перерегистрации могут быть более спорными, и их значительно сложнее осуществить, чем дальше назад они происходят.
В блокчейне PoW майнерам приходится заново генерировать достоверные хэши для всех заменяемых блоков, чтобы провести атаку на перестройку, а в это время другие майнеры тратят вычислительные ресурсы на добавление новых блоков к последнему блоку. Именно здесь вступает в игру логика консенсуса Накамото, согласно которой “самая длинная цепочка с наибольшим количеством работы является действительной”, поскольку она предоставляет майнерам простой способ определения действительной версии реестра.
Именно благодаря этой логике блокчейн PoW имеет вероятностную окончательность, так как чем дальше назад пытаются внести изменения, тем меньше вероятность того, что атака будет успешной. Из вероятностной окончательности вытекает понятие атаки 51% — майнерам требуется 51% или более мощности хэширования, чтобы провести более глубокую атаку на реорганизацию или цензуру блоков других майнеров. Вероятностная окончательность также является причиной того, что централизованные криптовалютные биржи обычно разрешают пользователям тратить внесенные средства только после того, как будет добыто определенное количество последующих блоков поверх блока, включающего их транзакцию (например, обычно 6 блоков в Bitcoin, 32 блока в Ethereum). Это помогает предотвратить атаки двойной траты — когда одна и та же единица валюты обманным путем тратится более одного раза.
В сетях PoS всем или части валидаторов, не производящих в данный момент блоки, часто поручается подтвердить достоверность новых блоков с помощью механизма голосования. Валидатор, пытающийся провести перегруппировку, должен подвергнуть риску свою финансовую долю, причем штраф за нарушение децентрализованного консенсуса (обычно >2/3 валидаторов) увеличивается тем больше, чем глубже атака. Эта обобщенная модель PoS придает криптоэкономические свойства таким алгоритмам консенсуса, как Practical Byzantine Fault Tolerance, Tendermint, Casper и HotStuff.
Некоторые блокчейны PoS также имеют ограничение на то, как далеко назад может быть изменена главная книга блокчейна, по существу устанавливая контрольную точку, в которой каждая транзакция до нее имеет явную окончательность. Например, при объединении цепочки маяков PoS в текущую сеть Ethereum производство и проверка блоков будут разделены на эпохи, причем каждая эпоха имеет 32 слота длиной 12 секунд каждый. В течение каждой эпохи все валидаторы случайным образом делятся на комитеты размером не менее 128, при этом валидаторы в каждую эпоху перемешиваются. Во время каждого слота валидатор предлагает блок, а валидаторы из одного или нескольких комитетов подтверждают этот блок. Это сделано так, чтобы валидаторы подтверждали один предложенный блок за эпоху.
Производство и проверка блоков Ethereum 2.0 будут разбиты на эпохи с 32 слотами, где блок может быть предложен и засвидетельствован в каждом слоте.
В конце каждой эпохи блоки в рамках предыдущей эпохи считаются обоснованными, если их обоснованность подтверждают не менее двух третей всех валидаторов (т.е. супербольшинство). Если две предыдущие эпохи подряд оправданы, то первая эпоха становится завершенной. При идеальных условиях сети и участии валидаторов завершение транзакции происходит в среднем около 14 минут. После того как эпоха завершена, правила протокола не позволяют отменить ее без внешнего социального консенсуса.
Криптография
Начнём, как и положено с начала. А в начале всего стоит криптография — это такая наука, причём очень древняя и очень сложная. Исторически сложилось, что основной целью криптографии можно выделить обеспечение конфиденциальности. Т.е. защиты информации от посторонних личностей. И эта цель не менее актуальна и сейчас. Но с развитием информационных технологий, а соответственно с развитием криптографии, начали появляться новые, но не менее важные цели этой науки. Например, к наиболее популярным можно отнести: аутентификацию. Т.е. проверку неизменности ключевых свойств объект (например авторство, дата создания, история изменений и т.д.) и целостность данных. Т.е. невозможность незаметного или не санкционированного изменения информации.
Развивалась криптография, развивались и методы, применяемые этой наукой для достижения результата. Если когда-то, давным-давно, достаточно было использовать алфавитный, а чуть позже цифровой шифр, и чем он был замудрённей тем и надёжней, потому что разгадывать его приходилось в ручную. То с появлением компьютеров, а соответственно серьёзных вычислительных мощностей, эти самые шифры канули в лету. Ввиду их абсолютной уязвимости к анализу и перебору для выявления закономерностей, а соответственно разгадыванию секретного ключа т.е. самого шифра. Этот процесс, кстати, принято называть криптоанализом.
Но кому-то очень умному пришло в голову использовать вычислительные мощности не только для разгадывания ключа, но и для самого шифрования. Именно так начали появляться алгоритмы шифрования в том понимании, в котором их знают сейчас.
Блочные и поточные шифры
Блочный шифр — информация шифруется блоками данных фиксированного размера. Как правило это степени 2 (64, 128 и т.д.). К каждому блоку ключ применяется в несколько раундов подстановки и перемешивания. Таким образом достигается увеличение несоответствия битов между блоками начальных и зашифрованных данных. Именно так работают большинство современных алгоритмов шифрования. Используя, для перемешивания и подстановки сеть Фейстеля или SP-сеть.
Поточный шифр — принцип работы тот же самый, что и у блочного. Только на шифруемый текст предварительно накладывается последовательность случайных чисел и информация шифруется не блоками, а побитово. Этот процесс, кстати, называется гаммированием. Так вот, если блочный шифр запустить в режиме гаммирования — получится потоковый. Правда если перегнуть с этой последовательностью случайных чисел — получишь абсолютно стойкий шифр — круто, но бесполезно.
Примеры наиболее распространённых симметричных шифров:
Плюсы и минусы асимметричного шифрования
При всех очевидных плюсах в системах с открытым ключом есть и минусы. И самый главный — это скорость. Асимметричное шифрование в несколько раз медленнее симметричного. Ну и, соответственно, вычислительные мощности нужны в разы больше. В связи с этими минусами, на практике обычно применяются гибридные системы шифрования. Они аккумулируют плюсы обоих систем. Т.е. массив данных шифруется симметричным алгоритмом, а сеансовый ключ шифруется асимметричным и передаётся в зашифрованном виде. Таким способом экономятся вычислительные мощности и появляется возможность безопасно передать ключ симметричного алгоритма.
Асимметричное шифрование
Асимметричное шифрование или шифрование с открытым ключом. В подобных системах используется два ключа — открытый и закрытый, математически связанные между собой. При этом открытый ключ не от кого не прячется. Может передаваться не защищенными каналами связи. И используется для шифрования данных и проверки электронной цифровой подписи.
А вот для генерации цифровой подписи и расшифровки данных используется закрытый т.е. секретный ключ. Простыми словами это работает так. Если мы хотим получить от кого-то некую секретную информацию, мы передаём ему открытый ключ, с использованием которого эта информация будет зашифрована. При этом мы не боимся что злодеи перехватят наш ключ. Ведь с ним можно только зашифровать данные, но не расшифровать.
Наиболее распространённые асимметричные алгоритмы шифрования:
Криптография и алгоритмы шифрования
И тут, человеки, как им свойственно, проявили немалую изобретательность. И понавыдумывали столько, что если захочешь во всём этом разобраться, то пару институтов придется закончить. Но мы не в институте. Да и нам не зачем в эти глубины вникать, а потому разберем основное.
В криптографии существует довольно много видов классификаций алгоритмов шифрования. Но, что бы не забивать себе голову, наиболее приемлемо выделить три основных вида:
- симметричное
- асимметричное
- хеширование
Прежде чем говорить о них по отдельности, давай определимся что самое важное в алгоритмах шифрования. И, ты наверняка подумал, что это надежность защиты данных, и это почти правильный ответ. Причем многие теоретики криптографии тоже отдают надежности первой место. А вот те кто на практике сталкиваются с шифрованием, знают, что надёжность конечно важна, но гораздо важнее соотношение надёжности и возможности использования шифра.
Что бы было понятней почему, поясню подробней. То что в народе называют надёжностью, в криптография называет криптостойкостью шифра. Другими словами это свойство шифра противостоять криптоанализу т.е. дешифрованию. А самих способов дешифррования существует ровно два — простой перебор и расшифровка на основе перехваченных данных.
И если с перебором всё более-менее понятно. Т.е. нужно подставлять, по очереди все возможные варианты. И соответственно чем больше вариантов существует тем более надёжен этот шифр. То с расшифровкой на основе перехваченных данных всё намного сложнее. При этом оба варианта вполне можно применять к одному и тому же шифру.
Криптография. Надёжность шифра
Это термины которыми обозначаются вероятности появления или не появления в тексте каких-либо символов. Но мы не будем углубляться в высшую математику и выводить формулы. Потому что нам это просто не нужно. А нужно понимать что значение взаимной информации всегда больше либо равно нулю. И исходя из этого получается, что если это значение равно нулю, то алгоритм можно считать абсолютно стойкими. Потому что сколько частей крептотекста не попало бы к злодею — расшифровать всё равно ничего не получиться. А если значение взаимной информации больше нуля, такие системы принято называть достаточно стойкими.
Читайте также: