Мне нравится Can Gencer answer; вы не можете действительно проверить расшифровку без HMAC.
Но если у вас очень большой открытый текст, расшифровка может быть очень дорогой. Вы можете проделать массу работы только для того, чтобы узнать, что пароль недействителен. Было бы неплохо иметь возможность быстро отклонять неправильные пароли, не проделывая всю эту работу. Есть способ использовать PKCS#5 PBKDF2. (стандартизовано в RFC2898, который доступен для вашей программы C# в Rfc2898DeriveBytes).
Обычно протокол данных требует генерации ключа из пароля и соли с использованием PBKDF2 с частотой 1000 циклов или заданным числом. Затем, возможно, также (необязательно) вектор инициализации через продолжение того же алгоритма.
Чтобы реализовать быструю проверку пароля, сгенерируйте еще два байта через PBKDF2. Если вы не создаете и не используете IV, просто сгенерируйте 32 байта и сохраните последние 2. Сохраните или передайте эту пару байтов рядом с вашим криптотекстом. На стороне расшифровки получите пароль, сгенерируйте ключ и (возможно, одноразовый) IV, затем сгенерируйте 2 дополнительных байта и сравните их с сохраненными данными. Если пары не совпадают, вы знаете, что у вас неправильный пароль без какой-либо расшифровки.
Если они совпадают, это не гарантирует, что пароль правильный. Для этого вам все еще нужен HMAC полного открытого текста. Но вы можете сэкономить массу работы и, возможно, время настенных часов, в большинстве случаев «неправильный пароль», и без ущерба для безопасности всей системы.
ps: вы написали:
Самый простой способ, который я могу придумать, - это поместить «магическое число» в начало сообщения при шифровании и проверить, сохраняется ли оно после расшифровки.
Избегайте помещения открытого текста в криптотекст. Он лишь выставляет другой вектор атаки, облегчает злоумышленнику устранение неправильных поворотов. Проверка пароля, о которой я упоминал выше, — это другое животное, не подвергающее этому риску.
person
Cheeso
schedule
23.05.2011