Лично я нахожу графику расшифровки очень полезной для таких вопросов. Из Википедии (изображение, являющееся общественным достоянием):
![Исходная расшифровка CBC](https://i.stack.imgur.com/n1cne.png)
Теперь давайте добавим немного коррупции:
![Повреждённая расшифровка CBC](https://i.stack.imgur.com/D56Pl.png)
Красные точки представляют собой частично поврежденные входные данные, а сплошная красная линия представляет собой полное повреждение блока.
Некоторые обозначения перед тем, как мы начнем: я буду нумеровать исходные блоки открытого текста от 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