Принудительно расшифровать файл с неправильным ключом — C # Bouncy Castle

#c# #encryption #bouncycastle

#c# #шифрование #bouncycastle

Вопрос:

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

 <File>
    <EncryptedKey>session key encrypted with user's password hash</EncryptedKey>
    <Data>Data encrypted with session key</Data>
</File>
  

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

Это работает, когда пользователь вводит правильный пароль, но я хочу, чтобы приложение расшифровывало файл, даже если пароль неверный. Я использую Bouncy Castle, и теперь, когда пароль неверен (значит, и ключ сеанса неверен), он выдает исключение «Поврежден блок ввода». Я не хочу отображать какие-либо окна сообщений, информирующие о возникновении ошибки. Вместо этого я все равно хочу расшифровать файл и просто сохранить мусор в результате. Возможно ли это? Мой код для расшифровки:

 IBufferedCipher cipher = CipherUtilities.GetCipher("Rijndael/ECB/PKCS7Padding");
KeyParameter par = new KeyParameter(generateHash(password));
cipher.Init(false, par);
byte[] output = cipher.DoFinal(data); // Exception here when password is wrong
  

Я также пытался сначала использовать метод ProcessBytes (), а в конце метод doFinal (), но это тоже не сработало.

Комментарии:

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

2. Я не уверен, почему голосование против: это законный вопрос в свете требований (конечно, он не перечислил свои требования в исходном вопросе, но все же …) Иногда ответом даже на законные вопросы является «вы не можете попасть туда отсюда».

Ответ №1:

Это в первую очередь противоречит смыслу шифрования. Предположительно, вы могли бы перехватить исключение и в своем блоке catch записать ненужные данные (возможно, шестнадцатеричный дамп стека исключений?) в файл — но зачем? Как отметил Ramhound, это дало бы злоумышленнику данные пользователя, которые можно было бы использовать при атаке методом перебора для сравнения с тем, когда они успешно расшифровали файл.

Я бы вернулся к этапу предположений / проектирования этого: почему вы хотите избежать отображения сообщения, в котором говорится «Предоставленный пароль не соответствовал ожидаемому паролю. Пожалуйста, повторите ввод. Осталось 3 попытки «. (или что-то еще)? Что получается при выводе «мусорного» файла?

Комментарии:

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

2. Я бы прояснил это. Возможно, кто-то подумал: «Ну, а что, если файл расшифрован, но он не содержит ничего полезного?» (Да, у меня было это обсуждение) В таком случае, правильно это записать ненужные байты — чтобы доказать, что у вас есть только ненужные байты. Однако, если они хотят получить ненужные байты вместо сообщения об ошибке, это очень плохая практика.