Как изменить зашифрованный текст CBC, чтобы изменить сообщение


В настоящее время я изучаю шифрование и надеюсь найти больше разъяснений о том, что я узнал.

Предположим, что сообщение "100 долларов должны быть перемещены со счета 123456 на 555555" было зашифровано с помощью aes-128-cbc и случайного IV. мой профессор говорит, что можно изменить зашифрованный текст так, чтобы при повторной расшифровке сообщение гласило: "900 долларов должны быть перемещены со счета 123456 на 555555". Как вы собираетесь это сделать?

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

Для этого мы используем базовую командную строку linux.

Любая помощь или объяснение были бы потрясающими!

2 3

2 ответа:

Предположим, что строка была зашифрована с помощью одноразовой клавиатуры и полученный шифртекст "B8B7D8CB9860EBD0163507FD00A9F923D45...". Мы знаем, что первый байт открытого текста, цифра 1, имеет код ASCII 0x31. Первый байт шифротекста - 0xB8. Если k0 обозначает первый байт ключа, то 0x31 xor k0 = 0xB8. Декодирование одноразовой клавиатуры - это всего лишь кодирование зашифрованного текста ключом. Таким образом, человек, декодирующий получает первый байт открытого текста как 0x31 = 0xB8 xor k0. Если значение первого байта шифротекст с М0, то человек расшифровывает шифротекст будет (0xB8 исключающее ИЛИ М0) значение К0. Но это просто (0xB8 xor k0) xor m0, поскольку xor коммутативен и ассоциативен. Последнее выражение может быть уменьшено до 0x31 xor m0. Теперь мы хотим изменить полученный байт на 0x39, код ASCII для цифры 9. Поэтому нам нужно решить 0x31 xor m0 = 0x39. Но это просто просто xor с 0x31 с обеих сторон.

Тот же принцип применяется и при использовании режима CBC. Вы можете изменить капельницу таким же образом, как измените расшифрованное сообщение.

Приведенные выше рассуждения @ user515430 основаны на том факте, что каждый зашифрованный текст C линейно зависит от открытого текста P (начиная с C = P ⊕ K).

На самом деле, как заставляет нас заметить @polettix, в шифровании CBC мы имеем, например, для 6-го блока определенного текста C₆ = E(P₆ ⊕ C₅, K), заданного ключом K; и если E(·) является хорошей функцией шифрования, мы должны потерять такую линейность.

Но, в CBC расшифровке , 6-й блок открытого текста будет получен как P₆ = D(C₆, K) ⊕ C₅, поэтому он будет линейно зависим не от C₆, а от C₅.

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

См. также https://crypto.stackexchange.com/q/30407/36884 (для записи, криптография StackExchange является правильным сайтом для такого рода вопросов).