Криптография C# AesManager
У меня возник вопрос, я использую AesManager для шифрации и дешифрации строки. Условно говоря, строки на выходе это данные которые сохраняются локально. (Проект сам для себя, просто интересна тема)
Так вот, покопавшись в интернете, я собрал вот такое такое чудо
private static string EncryptString(string plainText, string password)
{
byte[] initialVectorBytes = Encoding.ASCII.GetBytes(vector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(salt);
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
using PasswordDeriveBytes derivedPassword = new(password, saltValueBytes, hash, iterations);
byte[] keyBytes = derivedPassword.GetBytes(keySize / 8);
using AesManaged aes = new();
aes.Key = keyBytes;
aes.IV = initialVectorBytes;
byte[] cipherTextBytes = null;
using (ICryptoTransform encryptor = aes.CreateEncryptor(keyBytes, initialVectorBytes))
{
using MemoryStream memStream = new();
using CryptoStream cryptoStream = new(memStream, encryptor, CryptoStreamMode.Write);
cryptoStream.WriteAsync(plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock();
cipherTextBytes = memStream.ToArray();
}
return Convert.ToBase64String(cipherTextBytes);
}
public static string DecryptString(string cipherText, string password)
{
byte[] vectorBytes = Encoding.ASCII.GetBytes(vector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(salt);
byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
using PasswordDeriveBytes passwordDeriv = new(password, saltValueBytes, hash, iterations);
byte[] keyBytes = passwordDeriv.GetBytes(keySize / 8);
using AesManaged aes = new();
aes.Key = keyBytes;
aes.IV = vectorBytes;
byte[] plainTextBytes = new byte[cipherTextBytes.Length];
int byteCount = 0;
using (ICryptoTransform decryptor = aes.CreateDecryptor(keyBytes, vectorBytes))
{
using MemoryStream memStream = new();
using CryptoStream cryptoStream = new(memStream, decryptor, CryptoStreamMode.Read);
byteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
}
return Encoding.UTF8.GetString(plainTextBytes, 0, byteCount);
}
Проблема в том, что шифруется строка нормально, но вот при дешифровке выдается пустая строка.
iterations = 2;
keySize = 256;
hash = "SHA1";
salt = "acecraa138430d31";
vector = "2367az23cwl87xyu";
Все значения рандомные, просто для примера
Ответы (1 шт):
Автор решения: Podreju
→ Ссылка
Решил вопрос таким способом
private static string EncryptString(string plainText, string password)
{
byte[] initialVectorBytes = Encoding.ASCII.GetBytes(_vector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(_salt);
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
try
{
using PasswordDeriveBytes derivedPassword = new(password, saltValueBytes, _hash, _iterations);
byte[] keyBytes = derivedPassword.GetBytes(_keySize / 8);
using (AesManaged aes = new() { Key = keyBytes, IV = initialVectorBytes })
{
using MemoryStream ms = new MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write, true))
{
cs.Write(plainTextBytes, 0, plainTextBytes.Length);
}
return Convert.ToBase64String(ms.ToArray());
}
}
catch (Exception ex)
{
return ex.Message;
}
}
public static string DecryptString(string cipherText, string password)
{
byte[] initialVectorBytes = Encoding.ASCII.GetBytes(_vector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(_salt);
byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
try
{
using MemoryStream ms = new(cipherTextBytes);
using PasswordDeriveBytes derivedPassword = new(password, saltValueBytes, _hash, _iterations);
byte[] keyBytes = derivedPassword.GetBytes(_keySize / 8);
using (AesManaged aes = new() { Key = keyBytes, IV = initialVectorBytes })
{
byte[] plainTextBytes = new byte[cipherTextBytes.Length];
int byteCount = 0;
using CryptoStream cs = new(ms, aes.CreateDecryptor(), CryptoStreamMode.Read, true);
byteCount = cs.Read(plainTextBytes, 0, plainTextBytes.Length);
return Encoding.UTF8.GetString(plainTextBytes, 0, byteCount);
}
}
catch (Exception ex)
{
return ex.Message;
}
}