Как зашифровать AES в .NET без IV

У нас есть унаследованная часть нашего классического приложения ASP, которая использует некоторый код, который должен шифровать / дешифровать строки с помощью Rijndael (AES). Этот код был найден в Интернете здесь (Rijndael AES Block Cipher (версия VB)) . Я уже нашел вопрос о SO, который ссылается на эту точную библиотеку и который задает почти то же самое, что и меня, но я подозреваю, что что-то пошло не так (кроме добавления длины данных для шифрования в начало массива байтов). Реализация vbScript совсем не похожа на добавление IV к данным для шифрования. Итак, я не могу сопоставить такое же шифрование с RijndaelManaged, поскольку оно:

  1. автоматически генерирует разные IV каждый раз
  2. абсолютно требует IV

Кто-нибудь знает, можно ли AES зашифровать что-то в .Net без указания IV (пустого)?


person MaxiWheat    schedule 24.04.2012    source источник
comment
Я не понимаю вопроса на 100%. Зачем нужно совпадать шифрование? (обычно имеет значение только то, что дешифрование работает, а не то, что одни и те же данные, зашифрованные несколько раз, выглядят одинаково при шифровании).   -  person Steve Campbell    schedule 25.04.2012
comment
Фактически, классическое приложение ASP шифрует и расшифровывает строки AES, но в основном расшифровывает строки, поступающие из приложения .Net. Поэтому мне нужно зашифровать с помощью AES в .Net и иметь возможность расшифровать эту строку в классическом ASP с предоставленной реализацией AES vbScript (которая, похоже, не поддерживает IV), поскольку vbScript не поддерживает AES изначально.   -  person MaxiWheat    schedule 25.04.2012


Ответы (3)


И код, который вы используете, и решение вашей проблемы совершенно небезопасны. Во-первых, * НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ НЕ СЛЕДУЕТ ИСПОЛЬЗОВАТЬ КРИПТО-БИБЛИОТЕКУ НАПИСАЛ НЕКОТОРЫЙ СЛУЧАЙНЫЙ ПАРЕНЬ * Период, конец истории. И Windows, и .net имеют проверенные, проверенные библиотеки шифрования. У них нет таких вещей, как проблемы с тайминговыми атаками, правильные бэкдоры или просто идиотские вещи, которые никто не знал бы о криптографии.

В данном случае упомянутая вами библиотека поддерживает только Режим ЕЦБ. Это совершенно небезопасно, и никто, кто знал, что делал, не стал бы этого делать. Хотя для этого есть множество причин, лучшая демонстрация того, почему не следует этого делать, заключается в следующем:

введите описание изображения здесь

Это зашифрованное изображение пингвина linux, зашифрованное с помощью ecb. Не очень-то безопасно?

person imichaelmiers    schedule 25.04.2012
comment
Есть приложения, в которых ECB безопасен и уместен. - person erickson; 25.04.2012
comment
Очень, очень мало и очень конкретных вещей, которые вряд ли могут быть тем, что делает простой веб-сервис, но да, они существуют. Однако написание криптографической библиотеки, которая поддерживает только это, в значительной степени является любительским занятием. - person imichaelmiers; 25.04.2012
comment
Самостоятельное написание крипто-библиотеки - занятие для любителей. - person erickson; 25.04.2012
comment
Крипто-библиотека, которую я использую в классическом asp, является (если я доверяю комментариям, написанным в источнике) vbscript-адаптацией C-реализации AES - person MaxiWheat; 26.04.2012
comment
Даже если вы доверяли этим комментариям, чего не следует, откуда взялся код C? Кто написал библиотеку (на c или vb), которая поддерживает только режим ECB. Любой, кто действительно знал, что делает, вероятно, поддержал бы другие режимы. Это оставляет две возможности: у вас неполный порт библиотеки C, и в этом случае что еще они упустили. Или библиотека c поддерживает только режим ECB. В этом случае вы вернетесь к исходной точке, потому что его автор, вероятно, был не так хорош. - person imichaelmiers; 26.04.2012
comment
Отличный режим ECB с Padding = true устранил мою проблему, и теперь обе библиотеки соответствуют своим результатам. Спасибо - person MaxiWheat; 26.04.2012
comment
Упс, я имею в виду Padding = PaddingMode.Zeros - person MaxiWheat; 27.04.2012
comment
Великолепная цитата Джеффа Этвуда: я, честно говоря, не понимал, что можно выбрать режим шифрования, в котором не будет какой-то цепочки блоков! CipherMode.ECB? Больше похоже на CipherMode.Fail! - person JoelFan; 07.06.2012

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

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

IV для шифрования в режиме CBC всегда имеет размер ровно один блок (16 байтов для AES, но всегда используйте метод getBlockSize(), когда он доступен.

person Maarten Bodewes    schedule 25.04.2012

Явно установите свойство Mode вашего зашифровать до ECB.

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

person erickson    schedule 25.04.2012
comment
Или счетчик, как с AES в режиме CTR. - person Cheeso; 26.04.2012