Использую шифрование Rijndael. Проблема следующая: если зашифровать строку и тут же расшифровать, то все работает отлично, а если зашифровать строку и записать в файл, а потом считать его и расшифровать то выдает ошибку "System.Security.Cryptography.CryptographicException' occurred in mscorlib.dll Additional information: Заполнение неверно и не может быть удалено." Сам класс шифровки:
public static class SymmetricEncryptionUtility
{
private static bool _ProtectKey;
private static string _AlgorithmName;
public static string AlgorithmName
{
get { return _AlgorithmName; }
set { _AlgorithmName = value; }
}
public static bool ProtectKey
{
get { return _ProtectKey; }
set { _ProtectKey = value; }
}
public static void GenerateKey(string targetFile)
{
// Создать алгоритм
SymmetricAlgorithm Algorithm = SymmetricAlgorithm.Create(AlgorithmName);
Algorithm.GenerateKey();
// Получить ключ
byte[] Key = Algorithm.Key;
if (ProtectKey)
{
// Использовать DPAPI для шифрования ключа
Key = ProtectedData.Protect(
Key, null, DataProtectionScope.LocalMachine);
}
// Сохранить ключ в файле
using (FileStream fs = new FileStream(targetFile, FileMode.OpenOrCreate))
{
fs.Write(Key, 0, Key.Length);
}
}
public static void ReadKey(SymmetricAlgorithm algorithm, string keyFile)
{
byte[] Key;
using (FileStream fs = new FileStream(keyFile, FileMode.Open))
{
Key = new byte[fs.Length];
fs.Read(Key, 0, (int)fs.Length);
}
if (ProtectKey)
algorithm.Key = ProtectedData.Unprotect(Key, null, DataProtectionScope.LocalMachine);
else
algorithm.Key = Key;
}
public static byte[] EncryptData(string data, string keyFile)
{
// Преобразовать строку data в байтовый массив
byte[] ClearData = Encoding.UTF8.GetBytes(data);
// Создать алгоритм шифрования
SymmetricAlgorithm Algorithm = SymmetricAlgorithm.Create(AlgorithmName);
ReadKey(Algorithm, keyFile);
// Зашифровать информацию
MemoryStream Target = new MemoryStream();
// Сгенерировать случайный вектор инициализации (IV)
// для использования с алгоритмом
Algorithm.GenerateIV();
Target.Write(Algorithm.IV, 0, Algorithm.IV.Length);
// Зашифровать реальные данные
CryptoStream cs = new CryptoStream(Target, Algorithm.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(ClearData, 0, ClearData.Length);
cs.FlushFinalBlock();
// Вернуть зашифрованный поток данных в виде байтового массива
return Target.ToArray();
}
public static string DecryptData(byte[] data, string keyFile)
{
// Создать алгоритм
SymmetricAlgorithm Algorithm = SymmetricAlgorithm.Create(AlgorithmName);
ReadKey(Algorithm, keyFile);
// Расшифровать информацию
MemoryStream Target = new MemoryStream();
// Прочитать вектор инициализации (IV)
// и инициализировать им алгоритм
int ReadPos = 0;
byte[] IV = new byte[Algorithm.IV.Length];
Array.Copy(data, IV, IV.Length);
Algorithm.IV = IV;
ReadPos += Algorithm.IV.Length;
CryptoStream cs = new CryptoStream(Target, Algorithm.CreateDecryptor(),
CryptoStreamMode.Write);
cs.Write(data, ReadPos, data.Length - ReadPos);
cs.FlushFinalBlock(); /////////////// ОШИБКА ////////////////////
// Получить байты из потока в памяти и преобразовать их в текст
return Encoding.UTF8.GetString(Target.ToArray());
}
}
Вот так записываю в файл
StringBuilder sb = new StringBuilder();
foreach(Account ac in login.allAccounts)
{
sb.AppendLine(String.Format("{0} {1} {2}", ac.Name, ac.Password, ac.Folder));
}
byte[] data = SymmetricEncryptionUtility.EncryptData(sb.ToString(), login.keyFileName);
File.WriteAllBytes("./users/users.dat", data);
Потом читаю с файла
byte []data = File.ReadAllBytes("./users/users.dat");
string decr = SymmetricEncryptionUtility.DecryptData(data, keyFileName); //// Ошибка!!!
Подскажите, пожалуйста, в чем проблема...
У меня все работает. Данная ошибка возникает если секретный ключ задан неверно. Обратите внимание на параметр login.keyFileName при записи, при чтении уже keyFileName, возможно, ошибка именно здесь.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Если сообщение больше размера буфера, то на клиент часть данных приходит как нули
Столкнулся с такой проблемой, что не могу переместить файлы с дисков С и D, которые уже были созданы на нем, как я понимаю дело все в правах...
Пытаюсь разобраться с подключением открытия для своего расширения файлаКак это заставить работать правильно: MainActivity
Пытаюсь разобраться с тем, как выполнить асинхронное подключение к хабу в SignalRИзначально использовал такой код: