Объяснение свойства самовосстановления CBC (Cipher Block Chaining)

Википедия:

Режим CBC обладает свойством самовосстановления: если изменен один блок шифра, ошибка распространяется не более чем на два блока.

Пример составления:

Пусть размер блока будет 64 бита. Исходный открытый текст:

3231343336353837  3231343336353837  3231343336353837  • • •

Правильный зашифрованный текст:

ef7c4bb2b4ce6f3b  f6266e3a97af0e2c  746ab9a6308f4256 • • •

Если зашифрованный текст поврежден, а байт '0x4b' изменен на '0x4c':

ef7c4cb2b4ce6f3b  f6266e3a97af0e2c  746ab9a6308f4256  • • •

Затем расшифровывается:

efca61e19f4836f1  3231333336353837  3231343336353837  • • •

Вопрос:

Мне трудно понять свойство самовосстановления CBC (Cipher Block Chaining), я думал, что может помочь составленный пример, но теперь я еще больше запутался. Любая помощь будет здорово.


person Node.JS    schedule 11.10.2014    source источник
comment
Ваш вопрос был бы еще лучше, если бы вы предоставили код для создания своего примера, включая IV и ключ, чтобы другие знали, как воспроизвести ваш пример. Я предполагаю, что вы использовали DES?   -  person Perseids    schedule 12.10.2014
comment
@Персеиды Да. Я использовал DES.   -  person Node.JS    schedule 12.10.2014


Ответы (2)


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

Исходная расшифровка CBC

Теперь давайте добавим немного коррупции:

Повреждённая расшифровка CBC

Красные точки представляют собой частично поврежденные входные данные, а сплошная красная линия представляет собой полное повреждение блока.

Некоторые обозначения перед тем, как мы начнем: я буду нумеровать исходные блоки открытого текста от p1 до p3, поврежденные — от p1' до p3', правильные блоки зашифрованного текста — от c1 до c3, а поврежденные — от c1' до c3'. :

3231343336353837  3231343336353837  3231343336353837  • • •
       p1                p2                 p3

ef7c4bb2b4ce6f3b  f6266e3a97af0e2c  746ab9a6308f4256  • • •
       c1                c2                 c3

ef7c4cb2b4ce6f3b  f6266e3a97af0e2c  746ab9a6308f4256  • • •
       c1'               c2'=c3             c3'=c3

efca61e19f4836f1  3231333336353837  3231343336353837  • • •
       p1'               p2'                p3'=p3

Есть также некоторые IV, которые вы не указали в своем примере.

Давайте посмотрим на первый блок: изменены три бита на входе блочного шифра (0x4b ^ 0x4c = 0x07 = 4+2+1). Поскольку блочный шифр предназначен для псевдослучайной перестановки — то есть биективной функции, неотличимой от случайной функции (без знания ключа k), — мы получаем полностью (псевдо) случайный блок в качестве вывода функции дешифрования:

    dec(      c1        ,k) =         p1       XOR IV
<=> dec(ef7c4bb2b4ce6f3b,k) = 3231343336353837 XOR IV
    dec(      c1'       ,k) =         p1'      XOR IV
<=> dec(ef7c4cb2b4ce6f3b,k) = efca61e19f4836f1 XOR IV

В качестве следующего шага IV подвергается XOR, поэтому мы получаем

    dec(      c1        ,k) XOR IV =         p1       
<=> dec(ef7c4bb2b4ce6f3b,k) XOR IV = 3231343336353837 
    dec(      c1'       ,k) XOR IV =         p1'      
<=> dec(ef7c4cb2b4ce6f3b,k) XOR IV = efca61e19f4836f1 

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

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

    dec(      c2        ,k) =         p2       XOR         c1
<=> dec(f6266e3a97af0e2c,k) = 3231343336353837 XOR ef7c4bb2b4ce6f3b
                                                    ^

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

             c2      = enc(        p2       XOR         c1      ,k)
<=> f6266e3a97af0e2c = enc(3231343336353837 XOR ef7c4bb2b4ce6f3b,k)

Следующий шаг — снова применение XOR с предыдущим блоком (на этот раз не IV, а c1'). Этот предыдущий блок c1' поврежден:

    dec(      c2        ,k) XOR       c1'        =         p2       XOR         c1       XOR        c1'
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231343336353837 XOR ef7c4bb2b4ce6f3b XOR ef7c4cb2b4ce6f3b

Теперь мы можем вычислить c1 XOR c1' (ошибку) как c1 XOR c1' = 0000007000000000 и заменить это везде:

    dec(      c2        ,k) XOR       c1'        =         p2       XOR 0000007000000000
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231343336353837 XOR 0000007000000000

И, наконец, упростите p2 XOR 0000007000000000 = p2':

    dec(      c2        ,k) XOR       c1'        =         p2'      
<=> dec(f6266e3a97af0e2c,k) XOR ef7c4cb2b4ce6f3b = 3231333336353837

Вы видите, что исходное искажение (0x07) первого блока зашифрованного текста c1' дословно перенесено во второй блок открытого текста p2', но в остальном оно остается неповрежденным (как показано в основном белым блоком на графике с одним красным квадратом). ). Это специфическое свойство CBC может привести к атакам на системы реального мира, таким как атака оракула заполнения.

Третий блок чертовски скучен: никакие входные данные для расшифровки и XOR не изменились, поэтому p1=p1' и там все в порядке.

person Perseids    schedule 11.10.2014

При расшифровке в режиме CBC блок расшифровывается, сначала расшифровывая рассматриваемый блок с помощью ключа, а затем выполняя операцию XOR с предыдущим блоком в зашифрованном тексте. Взгляните на рисунок CBC mode на вики.

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

person Ebbe M. Pedersen    schedule 11.10.2014