Почему расшифровка не возвращает ожидаемое значение?
При использовании C# rijndael для расшифровки строки, которая была ранее зашифрована и сохранена на сервере sql ce, я ничего не получаю от расшифровки. По отладке и проверке базы данных я могу сказать, что расшифрованная строка, похоже, сохранена, как и ожидалось, с разными наборами бессмысленности для разных входных строк, поэтому я предполагаю, что проблема в коде дешифрования. Я также подтвердил, что входной параметр cipherText получил правильное количество байтов после извлечения из базы данных и преобразования в байтовый массив. Я использовал пример, найденный по адресу: http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael%28v=vs.110%29.aspx чтобы сделать это с некоторыми изменениями.
static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
// Declare the string used to hold
// the decrypted text.
string plainText = null;
// Create an Rijndael object
// with the specified key and IV.
using (Rijndael rijAlg = Rijndael.Create())
{
rijAlg.Key = Key;
rijAlg.IV = IV;
rijAlg.Padding = PaddingMode.PKCS7;
// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
var plainBytes = new byte[cipherText.Length];
int plainByteCount;
// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
plainByteCount = csDecrypt.Read(plainBytes, 0, plainBytes.Length);
using (StreamReader srDecrypt = new StreamReader(csDecrypt, System.Text.Encoding.Unicode))
{
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
plainText = srDecrypt.ReadToEnd();
}
}
}
plainText = Encoding.Unicode.GetString(plainBytes, 0, plainBytes.Length);
}
return plainText;
}
В
plainText = srDecrypt.ReadToEnd();
plainText получает значение "", где я ожидаю, что это будет расшифрованное слово.
Наконец, в
plainText = Encoding.Unicode.GetString(plainBytes, 0, plainBytes.Length);
обычный текст становится: "\0\0\0\0\0\0\0\0"
Я пробовал различные варианты заполнения, как на этапах шифрования, так и на этапе дешифрования, и вижу, что это дает эффект, но не решает проблему. Без установки отступа в первую очередь шифруется 0 байтов, где должно быть 16 байтов. Я также пробовал разные способы колла флеша и флешфиналблока. Я храню ключ /iv в текстовых файлах (я знаю, что это может быть не лучшим решением для безопасности, моя цель на данный момент - только узнать больше об этой теме).
Пожалуйста, помогите мне найти, что я делаю не так здесь.
1 ответ
Я столкнулся с подобной проблемой в VB.NET и обнаружил, что переменные, которые будут использоваться как в процессе шифрования, так и в процессе дешифрования, должны быть одинаковыми. Предоставление функциям шифрования и дешифрования их собственных локальных переменных определенно приведет к тому, что функция дешифрования вернет неправильное значение. Попробуйте сделать ключ и iv глобальной переменной вместо локальной.