AesCng меняет шифрование между конструкциямиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 AesCng меняет шифрование между конструкциями

Сообщение Anonymous »

Это класс-оболочка, которую я создал:

Код: Выделить всё

public class AesCngWithSalt
{
public AesCngWithSalt() { }
public AesCngWithSalt(string password, string salt)
{
Password = password;
Salt = salt;
Build();
}

public string Password {  get; set; }
public string Salt { get; set; }
protected Aes Encryptor { get; set; }
protected Aes Decryptor { get; set; }

public void Build()
{
if (string.IsNullOrWhiteSpace(Password) || string.IsNullOrWhiteSpace(Salt))
{
throw new ArgumentException("Password and Salt must be set first");
}
Rfc2898DeriveBytes rfcKey1 = new Rfc2898DeriveBytes(Password, Encoding.Unicode.GetBytes(Salt), 1000);
Rfc2898DeriveBytes rfcKey2 = new Rfc2898DeriveBytes(Password, Encoding.Unicode.GetBytes(Salt));
Encryptor = AesCng.Create();
Encryptor.Padding = PaddingMode.PKCS7;
Encryptor.KeySize = 256;
Encryptor.Key = rfcKey1.GetBytes(32);
Decryptor = AesCng.Create();
Decryptor.Padding = PaddingMode.PKCS7;
Decryptor.KeySize = 256;
Decryptor.Key = rfcKey2.GetBytes(32);
Decryptor.IV = Encryptor.IV;
}

public string Encrypt(string text)
{
try
{
MemoryStream encryptionStream = new MemoryStream();
CryptoStream encrypt = new CryptoStream(encryptionStream, Encryptor.CreateEncryptor(), CryptoStreamMode.Write);
byte[] utfD1 = new System.Text.UTF8Encoding(false).GetBytes(text);
encrypt.Write(utfD1, 0, utfD1.Length);
encrypt.FlushFinalBlock();
encrypt.Close();
byte[] edata1 = encryptionStream.ToArray();
return Convert.ToBase64String(edata1);
}
catch
{
return string.Empty;
}
}

public string Decrypt(string text)
{
try
{
MemoryStream decryptionStreamBacking = new MemoryStream();
CryptoStream decrypt = new CryptoStream(decryptionStreamBacking, Decryptor.CreateDecryptor(), CryptoStreamMode.Write);
char[] data = text.ToArray();
byte[] bdata = Convert.FromBase64CharArray(data, 0, data.Length);
decrypt.Write(bdata, 0, bdata.Length);
decrypt.Flush();
decrypt.Close();
return new UTF8Encoding(false).GetString(decryptionStreamBacking.ToArray());
}
catch
{
return string.Empty;
}
}
}
Я создаю класс дважды, каждый раз с одним и тем же значением пароля и солью. Я убедился, что Rfc2898DeriveBytes создает точно такой же массив с теми же входными данными. Однако класс AesCng во второй конструкции ведет себя иначе.
Например:
AesCngWithSalt aes1=new AesCngWithSalt("MyPassword", "ASaltValue");
string t1 = aes1.Encrypt("Тестовый текст");
AesCngWithSalt aes2=new AesCngWithSalt("MyPassword", "ASaltValue");
string t2 = aes2.Encrypt("Тестовый текст");
t1 == "ZU4bkJtc6H2nP1Eg4v9Y6w==";< /p>
t2 == "eB6HTJ3mp5ffUwzguvRyHA==";
Я обнаружил это после шифрования значения и сохранения его в базе данных. Затем позже расшифровал его и не получил того же значения. (На самом деле расшифровка не удалась). Я предполагаю, что если два разных экземпляра не шифруют и не создают одно и то же значение, то расшифровка также не создаст одинаковые значения.
Однако в созданном мной тестовом приложении, если Я использую один и тот же экземпляр для шифрования и дешифрования, он работает нормально.
Подходит ли это шифрование в данном случае?

Подробнее здесь: https://stackoverflow.com/questions/788 ... structions
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»