Рейтинг:1

Безопасность заполнения PKCS7

флаг us

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

PKCS7 заполняет каждый дополненный байт общим количеством заполненных байтов. Каждый раз добавляется хотя бы один байт заполнения, в худшем случае — целый блок. Когда я работаю с шифром в режиме электронной кодовой книги, последний блок может быть легко угадан для атаки по известному открытому тексту. (Мгновенно в 1 из 16 случаев [размера блока]) Пример заполнения показан ниже.

53 65 63 72 65 74 20 74 65 78 74 2e --> 53 65 63 72 65 74 20 74 65 78 74 2e 04 04 04 04

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

53 65 63 72 65 74 20 74 65 78 74 2e --> 53 65 63 72 65 74 20 74 65 78 74 2e 5a 2c 12 04

Заранее спасибо.

kelalaka avatar
флаг in
Подделывайте отступы, используйте режимы на основе PRF, такие как CTR, и никогда не забывайте, что CBC защищен IND-CPA, как и режим CTR. Так что никакая атака невозможна. `CPA = Атака с выбранным открытым текстом`
Luqus avatar
флаг us
Спасибо за ответ, но если я специально использовал ECB, то должна быть угроза безопасности или нет? Например, в стандартных реализациях на Java для ECB с AES вы можете **только** выбрать PKCS5 в качестве алгоритма заполнения, который имеет ту же слабость. Интересно, почему это реализовано по умолчанию, даже если это представляет угрозу безопасности (независимо от самого ЕЦБ).
Paul Uszak avatar
флаг cn
Рассматривали ли вы добавление какой-либо формы MAC/HMAC? Это помогает с безопасностью заполнения.
kelalaka avatar
флаг in
Если вы используете ECB, вы уже на неверном пути. ECB существует для обратной совместимости и для тех, кто знает, что делает. Вы можете использовать `ECB/nopadding` и применить свое дополнение. Ваше заполнение помогает вам только в том случае, если у вас есть только один блок, который может устранить равенство, если у вас есть более 1 блока, это совсем не помогает.
Luqus avatar
флаг us
Мне понятны многочисленные недостатки ЕЦБ, не волнуйтесь. Но представьте ситуацию, в которой вы были бы вынуждены использовать ECB по какой-либо причине. Кроме того, я знаю о `NoPadding` в Java, но вам не нужно реализовывать Padding самостоятельно при использовании **единственного** реализованного заполнения `PKCS5`. Почему нет другой _стандартной реализации_?
kelalaka avatar
флаг in
Потому что этим никто не пользуется. больше, чем много лет назад, я использовал такую ​​прокладку для своего проекта. padding - ваш друг для реализации такого paddind
Рейтинг:2
флаг in

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

53 65 63 72 65 74 20 74 65 78 74 2e --> 53 65 63 72 65 74 20 74 65 78 74 2e 5a 2c 12 04

Это в основном известно как Прокладка ISO 10126, совместим с Прокладка ANSI X9.23.

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

Во-вторых, зашифрованный текст теперь будет принят (т. е. не будет генерировать ошибку заполнения) 1 раз из 256/8 = 32 раза (последний байт оценивается 01 к 08) вместо примерно одного раза из 256 (последний байт оценивается 01 или конечные байты оцениваются 02 02 и т.д.). Это исключает использование заполнения для целостности/аутентичности сообщения.

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

Наконец, вы не устранили накладные расходы.


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

Maarten Bodewes avatar
флаг in
Забавный факт: я нашел эту статью, когда показывал, что XML-шифрование без генерации XML-подписи — **не** хорошая идея. И даже если вы используете XML-подпись, вы должны быть очень внимательны.

Ответить или комментировать

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