image

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

Если что-либо будет вызывать вопросы, в эпоху присутствия интернета можно обращаться в google, wikipedia, etc. Или написать в комменты, личку, на гитхаб, на почту. Для дальнейшего осознания нужны базовые представления о computer science.
Эту статью можно считать средством систематизации, складирования знаний и борьбы с прокрастинацией.

Если вы программируете уже н-лет, месяцев дней, то должны понимать, что ОЗУ, ПЗУ вычислительного устройства хранит данные только в сериализированном виде, т.е. плюньте в лицо человеку, который говорит, что если нельзя сериализировать данные, но можно с ними работать (всегда можно абстрагировать и сериализировать). Данные это всего лишь набор нулей и единиц, которые составляют октеты (байты далее), из 8-ми бит. Т.е. бит имеет два состояния 1, и 0. А байт, 256 состояний от 00000000 до 11111111. Это все к тому, что криптография, в традиционном еe понимании работает только с целыми числами, в более узком понятии только с элементами поля Галуа. Забудьте про дроби, т.к. float – тоже сериализируется в порядок бит, а в криптографии важен только он.

Для шифрования данных используется много наборов из обратимых операций, над двумя переменными, одной из которых является сообщение, а второй ключ шифрования. Обычно это элементы поля Галуа(2^x), где x — некоторая степень.

Рассмотрим список элементарных криптографических операций:

1) Самый популярный операция простого шифрования – XOR, (Exclusive disjunction or exclusive or).


Он же “сложение по модулю два”. Обратная оперция – сам себе обратная операция, т.е. XOR(XOR(x,a),a) = x.

Таблица возможных значений доступна, в wiki.

Самый простой шифр образован применением операции xor ко всем битам сообщения битами ключа циклически, т.е. как только закончился ключ начинаем сначала ключа.
Пример данных, в кодировке ASCII: message — “Hello world!”, key — “Key”,

Hex
Plain text - 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 00 
Key - 4B 65 79 
Chiper text - 03 00 15 27 0A 59 3C 0A 0B 27 01 58 4B 


Bin
Plain text - 00000000 00100001 01100100 01101100 01110010 01101111 01110111 00100000 
01101111 01101100 01101100 01100101 01001000
key - 01111001 01100101 01001011
Chiper text - 01001011 01011000 00000001 00100111 00001011 00001010 00111100 01011001 
00001010 00100111 00010101 00000000 00000011 


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

2) Сложение по модулю 2^8, ^16, ^32, ^64 – элементарное сложение в поле Галуа.


Обратная операция – отнимание по соответствующему модулю, или сложение с обратным числом (что собственно одно и то же).
Таблица возможных значений зависит от разрядности поля.

Пример, data = 24, key  = 11, mod – 2^8, тогда 24 + 11 = 35;
data = 255, key  = 1, mod – 2^8, тогда 255 + 1 = 0; - так называемое “переполнение ячейки памяти”
data = 65535, key  = 140, mod – 2^32, тогда 65535 + 140 = 65675;

Обратные операции:

a) сложение с обратным элементом
35 + (255 – 11 + 1) = 24, где 255 – 11 + 1 – обратный элемент, т.е. ~key + 1, где ~ - побитовое отрицание.
65675 + (4294967295 – 140  + 1) = 65535
б) отнимание по соответствующему модулю
35 – 11 = 24;
65675 – 140 = 65535.

На схемах обычно отображается в виде знака “плюса” в квадрате, легенда схемы уточняет модульность сложения. Слабые и сильные стороны аналогично предыдущему варианту.

3) Циклические битовые сдвиги (вращение по модулю)


Вращение бит на n, влево или вправо. Обратная операция – вращение в другую сторону на тоже число бит, или “докручивание” на обратное количество бит.

По модулю 2^64
1481245 << 25 = 49702334627840
исходное : 00000000 00000000 00000000 00000000 00000000 00010110 10011010 00011101 
полученное:  00000000 00000000 00101101 00110100 00111010 00000000 00000000 00000000 

1481245 >> 25 = 814323050542530560
исходное : 00000000 00000000 00000000 00000000 00000000 00010110 10011010 00011101 
полученное: 00001011 01001101 00001110 10000000 00000000 00000000 00000000 00000000 

Обратное количество бит в “докручивании” зависит от разрядности ячейки (или степени двойки в поле Галуа), т.е.

64 – 25 = 39, 
1481245 << 25 = 49702334627840
49702334627840 << 39  = 1481245.

На схемах обычно отображается в виде знака “>>” повернутых в одну или другую сторону с указанием на сколько разрядов нужно повернуть. Ну еще следует понимать x << 64 – бессмысленная операция в GF(2^64).

4) Перестановки бит (байтов, машинных слов, и т.д.)


Пример перестановка второго бита на место четвертого, четвертого на место третьего третьего на место второго.
1101 = 0101 (little endian)
Могут быть различных вариаций, фантазия не ограничивает.
Обратная операция – обратная перестановка.
5) Подстановка (обычной от тетрад, октетов и выше).
Обычно используются таблицы, в которых все возможные элементы переходят в другие элементы (без потерь).

Пример таблицы на языке С:
static const uint8_t purgeSubstitutionBlock[256] = {
        0x68, 0x59, 0xB5, 0x76, 0x0F, 0x94, 0x80, 0x1F, 0x63, 0xE8, 0x21, 0x33, 0x74, 0x41, 0x55, 0x16,
        0x4D, 0x88, 0x72, 0x50, 0xCE, 0x69, 0xD2, 0x22, 0xF0, 0x6F, 0xDC, 0x56, 0xD8, 0x90, 0x17, 0x2E,
        0x54, 0x7C, 0xF1, 0x89, 0x6A, 0xDF, 0xDD, 0xD4, 0xBC, 0xE6, 0x91, 0x29, 0xAE, 0x1A, 0x08, 0x77,
        0x49, 0x19, 0x67, 0x1C, 0xAA, 0xB1, 0x10, 0xF2, 0x34, 0x5B, 0xED, 0x31, 0x35, 0x3C, 0xAF, 0x3D,
        0x7E, 0x18, 0xA0, 0xE5, 0xCD, 0xF7, 0x1D, 0x02, 0xCC, 0x8B, 0x36, 0xEC, 0xB6, 0x43, 0x44, 0xA8,
        0x00, 0x0A, 0x4E, 0xFE, 0x0D, 0x66, 0x4B, 0x9F, 0x23, 0xC4, 0xC6, 0x15, 0x53, 0xD1, 0x32, 0xBD,
        0xA3, 0x60, 0x95, 0x1E, 0x85, 0x45, 0xD3, 0xFD, 0x12, 0xA9, 0xE4, 0x8A, 0xB0, 0x73, 0x83, 0x11,
        0x2A, 0xBB, 0x9A, 0x07, 0x8E, 0x6E, 0x8C, 0xC5, 0x37, 0xC0, 0xE9, 0x92, 0xC1, 0xFF, 0xE3, 0xF3,
        0xCB, 0xAB, 0x7F, 0xC8, 0x24, 0x58, 0x6D, 0xBA, 0x7B, 0x79, 0xC2, 0x86, 0xEF, 0x06, 0xCF, 0x4A,
        0x81, 0xA7, 0x40, 0xE7, 0x9B, 0x48, 0x71, 0xDA, 0x3F, 0xE2, 0xAD, 0x84, 0x47, 0xCA, 0xB8, 0x2D,
        0x87, 0x1B, 0x97, 0x05, 0x13, 0x0C, 0xA4, 0xD6, 0xC9, 0xA2, 0x52, 0x99, 0x6C, 0x3E, 0x26, 0xD5,
        0x42, 0x61, 0x14, 0xF9, 0x38, 0x5D, 0x4F, 0x01, 0xB4, 0xE0, 0xC3, 0x03, 0x5A, 0xAC, 0x93, 0xB9,
        0xFA, 0x98, 0xEE, 0xEB, 0x0E, 0xBF, 0x2B, 0x0B, 0xA6, 0xD7, 0x46, 0xBE, 0x2F, 0xEA, 0x3B, 0x7D,
        0xDE, 0x82, 0xD9, 0x62, 0x25, 0x3A, 0x78, 0x96, 0x65, 0x9E, 0x8D, 0x8F, 0xFC, 0x39, 0xB7, 0x4C,
        0x7A, 0xA1, 0x27, 0x04, 0xD0, 0x57, 0x30, 0x51, 0xF5, 0xB3, 0xFB, 0xA5, 0x75, 0x20, 0xE1, 0x6B,
        0xF4, 0xDB, 0xF8, 0x5C, 0x28, 0x64, 0xC7, 0x2C, 0x09, 0xB2, 0x9C, 0x9D, 0x5F, 0x70, 0x5E, 0xF6,
};

static const uint8_t purgeReverseSubstitutionBlock[256] = {
        0x50, 0xB7, 0x47, 0xBB, 0xE3, 0xA3, 0x8D, 0x73, 0x2E, 0xF8, 0x51, 0xC7, 0xA5, 0x54, 0xC4, 0x04,
        0x36, 0x6F, 0x68, 0xA4, 0xB2, 0x5B, 0x0F, 0x1E, 0x41, 0x31, 0x2D, 0xA1, 0x33, 0x46, 0x63, 0x07,
        0xED, 0x0A, 0x17, 0x58, 0x84, 0xD4, 0xAE, 0xE2, 0xF4, 0x2B, 0x70, 0xC6, 0xF7, 0x9F, 0x1F, 0xCC,
        0xE6, 0x3B, 0x5E, 0x0B, 0x38, 0x3C, 0x4A, 0x78, 0xB4, 0xDD, 0xD5, 0xCE, 0x3D, 0x3F, 0xAD, 0x98,
        0x92, 0x0D, 0xB0, 0x4D, 0x4E, 0x65, 0xCA, 0x9C, 0x95, 0x30, 0x8F, 0x56, 0xDF, 0x10, 0x52, 0xB6,
        0x13, 0xE7, 0xAA, 0x5C, 0x20, 0x0E, 0x1B, 0xE5, 0x85, 0x01, 0xBC, 0x39, 0xF3, 0xB5, 0xFE, 0xFC,
        0x61, 0xB1, 0xD3, 0x08, 0xF5, 0xD8, 0x55, 0x32, 0x00, 0x15, 0x24, 0xEF, 0xAC, 0x86, 0x75, 0x19,
        0xFD, 0x96, 0x12, 0x6D, 0x0C, 0xEC, 0x03, 0x2F, 0xD6, 0x89, 0xE0, 0x88, 0x21, 0xCF, 0x40, 0x82,
        0x06, 0x90, 0xD1, 0x6E, 0x9B, 0x64, 0x8B, 0xA0, 0x11, 0x23, 0x6B, 0x49, 0x76, 0xDA, 0x74, 0xDB,
        0x1D, 0x2A, 0x7B, 0xBE, 0x05, 0x62, 0xD7, 0xA2, 0xC1, 0xAB, 0x72, 0x94, 0xFA, 0xFB, 0xD9, 0x57,
        0x42, 0xE1, 0xA9, 0x60, 0xA6, 0xEB, 0xC8, 0x91, 0x4F, 0x69, 0x34, 0x81, 0xBD, 0x9A, 0x2C, 0x3E,
        0x6C, 0x35, 0xF9, 0xE9, 0xB8, 0x02, 0x4C, 0xDE, 0x9E, 0xBF, 0x87, 0x71, 0x28, 0x5F, 0xCB, 0xC5,
        0x79, 0x7C, 0x8A, 0xBA, 0x59, 0x77, 0x5A, 0xF6, 0x83, 0xA8, 0x9D, 0x80, 0x48, 0x44, 0x14, 0x8E,
        0xE4, 0x5D, 0x16, 0x66, 0x27, 0xAF, 0xA7, 0xC9, 0x1C, 0xD2, 0x97, 0xF1, 0x1A, 0x26, 0xD0, 0x25,
        0xB9, 0xEE, 0x99, 0x7E, 0x6A, 0x43, 0x29, 0x93, 0x09, 0x7A, 0xCD, 0xC3, 0x4B, 0x3A, 0xC2, 0x8C,
        0x18, 0x22, 0x37, 0x7F, 0xF0, 0xE8, 0xFF, 0x45, 0xF2, 0xB3, 0xC0, 0xEA, 0xDC, 0x67, 0x53, 0x7D,
};


т.е. вместо 0 всегда будет подставлятся 0x68, вместо 0x1 – 0x59 и т.д. соответственно. Для обратного преобразования нужно, чтобы на месте 0x68 – 104 стоял 0, а на месте 0x59 – 89 стояла единица. Для обратной подстановки используется, внезапно, таблица обратной подстановки:
т.е. reverseKeyTable[keyTable[x]] = x.

5) Для построения более-менее стойкого шифра


Из этой комбинации элементов используются обычно два паттерна – сеть Фейстеля, и подстановочно-перестановочная сеть. Обычно их все равно смешивают, т.е. подстановки-перестановки-генерация ключа-гаммирование. Исторически сложилось, что гаммированием – называют xor с ключем. А еще иногда добавляют xor-add-константы, которые немного увеличивают энтропию входных данных.

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

Комбинация простых операций может быть разнообразна. Вот например, 512-битный криптоалгоритм, построенный на элементарных операциях описанных выше. Количество раундов — 31.



Исходные коды и реализация.

Примеры данных:

Data:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
Key:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
Ciphered:
B8 FF E8 11 EB 46 0F FE 12 AE 7F 34 E7 7A 03 49 18 B8 F8 AA EA F4 D6 3D 1F A8 98 35 35 C7 5C 42 
91 42 7E 4C CF EA E4 30 56 6E 4B 28 19 4D D0 FA 72 55 FE DB 48 D5 79 FA 5A 1D 9B 47 10 9D E1 7E 
Data:
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
Key:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
Ciphered 2:
15 AA B4 16 EE 34 33 A1 E2 BA 5C C6 C8 52 98 D3 17 66 EB 16 00 B1 32 26 34 14 18 30 15 48 C9 71 
A6 03 F0 1E 19 2A AF 6C 71 14 30 19 8E EB 8A 29 2E C8 99 DD 47 62 13 3C F9 7E D1 08 C9 4F E2 D3 

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

Комментарии (57)


  1. amarao
    15.06.2015 15:59
    +4

    Требую рассказа про сеть Фейстеля простым языком. Остальные примитивы понятны и очевидны.


    1. Scratch
      15.06.2015 16:05
      +1

      Так было же habrahabr.ru/post/140404


      1. amarao
        15.06.2015 21:36
        +1

        Спасибо, пропустил.

        Надо сказать, среди остальных примитивов она резко выделяется сложностью (и примитивом не является, т.к. использует другой примитив).

        XOR, перестановка, скроллинг — они интуитивно понятны любому компьютерщику. Сеть, даже сейчас, когда я прочитал пост по ссылке, совсем не кажется интуитивно понятной. Почему именно так? Почему отлитое в граните понятие «раунда»?


  1. gonzazoid
    15.06.2015 16:04
    -2

    >с доказанной неустойчивостью к взлому.
    в личку муторно, поправьте пожалуйста.


    1. StrangerInRed Автор
      15.06.2015 20:24

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


      1. gonzazoid
        15.06.2015 21:31
        +1

        это называется: с доказанной устойчивостью к взлому.


      1. ZyXI
        16.06.2015 23:24

        .


  1. Scratch
    15.06.2015 16:09
    +6

    6) Для построения более-менее стойкого шифра


    Я бы добавил, что не стоит пытаться самому никогда что-то построить, пока у вас нет ученой степени по математике


    1. maximw
      15.06.2015 17:58

      «Не повторяйте это дома».


    1. StrangerInRed Автор
      15.06.2015 20:17

      Статья знаний, на случай если «прижмет». Знаете как бывает, никогда не подумаешь, что может пригодятся. Но, даже элементарная криптография бывает очень полезна.


      1. Scratch
        15.06.2015 22:12
        +3

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


      1. HurrTheDurr
        15.06.2015 22:22
        +1

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


  1. Greyushko
    15.06.2015 16:50

    Я правильно понял из вашего профиля, что вы решили, что этот шифр более стойкий, чем AES? Почему? Потому что самостоятельно не удается его сломать? Потому что много всего намешано? Какое вообще обоснование подводится? Наличие лавинного эффекта?


    1. StrangerInRed Автор
      15.06.2015 20:23

      Предлагайте варианты взлома — я буду только рад. Любой вклад ценен. Стойкий за счет как минимум:
      1) большей энтропии входных данных (в 2 раза)
      2) используется сеть фейстеля (принцип тот же)
      3) используется подстановочно-перестановочная сеть (принцип тот же)
      4) достаточное количество раундов для сложной обратимости алгоритма (много больше чем в AES)
      5) большее количество раундов для генерации ключа раунда
      Но в основном именно за счет соблюдения классических перестановки-подстановки-гаммирование (что есть и в AES) + большая размерность ключа.


      1. Greyushko
        15.06.2015 20:31

        Просто оставлю это здесь.
        Если коротко: Любой может создать криптосхему, которую сам не может взломать. То что десяток людей на хабре, которые заморочатся, не смогут этого сделать, не означает, что он нереально стойкий и может использоваться в жизни.
        Вопросов несколько:
        1) Зачем оно нужно, если есть AES и ГОСТ 28147-89? Даже стойкость уровня 128 еще много десятилетий будет адекватной.
        2) Чем ваш алгоритм лучше приведенных по характеристикам, отличным от стойкости (производительность, схемотехническая сложность (простота)?


        1. StrangerInRed Автор
          15.06.2015 20:36

          Принцип Шнайера действует, да. Я не против, я только за. Зачем нужно — теоритически будет лучше работать на 64-битных архитектурах, т.к. работа в основном ведется 64-битными блоками. Нет сложных операций, за учетом сложения, вычитания и xor.


      1. galaxy
        16.06.2015 08:04

        1) o_O? Вы точно понимаете слова, которые пишете?
        2) не используется
        3) в AES она же
        4), 5) почему надо ваш шифр брать, а не в AES раундов добавить?


        1. StrangerInRed Автор
          16.06.2015 08:10

          1) Конечно понимаю, больша энтропия достигается большей разрядностью данных и ключа. Было: энтропия ключа — 256 бит, стало 512 бит.


          1. galaxy
            16.06.2015 08:23

            Энтропия? Ключа?
            У какого ключа больше энтропия: 00000000000000000000000000000000 или 0100011000011101?


            1. StrangerInRed Автор
              16.06.2015 08:37

              При одинаковых функциях распределения входных данных энтропия сообщения с большой битовой длинной будет больше, Ваш К.О. Можете посчитать из определения в википедии.


              1. galaxy
                16.06.2015 10:12
                +1

                Наезд на энтропию отменяется :) приношу извинения, кофе не пил еще, наверно в этом все дело


          1. hellman
            20.06.2015 00:22

            Большая эээ, как вы называете, «энтропия» входных данных как раз не способствует стойкости шифра, а наоборот. Чтобы статистически «запутать» все биты текста и ключа, при большем размере входных данных потребуется больше раундов. Вы взяли количество раундов «от балды», и для 512 бит это может оказаться недостаточным.

            Кроме того, насколько видно из схемы — диффузия в вашем шифре очень слабая (грубейшая ошибка!): межбайтовая диффузия есть только там, где сложение первого байта с 6м, и 4го с 5м. По сути, ваш шифр практически полностью байт-ориентирован и наверняка подвержен Integral attack, не говоря про обычные дифференциалы.

            Описывать проектирование шифра и не замолвиться о диффузии — это, простите, фэйл. Не говоря про остальные косяки. Вместо создания недошифра, лучше бы в качестве примера разобрали какой-нибудь известный шифр.


            1. StrangerInRed Автор
              20.06.2015 16:58

              А за 31 раунд к.о. намекает, что с количеством байтовых перестановок и перестановок блоков 64-битных, диффузия окажется достаточной. Может вы не до конца поняли схему, лучше посмотрите реализацию на С.


        1. StrangerInRed Автор
          16.06.2015 08:34

          то что используется в IDEA тоже называется сетью Фейстеля, но выглядит она изрядно модифицированной


          1. b_oberon
            16.06.2015 13:29

            Не называется. Это схема Lai-Massey (вики, вики и IACR).


            1. StrangerInRed Автор
              16.06.2015 13:49

              В алгоритме IDEA используется глубоко модифицированная сеть Фейстеля.

              вики, параграф «Модификации сети Фейстеля»


              1. b_oberon
                18.06.2015 09:41
                +1

                Русская вики, к сожалению, весьма вольно обходится с терминологией. В культурных кругах такую схему называют в лучшем случае квази-фейстелевой. Для описания и исследования сети Фейстеля и схемы Lai-Massey используются разные математические аппараты, и объединять эти схемы некорректно.


      1. NeverWalkAloner
        16.06.2015 08:54

        Предлагайте варианты взлома — я буду только рад.

        Как на счет линейного криптоанализа?
        В DES для того чтобы скрыть зависимость шифртекста от раундового ключа используются S-боксы.

        В вашем же шифре, если я правильно понял, операция обеспечивающая нелинейность отсутствует. Соответвенно, если разобрать все перестановки и убрать байты «вектора инициализации», используемые на первом шаге алгоритма, можно получить уравнение вида C1^C2^C3^P1^P2^P3=K1^K2^K3, выполняющееся со 100% вероятностью. Что уже автоматически делает ваш алгоритм гораздо более слабым, чем тот же DES.


        1. StrangerInRed Автор
          16.06.2015 09:03

          Так там тоже S-box есть. Таблица побайтовой подстановки 64-битного блока (bytes substitution for 1,3,4,6 blocks). Можете конкретно реализацию смотреть на гитхабе, если схема вызывает вопросы.


          1. NeverWalkAloner
            16.06.2015 09:24

            Простите, действительно не стал лезть в код и не увидел что S-box у вас все-таки есть.
            Но даже в этом случае надо провести очень тщательное исследование, чтобы убедиться, что s-box обеспечивает приемлемый уровень нелинейности.
            Я это к тому, что проектирование криптоалгоритма это не только ловкое жонглирование битовыми операциями, но и предугадывание возможных атак.

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


    1. StrangerInRed Автор
      15.06.2015 20:33

      Кстати когда принимали стандар, никто не доказывал, что Rijandel достаточно стойкий. Просто группа экспертов посмотрела на схему, немного поговорили, посмотрели на примеры входных данных, и решили что он достаточно стойкий. Тяжело доказать стойкость шифра, который не является достаточно математически примитивным, как xor например. В DES за счет необратимости функции генерации ключей (есть там таблица, подстановка по которой не считается обратимой, т.е. есть несколько одинаковых элементов), только из-за этого сделали вывод, что у него есть «слабые ключи».


      1. Greyushko
        15.06.2015 20:36
        +1

        Группа экспертов посмотрела на схему, поговорила, утвердила… А потом в течение 15 лет весь мир его изучал со всех сторон и не нашел существенных недостатков.


        1. StrangerInRed Автор
          15.06.2015 20:38

          Но, для принятия в качестве стандарта, хватило лишь группы экспертов. Время — оно течет, DES тоже был стандартом. Прийдет время, и AES перестанет им быть.


      1. galaxy
        16.06.2015 08:21

        Вот же блин, все говорят AES, AES, а тут оказывается просто междусобойчик какой-то.

        Вообще, все так и есть, как вы написали. Не считая пары мелких деталей: например, того, что смотрели и говорили три года; что был конкурс из 15 алгоритмов, в 10 из которых таки были обнаружены существенные уязвимости; что смотрение и говорение включало в себя в том числе и определенную многомесячную работу по криптоанализу; что, наконец, участвовали в обсуждении как минимум 250 экспертов с мировыми именами, конкурс проводил Национальный институт стандартов и технологий США, а заявленной целью нового стандарты была в том числе «защита важной правительственной информации в следующем веке».

        Сравните со своей доказательной базой выше.


        1. StrangerInRed Автор
          16.06.2015 08:42

          Так у меня и не было никакой доказательной базы, я просто перечислил набор элементарных криптографических операций и показал пример, как все это собрать в кучу. Я о том, что случилось с теми 5ю, в которых уязвимости обнаружены небыли? Сделали считалочку и выбрали Rijandel, да? Как вы думаете, это происходило?


          1. galaxy
            16.06.2015 10:11

            Т.е. по-вашему они там три года ни черта не делали, и поэтому вы вправе заявить, что ваш шифр не хуже Rijandel (даже лучше — ведь ключ длиннее)?


            1. StrangerInRed Автор
              16.06.2015 10:29

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


          1. b_oberon
            16.06.2015 13:32

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


            1. StrangerInRed Автор
              16.06.2015 13:55

              Если вы возьмете корпус, колеса и внутренности, соединив их используя стандартизированные разъемы, где просто по другому не состыкуется, то с крайне большой вероятностью получится именно автомобиль. Еще пример — нельзя вставить USB (не Type-C) кабель не той стороной. А как вы думаете выбирали блоки подстановки и величины сдвигов в AES? Набор констант в AES «Первые несколько бит двоичного представления корня из 2» насколько я помню.


              1. NeverWalkAloner
                16.06.2015 15:27

                А как вы думаете выбирали блоки подстановки и величины сдвигов в AES?


                Вот в этом документе написано. В частности:
                2. Minimisation of the largest non-trivial correlation between linear combinations of input bits and linear combination of output bits;
                2. Resistance against attacks using truncated differentials [Kn95];
                3. Resistance against the Square attack [DaKnRi97];
                • Attacks in which part of the Cipher Key is known to the cryptanalyst;
                • Attacks where the Cipher Key is known or can be chosen[Kn95a];
                • Related-key attacks [Bi93], [KeScWa96].


                1. StrangerInRed Автор
                  16.06.2015 15:43

                  Ну да, а как вы думаете это происходило? Взяли наборы некоторых исходных данных, с некоторыми распределениями, а потом посмотрели какое распределение вышло из того, там прикрутили, там прикрутили.

                  For Rijndael with a block length and key length of 128 bits, no shortcut attacks have been
                  found for reduced versions with more than 6 rounds. We added 4 rounds as a security margin.

                  Нам было достаточно 6-ти раундов, но мы прикрутили еще 4, чтоб было веселее. Моя схема так же предполагает “full diffusion”. Можете поисследовать наборы входных и выходных данных.


                  1. NeverWalkAloner
                    16.06.2015 18:18

                    Ну да, а как вы думаете это происходило?

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


                    1. StrangerInRed Автор
                      16.06.2015 19:20

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


  1. b_oberon
    15.06.2015 19:50

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

    Это все к тому, что криптография, в традиционном еe понимании работает только с целыми числами, в более узком понятии только с элементами поля Галуа.

    Really? К какому полю относятся, например, подстановки или косы? Вообще, в статье от полей нет ничего, кроме названия (даже определения ради приличия не привели).

    … если достаточно большой и достаточно случайный – образует идеальный шифр одноразовых блокнотов, с доказанной неустойчивостью к взлому.

    «Достаточно большой» и «достаточно случайный» — не лучшие определения, когда речь идет об одноразовом блокноте. Да и стойкость к взлому у него как раз доказанная.

    Сложение по модулю 2^8, ^16, ^32, ^64 – элементарное сложение в поле Галуа

    Скорее уж в аддитивной группе. Поля здесь пока нет.

    1101 = 0101 (little endian)

    Да не равны они, хоть убейте!

    Для построения более-менее стойкого шифра

    Выше уже написали: не пытайтесь повторить это дома. Не заметил в схеме шифра чего-то более веселого, чем «AES на коленке». А вот реализация точно будет не самой удобной: далеко не все процессоры умеют нативно 64-битные слова перемалывать. Кстати, вы обещали обозначать арифметическое сложение плюсом в квадрате…

    А большое количество раундов повторения – для устойчивости к прямому подбору.

    Простите, я даже Кока-колой квасом подавился.


    1. StrangerInRed Автор
      15.06.2015 20:58

      Скорее уж в аддитивной группе. Поля здесь пока нет.

      Да вы правы, со сложением это только аддитивная группа.
      Да не равны они, хоть убейте!

      Это всмысле что второе произошло после перестановки битов первого. Конечно же они не равны.
      далеко не все процессоры умеют нативно 64-битные слова перемалывать

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


      1. hellman
        19.06.2015 23:44

        Да вы правы, со сложением это только аддитивная группа.


        Замечание было скорее в том, что сложение по модулю степени двойки к полям не имеет никакого отношения (кроме степени = 1). В конечном поле GF(2^k) сложение это xor. Сложение по модулю простого числа — это сложение в конечном поле, да.


        1. StrangerInRed Автор
          20.06.2015 17:00

          Ну попробуйте использовать xor как сложение в поле 2^8. Переполнение при сложении конечно же никто не учитывал.


  1. toxicdream
    16.06.2015 07:33

    *здесь должен быть график с эффектом Даннинга — Крюгера, на котором точкой B отмечено положение пользователя StrangerInRed *


    1. toxicdream
      16.06.2015 07:47

      И кстати, где пункт под номером 5?


      1. StrangerInRed Автор
        16.06.2015 08:15

        Спасибо, опечатка.


    1. StrangerInRed Автор
      16.06.2015 08:15

      Эффект Даннинга-Крюгера должен быть подвержен эффекту Даннинга-Крюгера.

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


  1. ALPINE63rus
    16.06.2015 12:20

    5) Для построения более-менее стойкого шифра

    Рекомендуется к прочтению статья: «Вы опасно некомпетентны в криптографии».


    1. StrangerInRed Автор
      16.06.2015 12:40

      Читал, как только ее опубликовали.


  1. Yaruson
    17.06.2015 07:31

    Эту статью можно считать средством систематизации, складирования знаний...
    Спасибо, именно этого мне не хватало во время чтения ГОСТа 28147-89.