Криптография для хакеров. Основы алгоритмов шифрования

Привет, начинающий хакер.

Мы с тобой уже рассмотрели немало тем в области работы сетей в целом, и информационной безопасности в частности. И очень часто в своих материалах я упоминал такие слова как шифрование, алгоритмы шифрования, хэши, ну и всякие словечки наподобие. И вроде бы в контексте эти слова были уместны и понятны, но, я тут подумал, что, на самом деле мало кто понимает, что именно означают эти термины, а уж раскрыть концепцию и принципы работы всего этого — вообще смогут единицы. И для начинающего, либо для любителя это вполне нормально, а вот когда люди считающие себя серьёзными хацкерами, либо анонимусами с пеной у рта доказывают, что какой-то алгоритм уязвим и пользоваться им нельзя, но, при этом не могут даже приблизительно сформулировать что такое алгоритм шифрование, в чём суть уязвимости, а главное уязвимости к чему, это вызывает снисходительную улыбку. Но ты ведь не хочешь таким быть, правда? Поэтому я решил посветить эту статью криптографии в целом, и шифрованию в частности, но я постараюсь не углубляться в теоретические глубины, а сосредоточусь на практической части вопроса, больше внимания посвящая именно алгоритмам шифрования.

Начнём, как и положено с начала. А в начале всего стоит криптография — это такая наука, причём очень древняя и очень сложная. Исторически сложилось, что основной целью криптографии можно выделить обеспечение конфиденциальности т.е. защиты информации от посторонних личностей. И эта цель не менее актуальна и сейчас, но с развитием информационных технологий, а соответственно с развитием криптографии, начали появляться новые, но не менее важные цели этой науки, например к наиболее популярным можно отнести: аутентификацию т.е. проверку неизменности ключевых свойств объект (например авторство, дата создания, история изменений и т.д.) и целостность данных т.е. невозможность незаметного или не санкционированного изменения информации. С развитием криптографии, развивались и методы, применяемые этой наукой, для достижения результата. Если когда-то, давным-давно, достаточно было использовать алфавитный, а чуть позже цифровой шифр, и чем он был замудрённей тем и надёжней, потому что разгадывать его приходилось в ручную, то с появлением компьютеров, а соответственно серьёзных вычислительных мощностей, эти самые шифры канули в лету, ввиду их абсолютной уязвимости к анализу и перебору для выявления закономерностей, а соответственно разгадыванию секретного ключа т.е. самого шифра (этот процесс, кстати, принято называть криптоанализом) . Но кому-то очень умному пришло в голову использовать вычислительные мощности не только для разгадывания ключа, но и для самого шифрования. Именно так начали появляться алгоритмы шифрования в том понимании, в котором их знают сейчас.

Алгоритмы шифрования

И тут, человеки, как им свойственно, проявили немалую изобретательности и понавыдумывали столько, что если захочешь во всём этом разобраться, то пару институтов придется закончить. Но мы не в институте, да и нам не зачем в эти глубины вникать, а потому разберем основное.

В криптографии существует довольно много видов классификаций алгоритмов шифрования, но, что бы не забивать себе голову, наиболее приемлемо выделить три основных вида:

  • симметричное
  • асимметричное
  • хеширование

Прежде чем говорить о них по отдельности давай определимся, что самое важное в алгоритмах шифрования. И, ты наверняка подумал, что это надежность защиты данных, и это почти правильный ответ, причем многие теоретики криптографии тоже отдают надежности первой место, а вот те кто на практике сталкиваются с шифрованием, знают, что надёжность конечно важна, но гораздо важнее соотношение надёжности и возможности использования шифра. Что бы было понятней почему, поясню подробней. То что в народе называют надёжностью, в криптографии принято называть криптостойкостью шифра, другими словами это свойство шифра противостоять криптоанализу т.е. дешифрованию. А самих способов дешифррования существует ровно два — простой перебор и расшифровка на основе перехваченных данных. И если с перебором всё более-менее понятно, т.е. нужно подставлять, по очереди все возможные варианты и соответственно чем больше вариантов существует тем более надёжен этот шифр, то с расшифровкой на основе перехваченных данных всё намного сложнее. При этом оба варианта вполне можно применять к одному и тому же шифру. Но как понять степень надёжности этого шифра. Для этого, в криптографии, существует такое понятие как взаимная информация — это числовое значение определяющее при перехвате какого количества криптотекста, станет возможна расшифровка всего зашифрованного сообщения, а высчитывается оно как разница между обычной и условной информационной неопределенностью, которую в криптографии принято называть энтропией. Это термины которыми обозначаются вероятности появления или не появления в тексте каких-либо символов. Но мы не будем углубляться в высшую математику и выводить формулы, потому что нам это просто не нужно. А нужно понимать что значение взаимной информации всегда больше либо равно нулю. И исходя из этого получается, что если это значение равно нулю, то алгоритм можно считать абсолютно стойкими, потому что сколько частей крептотекста не попало бы к злодею — расшифровать всё равно ничего не получиться, а если значение взаимной информации больше нуля, такие системы принято называть достаточно стойкими. И возникает логичный вопрос: если существуют абсолютно стойкие системы, то почему бы их не использовать и проблема защиты информации будет решена. Но не тут-то было, потому что абсолютно стойкие системы существуют только на бумаге, в виде теорем и прочей теоретической тошниловки, а использовать их на практике невозможно, в виду нереальной сложности и огромной стоимости шифрующего оборудования, чтобы было понятней, даже государства, которые, казалось бы, обладают огромными ресурсами, не смогли до сих пор внедрить использование абсолютно стойких систем. Из этого всего, вполне логичным, будет вывод, что чем надежнее шифр тем труднее и дороже его использование в практических целях, а соответственно наиболее важна не надежность шифра, а возможность его применения т.е. соотношение надежности и цены.

Симметричное шифрование

Теперь вернемся к тому из-за чего собрались, а именно к самим алгоритмам. Симметричное шифрование — это такой способ шифрования когда для шифрования и расшифровывания используется один и тот же ключ, соответственно у кого есть ключ тот и может расшифровывать сообщение.

симметричное шифрование

В свою очередь, само симметричное шифрование можно разделить на два подвида — это блочные и поточные шифры.

Блочный шифр — информация шифруется блоками данных фиксированного размера, как правило это степени 2 (64, 128 и т.д.), применяя к каждому блоку ключ в несколько раундов подстановки и перемешивания, достигая таким образом увеличения несоответствия битов между блоками начальных и зашифрованных данных. Именно так работают большинство современных алгоритмов шифрования, используя, для перемешивания и подстановки сеть Фейстеля или SP-сеть.

Поточный шифр — принцип работы тот же самый, что и у блочного, только на шифруемый текст предварительно накладывается последовательность случайных чисел и информация шифруется не блоками, а побитово, этот процесс, кстати, называется гаммированием, так вот если блочный шифр запустить в режиме гаммирования — получится потоковый. Правда если перегнуть с этой последовательностью случайных чисел — получишь абсолютно стойкий шифр — круто, но бесполезно.

Примеры наиболее распространённых симметричных шифров:

  • DES — довольно старый алгоритм, разработанный IBM. Сейчас не используется в ввиду наличия неустраняемых уязвимостей.
  • 3DES — более поздняя версия DES. Применяет алгоритм DES три раза, что делает его более безопасным, чем сам DES.
  • AES — Advanced Encryption Standard. Это стандарт шифрования, принятый в США. В настоящее время он считается одним из наиболее сильных, использует 128-, 196- или 256-битный ключ и алгоритм Rijndael с 2001 года. Используется в WPA2, SSL/TLS и многих других протоколах, где важны конфиденциальность и скорость.
  • RC4 — это пример шифра потоковой передачи, который разработан Рональдом Ривестом. Используется в VoIP и WEP.
  • Blowfish — первый алгоритм шифрования Брюса Шнайера. Он использует переменную длину ключа и считается одним из самых безопасных.
  • Twofish — более сильная версия Blowfish с 128-битным или 256-битным ключом, основной конкурент AES. Используется в Cryptcat, OpenPGP.
  • Кузнечик — разработан ФСБ РФ и в 2015 году принят в качестве стандарта в ГОСТ Р 34.12-2015. В том же году была доказана его неустойчивость к методу обратного проектирования, а чуть позже оказалось, что его алгоритм генерации S-блока перерисован с Белорусского шифра BelT разработанного в 2007 году. Ещё чуть позже его же взломали атакой «встреча посередине».

Самыми главными плюсами симметричного шифрования является его скорость и простота реализации. За счёт этого оно хорошо подходит для хранения и обработки больших объёмов данных. На этом, собственно, плюсы — всё. Что касается минусов: самая главная его проблема — это обмен ключами, ведь у каждого участника должен быть один и тот же ключ, а его нужно как-то передать, по какому-то каналу связи, а это означает ровно одно — этот ключ можно перехватить, соответственно даже самый лучший алгоритм надёжен ровно настолько на сколько надёжен канал передачи ключей. Кстати, из-за того что ключ известен каждой стороне, использование симметричного шифрования делает невозможным подтверждение аутентичности и авторства данных т.к. невозможно сформировать цифровую подпись.

Асимметричное шифрование

Асимметричное шифрование или шифрование с открытым ключом — в подобных системах используется два ключа — открытый и закрытый, математически связанные между собой, при этом открытый ключ не от кого не прячется, может передаваться не защищенными каналами связи и используется для шифрования данных и проверки электронной цифровой подписи. А вот для генерации цифровой подписи и расшифровки данных используется закрытый т.е. секретный ключ. Простыми словами это работает так: если мы хотим получить от кого-то некую секретную информацию, мы передаём ему открытый ключ, с использованием которого эта информация будет зашифрована. При этом мы не боимся что злодеи перехватят наш ключ, ведь с ним можно только зашифровать данные, но не расшифровать. После того как наш собеседник получает ключ, он шифрует сообщение и отправляет нам, а получив мы расшифровываем его с использованием секретного ключа, который мы тщательно хранили, никому не передавали и не показывали, и, как бонус, мы ещё и проверяем не изменил ли кто данные в процессе пересылки и пришли ли они от нужного нам адресата. Сам понимаешь, такая схема многократно надежней чем с симметричным шифрованием.

асимметричное шифрование

Наиболее распространённые асимметричные алгоритмы шифрования:

  • RSA (Rivest, Shamir и Adleman) — первая и наиболее распространённая криптосистема которая стала пригодной и для шифрования, и для цифровой подписи, использует факторизацию очень больших простых чисел в качестве отношения между двумя ключами.
  • Схема Эль-Гамаля (Elgamal) -криптосистема основанная на вычислительной сложности проблемы дискретного логарифмирования. Долгое время была стандартом в США и России.
  • Алгоритм Диффи — Хеллмана — криптографический протокол, позволяющий двум и более сторонам получить общий секретный ключ, используя незащищенный от прослушивания канал связи.
  • DSA (Digital Signature Algorithm) — криптографический алгоритм с использованием открытого ключа для создания электронной подписи, но не для шифрования. Подпись создается секретно, но может быть публично проверена. Это означает, что только один субъект может создать подпись сообщения, но любой может проверить её корректность. Алгоритм основан на вычислительной сложности взятия логарифмов в конечных полях. Является частью стандарта цифровой подписи США.

При всех очевидных плюсах в системах с открытым ключом есть и минусы, и самый главный — это скорость, асимметричное шифрование в несколько раз медленнее симметричного, ну и, соответственно, вычислительные мощности нужны в разы больше. В связи с этими минусами, на практике обычно применяются гибридные системы шифрования, которые аккумулируют плюсы обоих систем т.е. массив данных шифруется симметричным алгоритмом, а сеансовый ключ шифруется асимметричным и передаётся в зашифрованном виде. Таким способом экономятся вычислительные мощности и появляется возможность безопасно передать ключ симметричного алгоритма.

гибридная система шифрования

Хеширование

И третий, интересующий нас вид шифрования, это хеширование его ещё называют хеш-функция или функция свёртки — это одностороннее шифрование, при котором, с использованием алгоритма хеширования, начальные данные, независимо от их длины, превращаются в битовую строку фиксированной длины. Именно эта битовая строка и называется хешем. Идеальным считается такой алгоритм хеширования, который делает невозможным обратное преобразование хеша в данные. Т.е. имея на руках хеш — невозможно узнать начальные данные. При этом, для применения на практике, как раз начальные данные знать и не нужно, нужно знать, что с использованием определенного алгоритма генерация хэша от какого-то текста создает тот же хэш. Соответственно, мы можем хранить, например пароль, в виде хеша и даже если его украдут — узнать пароль не смогут, а когда пользователь вводит пароль то хеш введенного пароля сверяется с сохраненным хешем, и если они совпали — значит пароль правильный. По такому же принципу может проверяться целостность файлов.

хеширование

Самая главная проблема хеш-функций называется коллизией, суть её в том что хеши не всегда уникальны и иногда, правда очень редко, случаются ситуации, что два разных входных блока дают одинаковый хеш. Именно поэтому основной уязвимостью алгоритмов хеширования считается построение коллизий т.е. их искусственное создание. Для примера именно подобную уязвимость эксплуатировал червь Stuxnet в Windows, получая от системы абсолютно белый сертификат и таким способом становясь неуязвимым для антивирусов.

Примеры алгоритмов хеширования: MD4, MD5, SHA1, SHA2.

Ну, а на этом нашу ознакомительную экскурсию в мир криптографии можно считать оконченной. Не забывай возвращаться, нам нужно узнать ещё очень много.

Твой Pul$e.