Алгоритм шифровки работает, а вот при расшифровки получаю сообщение:
Недопустимая длина данных для дешифрования.
Класс помощника
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
Вы все правильно поняли, проблема здесь: byte[] salt = EncHelper.GenerateIV(32);
. Вы можете всегда проверить ключ и IV во время шифрования и дешифрования. Очевидно, что они должны совпадать.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Никак не могу подключиться к бд с шифрованиемУже и менял способ шифрования, и устанавливал всякие разные вещи с сайта микромягких, но никак
Хочу реализовать в своей игре уровни предметов, но как сделать максимальный уровень? Например, что бы он был 30Есть идея, при прокачке уровня...
Необходимо автоматизировать приложение desktop windowsНо мне нужно запустить приложение как администратор