AES проблемы при расшифровки

170
08 февраля 2021, 08:50

Алгоритм шифровки работает, а вот при расшифровки получаю сообщение:

Недопустимая длина данных для дешифрования.

Класс помощника

namespace Encryptor
{
  using System.Linq;
  using System.Security.Cryptography;
internal class EncHelper
{
    public static byte[] GenerateIV(int length)
    {
        byte[] result = new byte[length];
        try
        {
            using (var provider = new RNGCryptoServiceProvider())
            {
                // for (int i = 0; i < 10; i++)
                provider.GetBytes(result);
                return result;
            }
        }
        catch { return result; }
    }
    public static bool CheckPassword(int size, byte[] password, byte[] salt, byte[] key)
    {
        using (Rfc2898DeriveBytes r = GenerateKey(password, salt))
        {
            try
            {
                return r.GetBytes(size / 8).SequenceEqual(key);
            }
            catch { return false; }
        }
    }
    public static Rfc2898DeriveBytes GenerateKey(byte[] password, byte[] salt) => new Rfc2898DeriveBytes(password, salt, 52768);
}
}

Теперь сам алгоритм шифрования и расшифровки:

 public byte[] AES_Encrypt_Old(string inputFile, string password)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(password);
        byte[] array = File.ReadAllBytes(inputFile);
        byte[] result = null;
        byte[] salt = EncHelper.GenerateIV(32);
        try
        {
            using (var memoryStream = new MemoryStream())
            using (var rijndaelManaged = new RijndaelManaged())
            {
                rijndaelManaged.KeySize = 256;
                rijndaelManaged.BlockSize = 128;
                using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(bytes, salt, 1000))
                {
                    rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
                    rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
                    rijndaelManaged.Mode = CipherMode.CBC;
                    using (var cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cryptoStream.Write(array, 0, array.Length);
                    }
                    result = memoryStream.ToArray();
                }
            }
        }
        catch (CryptographicException ex) { File.AppendAllText("OldAES_Enc_CE.txt", ex.Message); }
        return result;
    }
    public byte[] AES_Decrypt_Old(string inputFile, string password)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(password);
        byte[] array = File.ReadAllBytes(inputFile);
        byte[] result = null;
        byte[] salt = EncHelper.GenerateIV(32);
        try
        {
            using (var memoryStream = new MemoryStream())
            using (var rijndaelManaged = new RijndaelManaged())
            {
                rijndaelManaged.KeySize = 256;
                rijndaelManaged.BlockSize = 128;
                using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(bytes, salt, 1000))
                {
                    rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
                    rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
                    rijndaelManaged.Mode = CipherMode.CBC;
                    using (var cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cryptoStream.Write(array, 0, array.Length);
                    }
                }
                result = memoryStream.ToArray();
            }
        }
        catch (CryptographicException ex) { File.AppendAllText("OldAES_Dec_CE.txt", ex.Message); }
        return result;
    }

Вызываю таким способом:

namespace Encryptor
{
  using System;
  using System.Collections.Generic;
  using System.IO;
public class TestStarting
{
    private static readonly string CurrentDir = Environment.CurrentDirectory;
    private static List<string> list_string = new List<string>();
    private static string[] extension_list = new string[] { "*.txt", "*.doc" };
    private const string KEY = "P@ssworD$";
    public static void Inizialize_Encrypt()
    {
        for (int i = 0; i < extension_list.Length; i++) 
        {
            list_string.AddRange(Directory.EnumerateFiles(CurrentDir, extension_list[i])); 
        }
        if (list_string != null)
        {
            foreach (string text in list_string)
            {
                var helper = new AesHelper();
                File.WriteAllBytes($"{text}.GP", helper.AES_Encrypt_Old(text, KEY));
            }
            list_string = null;
        }
    }
    public static void Inizialize_Decrypt()
    {
        for (int i = 0; i < extension_list.Length; i++)
        {
            list_string.AddRange(Directory.EnumerateFiles(CurrentDir, extension_list[i])); 
        }
        if (list_string != null)
        {
            foreach (string text in list_string)
            {
                var helper = new AesHelper();
                File.WriteAllBytes($"{text}.Decrypt", helper.AES_Decrypt_Old(text, KEY));
            }
            list_string = null;
        }
    }
}

Если я правильно понял то проблема заключается в byte[] salt = EncHelper.GenerateIV(32); ? Пароль используется один и тот же KEY

Answer 1

Вы все правильно поняли, проблема здесь: byte[] salt = EncHelper.GenerateIV(32);. Вы можете всегда проверить ключ и IV во время шифрования и дешифрования. Очевидно, что они должны совпадать.

READ ALSO
Подключение к БД с шифрованием

Подключение к БД с шифрованием

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

98
Как ограничить значение переменной?

Как ограничить значение переменной?

Хочу реализовать в своей игре уровни предметов, но как сделать максимальный уровень? Например, что бы он был 30Есть идея, при прокачке уровня...

119
Как добавить несколько объектов в Grid?

Как добавить несколько объектов в Grid?

Я из кода создаю несколько элементов в Grid:

147
WinAppDriver. Не могу запустить приложение как администратор

WinAppDriver. Не могу запустить приложение как администратор

Необходимо автоматизировать приложение desktop windowsНо мне нужно запустить приложение как администратор

111