Всегда ли Rijndael выбрасывает исключение, если пароль неверный? - PullRequest
0 голосов
/ 13 октября 2009

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

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

Это правда в 100% случаев? Могу ли я покончить с контрольной суммой и просто поймать исключение?

Ответы [ 2 ]

3 голосов
/ 13 октября 2009

При всех алгоритмах симметричного ключа в .Net проверка выполняется в последнем блоке, который содержит информацию о заполнении (обычно PKCS7 ). Если последний дешифрованный блок не содержит действительной информации о заполнении, предполагается, что данные «плохие» (или ключ «плохой»). Для режимов блочного шифрования этот метод довольно хорош, так как вероятность случайного коллизии, которая соответствует действительному формату информации заполнения, очень мала. Для режимов ECB все меняется, но режим ECB все равно нарушается и никогда не должен использоваться.

Многие приложения используют «волшебные» числа и текст в начале данных для проверки формата расшифрованного содержимого. 100%, пуленепробиваемая точность потребует, чтобы вы, вероятно, добавили собственный HMAC к данным. Если у вас есть контроль над форматом, я настоятельно рекомендую подписывать зашифрованные данные.

2 голосов
/ 13 октября 2009

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

(Как отметил Ремус, заполнение последнего блока можно использовать для перехвата неверных данных, но некоторые файлы вообще не нуждаются в заполнении, а иногда неправильные данные могут создавать что-то, похожее на правильное заполнение.) 1003 *

Где вы получаете исключение? Это при попытке загрузить расшифрованные данные в виде изображения? В этом случае вы не можете полагаться на это как на 100% безопасный способ определения правильности ключа, так как существует небольшая вероятность того, что случайные данные могут сформировать что-то, что может быть загружено в виде изображения.

Хранение контрольной суммы MD5 исходных данных вместе с зашифрованными данными также не является хорошей идеей. Это означает, что у вас есть информация о исходных данных, которая не зашифрована и может использоваться для взлома ключа.

...