Настройка аутентификации и шифрования wl-ззоgе. Русская «Магма»

  • 04.01.2022

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

Они лишь признали текущую 64-ти битную систему шифрования GSM - небезопасной, но даже сейчас они лишь раскачиваются для перехода на более защищенные алгоритмы. Хотя и они, как показал опыт – не панацея. В действительности самый лучший алгоритм защиты – 128-ми битная система A5/3 (KASUMI), использующаяся в 3G сетях, была также взломана. При этом на взлом ушло всего 2 часа.

Взлом был осуществлен преподавателями математического и компьютерного подразделений научного института Weizmann в Израиле. В работе приняли участие Орр Дункельман (Orr Dunkelman), Натан Келлер (Nathan Keller) и Ади Шамир (Adi Shamir), который известен своим соучастием в разработке знаменитой криптосхемы с открытым ключом RSA (буква “S” в названии криптосхемы стоит в честь Шамира). Они осуществили так называемую атаку “связанного ключа”. При этом свою технику исследователи назвали атакой “сэндвича”, т.к. она состоит из трех частей, две из которых расположены сверху и снизу, а третья тонкая – в середине.

По данным исследователей, с помощью этой техники они могут получить полный 128-ми битный ключ Kasumi, использовав лишь 4 связанных ключа, 226 единиц данных, 230 байт памяти и 232 единиц времени. Все эти требования настолько ничтожны, что им успешно удалось эмулировать атаку на одном ПК менее чем за два часа.

В то же время, по мнению Карстена Ноуля (Karsten Nohl) – профессора, стоящего за недавним взломом 64-х битного шифрования GSM , новая атака менее эффективна, чем недавний взлом A5/1. Для получения одного ключа новый метод требует сбора нескольких миллионов известных открытых текстов. Открытый текст передается примерно каждую секунду, поэтому взлом шифрования конкретного провайдера связи может потребовать длительного сбора данных. Более того, на одном ПК этот метод займет 2 часа времени для взлома конкретного звонка. Хотя, по мнению ученого, использование компьютерного кластера, может свести занимаемое время к минимуму.

Более того, по мнению Ноуля, произведенные взломы должны стать напоминанием того, что шифрование A5/3, как и любой другой шифр должны быть незамедлительно заменены. Ноуль надеется, что факты взлома будут рассматриваться при апгрейде GSM.

В то же время большинство телекоммуникационных компаний пока не представили определенных временных планов по переходу на KASUMI. Поэтому сомнительно, что переход произойдет очень быстро (хотя и сам KASUMI уже требует пересмотра). Это означает, что в разговорах по сети GSM сейчас не стоит сообщать каких-либо секретных данных. Если, конечно, вы не хотите, чтобы они стали достоянием общественности.

История

До появления Blowfish существовавшие алгоритмы были либо запатентованными, либо ненадёжными, а некоторые и вовсе держались в секрете (например, Skipjack). Алгоритм был разработан в 1993 году Брюсом Шнайером в качестве быстрой и свободной альтернативы устаревшему DES и запатентованному IDEA . По заявлению автора, критерии проектирования Blowfish были:

  • скорость (шифрование на 32-битных процессорах происходит за 26 тактов);
  • простота (за счёт использования простых операций, уменьшающих вероятность ошибки реализации алгоритма);
  • компактность;
  • настраиваемая стойкость.

Описание алгоритма

Параметры

  • секретный ключ K (от 32 до 448 бит)
  • 32-битные ключи шифрования P1-P18
  • 32-битные таблицы замен S1-S4: S1 S1 .. S1 S2 S2 .. S2 S3 S3 .. S3 S4 S4 .. S4

Функция F(x)

Алгоритм шифрования 64-битного блока с известным массивом P и F(x)

Сеть Фейстеля при зашифровании

Алгоритм Blowfish

Разделён на 2 этапа:

  1. Подготовительный - формирование ключей шифрования по секретному ключу.
    • Инициализация массивов P и S при помощи секретного ключа K
      1. Инициализация P1-P18 фиксированной строкой, состоящей из шестнадцатеричных цифр мантиссы числа пи .
      2. Производится операция XOR над P1 с первыми 32 битами ключа K, над P2 со вторыми 32-битами и так далее.
        Если ключ K короче, то он накладывается циклически.
    • Шифрование ключей и таблиц замен
      1. Алгоритм шифрования 64-битного блока, используя инициализированные ключи P1-P18 и таблицу замен S1-S4, шифрует 64 битную нулевую (0x0000000000000000) строку. Результат записывается в P1, P2.
      2. P1 и P2 шифруются изменёнными значениями ключей и таблиц замен. Результат записывается в P3 и P4.
      3. Шифрование продолжается до изменения всех ключей P1-P18 и таблиц замен S1-S4.
  2. Шифрование текста полученными ключами и F(x), с предварительным разбиением на блоки по 64 бита. Если невозможно разбить начальный текст точно на блоки по 64 бита, используются различные режимы шифрования для построения сообщения, состоящего из целого числа блоков. Cуммарная требуемая память 4168 байт: P1-P18:18 переменных по 32 бита; S1-S4: 4x256 переменных по 32 бита.

Дешифрование происходит аналогично, только P1-P18 применяются в обратном порядке.

Выбор начального значения P-массива и таблицы замен

Нет ничего особенного в цифрах числа пи. Данный выбор заключается в инициализации последовательности, не связанной с алгоритмом, которая могла бы быть сохранена как часть алгоритма или получена при необходимости (Пи (число)). Как указывает Шнайер : «Подойдёт любая строка из случайных битов цифр числа e, RAND-таблицы, или случайные сгенерированные цифры.»

Криптостойкость

  • слабый S-box (и порождающий его слабый ключ) означает, что существует такие i, j, N={1,2,3,4} : SN[i]==SN[j]

Криптостойкость главным образом зависит от F(x). На это указал Serge Vaudenay, говоря о наличии небольшого класса слабых ключей (генерирующих слабые S-box): вероятность появления слабого S-box равна . Он также рассмотрел упрощенный вариант Blowfish, с известной функцией F(x) и слабым ключом. Для этого варианта требуется выбранных открытых текстов (t - число раундов, а символы означают операцию получения целой части числа). Эта атака может быть использована только для алгоритма с . Для требуется открытых текстов, причём для варианта с известным F(x) и случайным ключом требуется открытых текстов. Но данная атака не эффективна для Blowfish с 16 раундами.

John Kelsey разработал атаку, которая позволяла взломать 3-итерационный Blowfish. Она опирается на факт, что операции сложения по модулю и XOR не коммутативны.

Невозможно заранее определить является ли ключ слабым. Проводить проверку можно только после генерации ключа.

Криптостойкость можно настраивать за счёт изменения количества раундов шифрования (увеличивая длину массива P) и количества используемых S-box. При уменьшении используемых S-box возрастает вероятность появления слабых ключей, но уменьшается используемая память. Адаптируя Blowfish на 64-битной архитектуру, можно увеличить количество и размер S-box (а следовательно и память для массивов P и S), а также усложнить F(x), причём для алгоритма с такой функцией F(x) невозможны вышеуказанные атаки.

Модификация F(x): на вход подается 64-битный блок который делится на восемь 8-битных блоков (X1-X8). Результат вычисляется по формуле , где
На сегодняшний день (ноябрь 2008) не существует атак, выполняемых за разумное время. Успешные атаки возможны только из-за ошибок реализации.

Пример работы алгоритма

Пример работы свободно распространяемой версии алгоритма Blowfish .
Параметры: Размер ключа: 448 бит Размер блока: 64 бит Число раундов: 16 режим: ECB

Применения

  • хэширование паролей
  • защита электронной почты и файлов
    • GnuPG (безопасное хранение и передача)
  • в линиях связи: связка ElGamal (не запатентован) или RSA (действие патента закончилось в 2000 году) и Blowfish вместо IDEA
    • в маршрутизаторе Intel Express 8100 с ключом длиной 144 бита
  • обеспечение безопасности в протоколах сетевого и транспортного уровня
    • PuTTY (сетевой уровень)
    • SSH (транспортный уровень)
    • OpenVPN (создание зашифрованных каналов)

Сравнение с симметричными криптосистемами

Скорость шифрования алгоритма во многом зависит от используемой техники и системы команд. На различных архитектурах один алгоритм может значительно опережать по скорости его конкурентов, а на другом ситуация может сравняться или даже измениться прямо в противоположную сторону. Более того, программная реализация значительно зависит от используемого компилятора. Использование ассемблерного кода может повысить скорость шифрования. На скорость шифрования влияет время выполнения операций mov, add, xor, причём время выполнения операций увеличивается при обращении к оперативной памяти (для процессоров серии Pentium примерно в 5 раз). Blowfish показывает более высокие результаты при использовании кэша для хранения всех подключей. В этом случае он опережает алгоритмы DES , IDEA . На отставание IDEA влияет операция умножения по модулю . Скорость Twofish может быть близка по значению с Blowfish за счёт большего шифруемого блока.

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

См. также

Ссылки

  • Serge Vaudenay.On the weak Keys of Blowfish (англ.)
  • Dieter Schmidt.Kaweichel, an Extension of Blowfish for 64-Bit Architectures (англ.)

Comodo Disk Encryption защищает ценную информацию путем шифрования любого раздела жесткого диска в системе. Шифрование - это процесс кодирования данных с помощью алгоритма, который известен только программе-шифратору, поэтому прочитать данные не сможет никто другой. Шифрование происходит «на лету» поэтому нет необходимости выключать или перезагружать компьютер. Comodo Disk Encryption предлагает несколько вариантов доступа к зашифрованным данным, которые вы можете выбрать в зависимости от ваших требований. Первый вариант - это установка пароля и использование этого каждый раз, когда вы хотите получить доступ к защищенным данным. Второй метод доступа - это использование USB устройства в качестве «ключа» для хранилища данных. Для доступа к данным USB устройство должно быть подсоединено к компьютеру. И третий вариант - использование и пароля и USB устройства одновременно. Этот вариант самый надежный. Для того, чтобы расшифровать данные вам нужно будет подключить устройство и ввести пароль.
Хранение и защита ценных данных - это вопрос, который был и будет очень актуальным. Содержание конфиденциальной информации на стационарных и портативных компьютерах связано с определенным риском потери этой информации, который постоянно нарастает. И только лишь с использованием такого софта, как Disk Encryption от Comodo может решить эту проблему. Не пренебрегайте шифрованием ценных данных - это защитит их от других пользователей вашего компьютера, а также от сетевых посягательств со стороны хакеров.

Ключевые особенности и функции

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

Специальные требования

32-битное шифрование

  • Windows 7 - 32 bit / Windows Vista / Windows XP / Windows 2000 / Windows Server 2003

64-битное шифрование

  • Windows 7 - 64 bit / Windows Vista / Windows XP / Windows Server 2003
  • 32 MB оперативной памяти и 6 MB свободного места на диске

Наших «извращений с импортозамещением» (давно это было, Евгений работает над докторской диссертацией, и мы все ждем, когда будет можно подписывать его статьи «профессором». 😉 - Прим. ред.) мы подробно познакомились с алгоритмом шифрования «Кузнечик», который определен в ГОСТ 34.12-2015. Помимо этого алгоритма, в ГОСТе описан еще один, с длиной шифруемого блока в 64 бита, который носит название «Магма».

Этот алгоритм представляет собой точную копию алгоритма блочного шифрования из старого ГОСТ 28147-89, за одним исключением. В новом ГОСТ 34.12-2015 определена и задана таблица перестановок для нелинейного биективного преобразования, которая в старом ГОСТ 28147-89 отсутствовала, и задание ее элементов полностью отдавалось в руки людей, реализующих данный алгоритм. Теоретически, если определить элементы таблицы перестановок самостоятельно и сохранить таблицу в тайне, это позволит повысить стойкость алгоритма шифрования (за счет этого фактически увеличивается длина ключа), однако, как видим, разработчики ГОСТ 34.12-2015 решили лишить самостоятельности пользователей стандарта.

Как уже было сказано, длина шифруемого блока в алгоритме «Магма» - 64 бита. Длина ключа шифрования - 256 бит.

WARNING

При чтении ГОСТа учти, что во всех 8-байтовых массивах тестовых последовательностей нулевой байт находится в конце массива, а седьмой, соответственно, в начале (если ты внимательно читал статьи про «Стрибог» и «Кузнечик», то эта особенность наших криптостандартов тебе должна быть знакома).

Немного теории

В описываемом алгоритме блок, подлежащий зашифровыванию (напомню, его длина 64 бита), разделяется на две равные по длине (32 бита) части - правую и левую. Далее выполняется тридцать две итерации с использованием итерационных ключей, получаемых из исходного 256-битного ключа шифрования.


Во время каждой итерации (за исключением тридцать второй) с правой и левой половиной зашифровываемого блока производится одно преобразование, основанное на сети Фейстеля. Сначала правая часть складывается по модулю 32 с текущим итерационным ключом, затем полученное 32-битное число делится на восемь 4-битных и каждое из них с использованием таблицы перестановки преобразуется в другое 4-битное число (если помнишь, то в предыдущих двух статьях это называлось нелинейным биективным преобразованием). После этого преобразования полученное число циклически сдвигается влево на одиннадцать разрядов. Далее результат ксорится с левой половиной блока. Получившееся 32-битное число записывается в правую половину блока, а старое содержимое правой половины переносится в левую половину блока.



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

Итерационные ключи получаются из исходного 256-битного ключа. Исходный ключ делится на восемь 32-битных подключей, и далее они используются в следующем порядке: три раза с первого по восьмой и один раз с восьмого по первый.



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


Итак, после краткого и небольшого погружения в теорию начинаем кодить...

Базовые функции стандарта

Поскольку в алгоритме используются 32-битные блоки (в виде так называемых двоичных векторов), для начала определим этот самый блок:

// Размер блока 4 байта (или 32 бита) #define BLOCK_SIZE 4 ... // Определяем тип vect как 4-байтовый массив typedef uint8_t vect;

Сложение двух двоичных векторов по модулю 2

Каждый байт первого вектора ксорится с соответствующим байтом второго вектора, и результат пишется в третий (выходной) вектор:

Static void GOST_Magma_Add(const uint8_t *a, const uint8_t *b, uint8_t *c) { int i; for (i = 0; i < BLOCK_SIZE; i++) c[i] = a[i]^b[i]; }

Сложение двух двоичных векторов по модулю 32

Данная функция аналогична функции под названием «сложение в кольце вычетов по модулю 2 в степени n» из алгоритма «Стрибог», за исключением того, что n в нашем случае будет равно 32, а не 512, как в стандарте «Стрибог». Два исходных 4-байтовых вектора представляются как два 32-битных числа, далее они складываются, переполнение, если оно появляется, отбрасывается:

Static void GOST_Magma_Add_32(const uint8_t *a, const uint8_t *b, uint8_t *c) { int i; unsigned int internal = 0; for (i = 3; i >= 0; i--) { internal = a[i] + b[i] + (internal >> 8); c[i] = internal & 0xff; } }

Нелинейное биективное преобразование (преобразование T)

В отличие от алгоритмов «Стрибог» и «Кузнечик» (кстати, там это преобразование называется S-преобразованием) таблица перестановок здесь используется другая:

Static unsigned char Pi= { {1,7,14,13,0,5,8,3,4,15,10,6,9,12,11,2}, {8,14,2,5,6,9,1,12,15,4,11,0,13,10,3,7}, {5,13,15,6,9,2,12,10,11,7,8,1,4,3,14,0}, {7,15,5,10,8,1,6,13,0,9,3,14,11,4,2,12}, {12,8,2,1,13,4,15,6,7,0,10,5,3,14,9,11}, {11,3,5,8,2,15,10,13,14,1,7,4,12,9,6,0}, {6,8,2,3,9,10,5,12,1,14,4,7,11,13,0,15}, {12,4,6,2,10,5,11,9,14,8,13,7,0,3,15,1} };

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

Код самой функции преобразования T получается такой:

Static void GOST_Magma_T(const uint8_t *in_data, uint8_t *out_data) { uint8_t first_part_byte, sec_part_byte; int i; for (i = 0; i < 4; i++) { // Извлекаем первую 4-битную часть байта first_part_byte = (in_data[i] & 0xf0) >> 4; // Извлекаем вторую 4-битную часть байта sec_part_byte = (in_data[i] & 0x0f); // Выполняем замену в соответствии с таблицей подстановок first_part_byte = Pi; sec_part_byte = Pi; // «Склеиваем» обе 4-битные части обратно в байт out_data[i] = (first_part_byte << 4) | sec_part_byte; } }

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «сайт», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score!