пятница, 6 декабря 2013 г.

Шифрование и криптография

(73kb)
Такова уж человеческая природа — что один хранит в тайне, то другой завсегда раскрыть хочет. На этом незамысловатом стремлении и выросла научная дисциплина криптология, которую умные люди делят на два основных направления — криптографию и криптоанализ.
Тексты шифровали монахи и влюбленные, полководцы и бизнесмены. Тайные письма вскрывали службы безопасности и отцы семейств, контрразведчики и скучающие интеллигенты. Не стоит думать, что криптография — это что-то далекое и запредельное. Любому современному человеку жизненно необходимо знать, как обращаться с шифрами, чтобы «держать свои секреты в секрете»

Рождение криптографии

Никто не может сказать точно, когда же был придуман самый первый шифр на свете. Широко известно, что задолго до Рождества Христова. Скорее всего, сразу после появления письменности.
Если верить исследователям египетских пирамид, то во время раскопок были обнаружены склепы с очень странными надписями. Там одни иероглифы заменялись на другие. Делалось это не столько во имя сохранения тайны, сколько для придания текстам большей важности. Примеры шифровок можно найти и в Библии — так, царь Вавилона за счет перестановки алфавита наоборот (первая буква стала последней, вторая — предпоследней и т.д.) превратился в царя Сессах. Такой метод перестановки символов называется атбаш. В той же книге упоминается и награда «первому криптоаналитику» — пророка Даниила за прочтение загадочной надписи облекли в багряницу и провозгласили третьим властелином царства.
Понятно, что шифры тех времен были примитивны. Заменялись буквы, фразы, понятия, так что сообщения либо легко поддавались дешифровке даже без знания ключа, либо не читались вообще.
Сегодня криптология в основном изучает однозначные и механистические шифры, которые подразумевают жесткий алгоритм получения как защищенного, так и открытого текста. Самый простой из подобных алгоритмов — так называемый способ Цезаря, в котором все символы исходного алфавита заменяются знаками шифрового алфавита со «смещением» на определенное значение. Если оно равно, например, 3, то вместо буквы D будет A, вместо E — B, вместо C — Z и так далее.
Таких перестановок может быть несколько — например, для первой буквы используется один вариант, для второй — уже следующий, для третьей — еще один. В этом случае шифр называется многоалфавитным. Для обратной расшифровки понадобится всего-навсего знать все значения смещений. Их, кстати, можно передавать с помощью не только цифр, но и ключевых слов.

Начало великой битвы

Конечно же, «древние» шифры разгадать не сложно. Чтобы узнать исходный текст, применяются самые различные методы, в основном — статистические. Один из таких алгоритмов — частотный анализ появления букв. Именно таким методом воспользовался знаменитый сыщик Шерлок Холмс в рассказе «Пляшущие человечки». Когда ему удалось получить достаточно длинный текст, он определил, с какой частотой повторяются те или иные символы. Если какой-либо символ повторяется через определенные промежутки, то, скорее всего, этот знак обозначает «пробел». К примеру, Холмс понял, что флажки в руках человечков употребляются лишь для того, чтобы отмечать концы отдельных слов. Букв в алфавите много, и распределение их достаточно традиционно для любых текстов. Опытный криптоаналитик может и вовсе угадать одно из значимых слов. Известный сыщик довольно быстро разгадал шифрованное послание, поскольку сделал ряд верных предположений. Так, две записки начинались со слова из четырех букв, и Холмс догадался, что это — имя девушки, к которой было обращено послание. Дальнейшая расшифровка была делом техники. Так что не стоит полагаться на такие коды — они довольно хорошо изучены и не раз были описаны в художественной литературе.
Здесь можно процитировать Брюса Шнайдера, автора потрясающих книг о криптологии: «Есть шифры, которые помешают читать ваши файлы младшей сестре, а есть те, которые станут непреодолимой стеной перед криптоаналитическими бюро правительства США». Попытаемся понять, каковы же критерии достаточно сильного шифрования.
Правила выбора паролей
Чтобы пароль был криптографически стойким, он должен быть длинным и абсолютно бессмысленным. Чтобы запоминать сложные ключи, совершенно необязательно обладать феноменальной памятью — достаточно запомнить пару мнемонических правил. Например, вполне неплохим паролем может стать зашифрованная стихотворная строфа. Согласитесь, постороннему человеку будет крайне сложно определить, что «bmnkvsk-tkz03tzkd» — это записанные латиницей (с применением пары цифровых заменителей) первые буквы пушкинского четверостишия «Буря мглою небо кроет / Вихри снежные крутя, / То как зверь она завоет, / То заплачет как дитя». В любом случае — главное начать, и через несколько недель активного использования процесс восстановления ключевой последовательности будет проходить «на автомате».
И еще немного по поводу длины ключа. Она зависит от ценности хранимой информации. Для того чтобы сохранять данные в секрете в течение более 20 лет, рекомендуется применять 128 битный пароль (из 16 символов). Из-за несовершенства алгоритмов хэширования (возможности коллизий), эффективность ключей для аутентификации обычно в два раза меньше, чем при шифровании. Впрочем, это не значит, что нужно городить 32-символьный 256-битный ключ для почтового ящика (далеко не все службы поддерживают такую длину) — достаточно просто менять его раз в полгода.

Хорошая защита

Существует множество вариантов оценки стойкости алгоритмов. Но я не буду здесь приводить сложные математические формулы, а ограничусь некоторыми общими соображениями.
Прежде всего необходимо, чтобы зашифрованный текст был совершенно не похож на исходный — структурой, количеством символов и другими признаками. Думаю, это требование вполне понятно — если гипотетический злоумышленник вдруг узнает, сколько слов в письме, их длину и распределение по частям речи, то это сильно облегчит расшифровку.
Для надежного шифрования необходимо, чтобы при минимальном изменении изначального текста или пароля финальный текст менялся практически до неузнаваемости. Чтобы понять, зачем это нужно, — приведу пример. Если кто-то рассылает несколько сообщений с минимально измененным текстом (например, вслед пакету документов летит подправленный вариант), то на основании знания исходного текста или его измененной части можно «размотать» весь текст и даже пароль.
Последнее требование — псевдохаотичность выходной информации. Шифровка должна быть сложной, чтобы в ней невозможно было выявить какие-то закономерности. Любой текст обладает достаточно ярко выраженной структурой, повторяющимися словами, и.т.п. Кстати, псевдохаотичность шифра просто проверить — достаточно попробовать заархивировать результирующий документ. Если от сжатия размер уменьшится, значит алгоритм генерирует избыточную информацию, в которой есть закономерности.
(107kb)

Принцип действия

Чтобы объяснить алгоритм работы хотя бы одного широко используемого шифра, понадобилось бы с десяток подобных статей. В любом случае, для непрофессионала фраза «шифрование посредством введения обратных связей или путем генерации длинных шифрующих последовательностей» сама по себе звучит как шифр.
В первом случае каждый последующий блок зависит не только от исходного текста и пароля, но и от текста предыдущих блоков (разумеется, куски не должны находиться непосредственно друг рядом с другом, их задача — предшествовать в порядке выполнения алгоритма).
Во втором случае пароль становится «зерном» для генератора длинной шифрующей последовательности, которая впоследствии и используется на протяжении всего текста (возможно, в комбинации с изначальным шифром).
У обоих подходов есть свои преимущества и недостатки, но второй тип шифрования несколько сложнее для реализации — ведь в его основе лежит псевдослучайный алгоритм. И если он «не слишком хорош», то есть начинает достаточно быстро повторяться или выдает коллизии (одинаковые значения) при разных «зернах», то вся остальная работа малополезна и текст достаточно просто анализируется. Разумных же критериев проверки «случайности псевдослучайных» алгоритмов не существует — разве можно измерить хаос? Зачастую оба подхода просто используются одновременно.

Аутентификация

Кроме сохранения информации, у современной криптографии есть еще одна важная область применения — проверка подлинности. Например, если пользователь ошибся при вводе пароля, неплохо сообщить ему об ошибке, а после пяти неудачных попыток — заблокировать содержимое архива. Конечно, эта защита от подбора не сработает, если злоумышленник сам реализует алгоритм дешифровки, в обход стандартной процедуры.
Самый простой способ аутентификации изучают еще в школе — пользователю выдается ключ, которым кодируется определенное слово (например, «угадал»). Конечно, с точки зрения криптоаналитической стойкости такой способ не выдерживает никакой критики. Текст сообщения всегда известен (скорее всего, жестко зашит в программе), и восстановить необходимый пароль будет совсем не сложно.
На сегодняшний день чаще всего применяют односторонние преобразования — так называемые хэширующие функции. Достаточно «пропустить» пароль через это преобразование — и мы получаем последовательность, которая будет однозначно идентифицировать ключ. Так как функция однонаправленна, то «размотать» ее обратно не представляется возможным.
Конечно, в таком подходе есть несколько уязвимых мест. Во-первых, алгоритм может только казаться однонаправленным. В большинстве случаев преобразующая функция — интегро-дифференциальная, а методы решения подобных уравнений продолжают совершенствоваться.
Еще одна ахиллесова пята односторонних функций — возможность так называемых «коллизий» или совпадений результатов работы алгоритмов при разных изначальных ключах. Это не слишком страшно, если мы проверяем правильность пароля для расшифровки — в крайнем случае, злоумышленник получит в свое распоряжение абсолютно неудобоваримый текст и умрет от старости, пытаясь его разгадать. Хуже, если аутентификация проверяет права пользователя на вход в систему или на открытие почтового ящика.
Самая надежная криптография
Практически любой алгоритм шифрования несовершенен. Всегда можно отследить закономерности, пройти через «заднюю дверь», в конце концов, взломать «атакой в лоб», использовав вычислительную мощность зараженных компьютеров всего интернета.
Но есть способ так закодировать исходный текст, что он не будет вскрыт никогда — даже когда звезды сгорят и вселенная превратится в черную дыру. Этот метод называется способом Вернама. Его активно использовали во время Второй мировой войны, а потом и во время холодной войны для передачи секретной информации. Суть алгоритма состоит в однократном использовании длинной произвольной ключевой последовательности размером с передаваемый текст. Основная проблема таких «одноразовых шифроблокнотов» — необходимость постоянного обновления ключей, поэтому в век информационных технологий этот алгоритм был заменен другими, менее стойкими, но гораздо более удобными в применении.