Tayler

Резидент
238
248
21 Апр 2017
Слил с "глубокого" борда,все описано простым языком,особенно понравилось шифрование дисков и разделов.
Криптография.

С чего все начиналось...

Сокрытие информации от посторонних глаз практиковалось еще с древних времен. Вспомним историю - шифр Г. Ю. Цезаря - алфавит сдвигался относительно самого себя на какое-то определенное число, которое и являлось ключом к расшифровке. К примеру, для ключа, равного четырем, алфавит выглядел следующим образом:

Алфавит исходный: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Алфавит замены: EFGHIJKLMNOPQRSTUVWXYZABCD

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

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

- Тайнопись. Алгоритм преобразования сообщения в нечитаемый (зашифрованный) вид, известный только отправителю и получателю сообщения. Никто, кроме этих двух сторон не знает самого алгоритма преобразования данных в шифр.
- Криптография с ключом (ключами). Алгоритм преобразования известен всем, но неизвестен параметр - ключ, от которого зависят преобразования над открытыми данными, выполняемыми в алгоритме.

Криптографию с ключом можно разделить на два подвида:

- Симметричные криптоалгоритмы. Для шифрования и дешифрования сообщения используется один и тот же ключ, известный только отправителю и получателю. Симметричные алгоритмы, применяемые в программах шифрования на данный момент - DES (уходит, слабый), 3DES, IDEA, RC6, Blowfish, Twofish, AES и некоторые другие. Длина ключа у таких алгоритмов - обычно до 256 бит. Исключение составляет Blowfish, у него длина ключа может составлять 448 бит и RC6 (переменная длина ключа до 1024 бит).

- Асимметричные криптоалгоритмы. У отправителя и получателя находится по паре ключей - открытый и закрытый. Пара ключей взаимосвязана. Открытый ключ раздают друг другу по незащищенному каналу. Первый отправляет второму сообщение, шифруя его _открытым ключом второго_. Второй, получив сообщение, расшифровывает его при помощи _своего закрытого ключа_. И наоборот. Получить закрытый ключ, имея только открытый - задача практически непосильная, но возможная. Здесь все зависит от длины ключа. Взлом ключей ассиметричного шифрования сводится к математическим вычислениям огромных чисел, факторизации, разложения на простые множители. Вычислительные мощности требуются огромные. Нынешняя относительно безопасная длина ключа - 2048 бит (для RSA). К асимметричным алгоритмам относятся такие, как RSA, El-Gamal, Криптоалгоритмы, построенные на базе эллиптических кривых (elleptic curves). И, таки да, на основе RSA построена наша всеми любимая программа PGP (хотя все же включает в себя выше перечисленные симметричные алгоритмы, для режимов "Conventional encryption" в коммерческих версиях (без использования асимметричного шифрования) и для защиты закрытого ключа).

В зависимости от размера информации, с которыми работают криптоалгоритмы, их можно разделить на два класса: блочные шифры и поточные шифры. Блочные шифры оперируют с блоками данных по 4..32 байта. Результат шифрования блока - в зависимости от исходных данных на входе в блок.
Поточные шифры - шифры, в которых по определенному алгоритму, в зависимости от входных данных ключа, генерируется последовательность битов, которая накладывается на поток открытых данных, складываясь с ним по модулю 2 (функция XOR).
Операции над битами:
0 xor 0 = 0;
0 xor 1 = 1;
1 xor 0 = 1;
1 xor 1 = 0;
На принимающей стороне происходит тот же самый процесс: генерация потока из входного ключа и сложение его по модулю 2 с шифротекстом (функция XOR обратима), и получаются открытые данные.
Самым распространенным видом поточного шифра является скремблер. Ниже рассмотрим его работу.

Пусть имеются данные (100101), полученные при помощи функции из ключа:

Разряды: 1 2 3 4 5 6

+-> 1 0 0 1 0 1 -------> [выход]
| | | |
+--------X---X---------+

X - функция XOR. На псевдорисунке видим, что для генерации последовательности взяты разряды 2, 3 и 5 (не важно, сколько бит в самой последовательности, и сколько взято разрядов для генерации, это всего лишь пример).
Первая операция, которая происходит в нашем скремблере - сложение XOR битов в разрядах 2, 3 и 5.

0 xor 0 xor 0 = 0;

Результат сложения мы получили 0. Теперь вся последовательность сдвигается вправо, только что полученный бит помещается в разряд 1 (по стрелке), а бит из разряда 6 уходит на выход (его место "занимает" бит 5). Теперь наш скремблер имеет следующий вид:

Разряды: 1 2 3 4 5 6

+-> 0 1 0 0 1 0 -------> [1]
| | | |
+--------X---X---------+

Выходной бит [1] накладывается функцией XOR на первый бит последовательности открытых данных, шифруя ее.
В скремблере операция сложения разрядов 2, 3, 5 повторяется.

1 xor 0 xor 1 = 0

Скремблер имеет вид:

Разряды: 1 2 3 4 5 6

+-> 0 0 1 0 0 1 -------> [0] 1
| | | |
+--------X----X-------+

Теперь на выходе из разряда 6 имеем бит [0], накладывающийся на второй бит шифруемой последовательности.
И так далее. Неоспоримое достоинство - скремблер легко может быть реализован как на программной базе, так и на электронной.
Да, все это просто, но скремблеры не лишены недостатков. Один из них - синхронизация передачи на одной стороне и приема на другой. В случае смещения принятой последовательности и последовательности, генерирующейся скремблером хотя бы на 1 бит, с этого места информация полностью теряется. Поэтому синхронизации необходимо уделять особое внимание. Второй недостаток - через определенный период скремблер "зацикливается", то есть начинает генерировать ту же последовательность с начала, что в последствии может привести к раскрытию передаваемых данных.

Случайные и псевдослучайные числа.

Алгоритмы шифрования требуют для своей работы наличия случайных и псевдослучайных чисел. Например - сеансовый ключ PGP (временно создаваемый программой) при отправке шифрованного сообщения. Вся проблема в том, что получить абслоютно случайный набор чисел на компьютере без аппаратных средств невозможно. Компьютер создает случайные числа из кучи событий системы, используя прерывания, системный таймер, интервал нажатия клавиш, движения мышки... Но абсолютно случайные числа можно получить аппаратным методом, используя. к примеру, генераторы шума на стабилитронах, излучение при распаде радиоактивных металлов и другое. Псевдослучайные числа - такие числа, которые обладают свойствами случайных последовательностей, но генерируются по определенному закону. Пример - выше (скремблер). От реализации таких генераторов напрямую зависит стойкость криптоалгоритма. Генераторы псевдослучайных чисел лежат в основе многих симметричных алгоритмов шифрования.

Цифровые подписи.

Цифровая подпись - методика противодействия изменению или искажению данных. Представляет из себя блок данных, содержащих контрольную сумму или дайджест сообщения, привязанную к файлу (или тексту). В программах шифрования также может хранить информацию о подписавшем файл или текст лице, время и дату подписания. Основой таких алгоритмов является односторонняя математическая функция (хеш-функция), которая вычисляется для блока данных, при этом преобразование ее назад невозможно (практически). Проверка производится следующим образом. К примеру, имеется подписанный файл, лежащий на сайте. Там же лежит и электронная подпись. Вы скачиваете файл, и при помощи программы вычисляете электронную подпись, сравнивая то, что получилось с тем, что написано на сайте (касаемо контрольных сумм MD5, SHA и подобных, не несущих в себе информацию о подписавшем, просто "дайджест" файла). При изменении хотя бы одного бита подписанного файла сумма MD5 и другие будет уже иной, что говорит об изменении внутреннего содержимого.
Цифровая подпись с именем владельца - вычисляется не только контрольная сумма, на функцию подписи воздействует закрытый ключ подписывающего. При обратной проверке подписи пользователями используется уже открытый ключ подписавшего. Пример такой функции - DSS. El-Gamal и RSA могут быть использованы как для шифрования, так и для формирования электронной подписи. Используется в программных продуктах PGP.


Стеганография.

Стеганография - процесс передачи важной информации при сокрытии факта ее присутствия. Эта наука стара так же, как и криптография. Еще издревле использовались симпатические чернила для письма между строк, которые проявлялись при нагревании, или каком-либо химическом воздействии.
Еще один пример - Вторая мировая война, где использовались так называемые "микроточки" - представляли из себя микроскопические фотоснимки, которые разглядывали под микроскопом.
В наше компьютерное время стеганограмма вкладывается в цифровые медиафайлы (до появления медиафайлов применялись неиспользуемые системой сектора дискет, файлы с неиспользующимися зарезервированными полями и др.). Для извлечения сообщения используется парольная фраза. На практике выглядит следующим образом: в видеофайл (MP3, JPEG) при помощи программы добавляются данные, необходимые для сокрытия. Часто для этого еще и шифруются. При этом сам файл-носитель не теряет своего функционала, но может претерпевать очень малые искажения, не заметные для человеческого глаза (видео, картинки). Один из методов - изменение младших битов пикселей изображения. Цвет пикселя незначительно меняет оттенок. В аудиофайлах может применяться кодирование скрываемой информации изменением фазы какого-либо звукового элемента. При корректно реализованном алгоритме сокрытия факт доказать присутствие скрытых данных в медиа-контейнере невозможно, если, конечно, не имеется оригинал того же медиа-контейнера. Чем плохо самому отснять видео и положить туда то, что нужно?


Немного об атаках на криптосистемы.

Криптосистема - математически построенный алгоритм. Логично предположить, что взлом - решение математической задачи. Но это не всегда так. Здесь ключевым фактором может являться скорость работы самого алгоритма. На преобразования может уходить приличное время, что замедляет взлом даже при нахождении слабого места. Для различных алгоритмов существуют разные методики взлома, тут, как говорится, подход индивидуальный. Но тем не менее, есть и общие.
Атака по словарю. Подвержены все симметричные алгоритмы. Здесь все очевидно - перебор возможных парольных фраз, имеющихся в словаре и некоторых комбинаций этих фраз. Использовать только надежные пароли, в идеале состоящие из букв верхнего, нижнего регистра, цифр, символов и знаков препинания. Использование хорошего и длинного пароля сделает атаку бессмысленной. В случае с шифрованием закрытых ключей - хранить их подальше от чужих глаз. Также сильно осложняет такую атаку в криптографических программах PBKDF (механизм генерации ключа на основе пароля), что сводит перебор до 100 паролей в секунду даже на очень мощных машинах.
Атаки на шифротекст распространены, если известна часть открытого текста. Как пример можно рассмотреть наш скремблер - если известно начало сообщения, можно выяснить ключ, с которого начиналась генерация шифрующего потока (в нашем случае достаточно узнать первых 6 бит, чтобы восстановить целиком шифрующую последовательность). Также есть такие вещи, как частота встречаемости букв в открытом тексте. К примеру, буква Е в английском языке - самая часто встречающаяся, Z - самая редкая. Такие таблицы существуют для многих языков.
Для асимметричных алгоритмов - задача взлома сводится к факторизации огромных чисел. Чем длина ключа меньше - тем легче получить пары ключей. На данный момент в системе RSA рекомендуемая длина ключа - 2048 бит. Он будет надежным относительно длительное время.
Атака "Man-in-the-middle", на мой взгляд, очень серьезная из атак. Подвержены криптосистемы с открытым ключом. Два человека пытаются передать друг другу открытые ключи. Между ними появляется третий (злоумышленник), и выдает им по своим открытым ключам, представляясь каждому отвечающей стороной. Таким образом, вся переписка идет через него, двое даже не подозревают о наличии злоумышленника.

Из симметричных алгоритмов на сегодняшний день самым стойким считается AES-256. Но даже у серьезных криптоалгоритмов есть "weak keys", т. н. слабые ключи. Слабые ключи плохо инициализируют генератор псевдослучайных чисел, и генератор начинает вырабатывать криптографически нестойкую псевдослучайную последовательность битов (для простого и наглядного примера - в выше рассмотренный скремблер записать только нули, и на выходе всегда будет получаться ноль. В действительности - немного сложнее.).
Хоть при формировании ключа шифрования есть вероятность угодить в слабые ключи, эта вероятность очень мала, и измеряется в минус двузначных степенях. Касаемо алгоритма AES - слабые и экививалентные ключи отсутствуют.
С другой стороны - на сколько времени вам нужно защитить информацию? Два-три дня, чтобы забрать/заложить закладку и отписаться в почту, или держать на жестком диске данные в течение многих лет, к которым никто и никогда не должен получить доступ? Эти факторы тоже необходимо учитывать при защите информации. Подробнее о типах атак можно узнать из книжки.
Еще присутсвует другая проблема, которая может свести на нет все ваши усилия по шифрованию - трояны, кейлоггеры. Современные кейлоггеры умеют не только списывать нажатия клавиш в определенных окнах, но и делать скриншоты экрана через определенный период времени, управляться удаленно, заливать все отснятое на FTP, E-mail. В процессах их не видно. Примером может служить Elite Keylogger.


Абсолютно стойкий шифр.


Невскрываемый алгоритм, стойкость которого доказана в теории, существует. Одноразовый шифроблокнот, он же One-time pad. Смысл его невскрываемости состоит в том, что для шифрования используется случайный ключ с длиной такой же, как у шифруемого сообщения. Для каждого символа открытого текста применяется символ шифроблокнота (байт, бит, как угодно). Но шифр невскрываем при следующих условиях:
- Один и тот же ключ не может использоваться дважды
- Ключ должен быть абсолютно случайным
- Ключ должен быть равным размером с сообщением (или больше, для того, чтобы можно было использовать дальше, не повторяясь).
- Ключ должен быть уничтожен после использования (окончания).
Но здесь опять же, сталкиваемся с проблемами: как распределять такие ключи? И как получить абсолютно случайный ключ? На алгоритм накладываются определенные ограничения. Такой ключ передавать через сеть не вариант - стойкость шифроблокнота падает до стойкости шифрованного канала передачи. Выход - флешка закладкой или лично в руки (что лучше), при условии, если знакомы с человеком лично.
Что касаемо по поводу создания случайных чисел - лучше всего использовать аппаратные средства, как писалось выше.


Признаки нестойкого шифра.


Если вам довелось использовать программу шифрования, об алгоритме которой ничего не известно (лучше не использовать такой софт), можно провести над ней ряд элементарных проверок.
Во-первых, криптогафические программы зачастую сначала сжимают исходный текст. Корректно работающий криптоалгоритм не должен увеличивать объем выходных данных. Если произошло увеличение выходных данных более, чем на длину заголовка, стоит задуматься о его корректности или наличии "backdoors".
Во-вторых, шифрованные данные должны выглядеть, как случайная последовательность, и как следствие, они не должны сжиматься архиватором более чем на пару процентов (попробуйте сжать шифрованный текст PGP. Несмотря на то, что это текст, сжатия более 25% вы не получите).
В-третьих, небольшой анализ шифра - попробуйте зашифровать файл, содержащий много одинаковых байтов (например, текстовый документ с содержимым "аааааааааааа..." и т. д.). Криво реализованный алгоритм тут же даст последовательность с периодом повторения в десяток байт, а то и меньше. И как следствие, после компрессии зашифрованного файла уровень сжатия будет на высоте.
По большому счету, не стоит доверять левым алгоритмам, обещающим стойкость в миллионы лет, и тем более имеющих закрытый исходный код. Доверяйте известным алгоритмам с открытыми исходными кодами. Ваша безопасность - в ваших руках.


Шифрование сегодня.

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

Шифрование файлов - проект GPG, базирующийся на основе открытого кода PGP. Шифрование файлов, электронная подпись, шифрование текстовой информации напрямую в окне. Использует асимметричное шифрование.
Сайт: Для просмотра ссылки Войди или Зарегистрируйся
Также ее portable-версия: gpg4usb. Не требует установки, стартует с флешки. Сайт программы: Для просмотра ссылки Войди или Зарегистрируйся

Шифрование дисков, разделов, создание криптоконтейнеров: TrueCrypt. Шифруются не файлы по отдельности, а целые разделы и диски. Также в текущей версии - поддержка шифрования раздела с установленной ОС. В загрузочный сектор устанавливается загрузчик с драйвером TrueCrypt, при вводе ключа драйвер является посредником между железом компа и зашифрованным разделом с ОС, происходит загрузка.
Немного о криптоконтейнерах: криптоконтейнер представляет собой зашифрованный файл, внутри которого находится файловая система. При вводе пароля криптоконтейнер через драйвер программы монтируется как съемный диск, с которым можно работать, как с обыкновенным диском. При копировании / перемещении файлов на этот диск, данные "прозрачно" шифруются, помещаются в криптоконтейнер. Криптоконтейнер можно переносить куда угодно на любом носителе.
Также реализована возможность создания "скрытых разделов". Если вы вдруг открываете дверь, и к вам врываются злые люди с терморектальным криптоанализатором, полные решимости его использовать, у вас есть выход на такой случай. Для начала создается основной раздел криптоконтейнера. Туда вы складываете ненужные данные, те, которыми вы "прикроетесь" на выше указанный случай. Затем создаете скрытый раздел, в который складываете данные, недоступные для посторонних глаз. В случае попадания на злых товарищей с раскаленным криптоанализатором, вы вводите пароль от основного раздела, они там ничего нужного для себя не находят. Доказать существование скрытого раздела невозможно, если вы, конечно, сами не проговоритесь.
Программа также поддерживает "hidden OS", то есть скрытую операционную систему.
Поддержка известных мощных алгоритмов, и их комбинаций.
Сайт программы: Для просмотра ссылки Войди или Зарегистрируйся

FreeOTFE - аналог TrueCrypt, portable-версия, открытый исходный код. С разницей, что нет поддержки загрузки ОС. Сделана модульно, алгоритмы можно добавлять / убирать для оптимизации скорости работы при старте и защиты. Программу можно найти на стороннем сайте, freeotfe.org продался. Опять же, стоит ли доверять "ненадежным источникам"?

Программа-блокнот: Steganos LockNote. Представляет собой .exe файл. При открытии внутрь окна пишется текст, при закрытии он сохраняется с установкой пароля. Таким образом, не нужно с собой иметь программу для расшифровки, все находится в одном .exe-файле. По заявлениям, реализует AES-256. Мое мнение - доверие не очень. Переписывает сама себя при закрытии.

Solid Encryption - шифроблокнот, работающий на случайных ключах. Генерирует их при помощи источника шума, подключенного к звуковой карте (лично мне метод внушает доверие. Подключал радиоприемник, настроенный на частоту, где нет вещания). Проверяет ключи на случайность. Позволяет шифровать как файлы, так и текст. О правилах работы с шифроблокнотом можно прочитать выше (Абсолютно стойкий шифр). В папке с программой - мануал на английском. Кряк к ней лучше не качать, есть reg-файл. При работе отключить в функциях звуковой карты шумоподавление и подавление эха. Внимание, программа имеет закрытый исходный код. Хотя подозрительной активности не ведет, в интернет не лезет, в реестр пишутся данные об установке и регистрации. Об использовании ключевых файлов пишется в .ini-файл. Использование - на усмотрение. Я пока ничего плохого в ней не обнаружил.

base64-кодирование.

Данный метод используется в шифровании для перевода двоичных данных в
текстовый вид ASCII, например, для последующей передачи шированных
двоичных данных текстом или по протоколам, поддерживающим только текст
(например, через протокол SMTP или передача через программу-чат,
например ICQ, Jabber и другие).
base64 использует собственный алфавит - латинские буквы верхнего и
нижнего регистра и несколько знаков - "+", "/" и "=". Внутри base64
символы кодируются в диапазоне от 0x00 до 0x3F.

Алфавит base64:

ABCDEFGHIJKLMNOP QRSTUVWXYZabcdef ghijklmnopqrstuv wxyz0123456789+/
[0x00...0x0F] [0x10...0x1F] [0x20...0x2F] [0x30...0x3F]


Кодирование производится следкющим образом: берется трехбайтовый буфер.
Затем в него заносятся первые три байта двоичных данных. Затем из этого
буфера берутся блоки по 6 бит и преобразуются в base64-ASCII в
соответствии с выше указанным алфавитом (на выходе мы видим именно эти
символы). Эта операция производится для следующих трех байт данных и
так далее. Если же кодируются один или два байта (трехбайтовый буфер не
заполнен), оставшаяяся часть буфера дозаполняется нулями, но в конце
последнего получившегося 6-битного блока ставится символ "=". На выходе
имеем 2 символа base64-ASCII и символ "=", или 1 символ base64-ASCII и
два символа "=". Также этот символ предотвращает добавление других
данных к последовательности.

Такая методика кодирования увеличивает объем выходных данных в
соотношении 8:6 (один символ base64-ASCII передается как обычный символ
ASCII, занимающий 8 бит), но это не является некорректностью того или
иного алгоритма. Также не стоит забывать и о сжатии (с шифрованием)
перед преобразованием в base64.
 
Последнее редактирование: