Stack Overflow на русском Asked on February 11, 2021
Необходимо зашифровать строку таким образом, чтобы по одному и тому же ключу получался всегда разный результат. В AES алгоритмах для этого можно использовать разный вектор, но для дешифровки, помимо ключа, нужно знать этот вектор. Мне необходимо получать уникальное зашифрованное сообщение только по ключу. Какие алгоритмы я могу использовать для этого?
Я бы сделал как-то так, по сути результат тот, что соответствует вашему условию.
class Program
{
static void Main(string[] args)
{
string text = "Hello World!";
byte[] key = Enumerable.Range(0, 32).Select(x => (byte)x).ToArray();
Console.WriteLine(Encrypt(text, key));
Console.WriteLine(Encrypt(text, key));
Console.WriteLine(Encrypt(text, key));
Console.WriteLine(Encrypt(text, key));
string base64 = Encrypt(text, key);
Console.WriteLine(base64);
Console.WriteLine(Decrypt(base64, key));
Console.ReadKey();
}
private static string Encrypt(string text, byte[] key)
{
using (AesManaged aes = new AesManaged() { Key = key })
using (MemoryStream ms = new MemoryStream())
{
ms.Write(aes.IV);
using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write, true))
{
cs.Write(Encoding.UTF8.GetBytes(text));
}
return Convert.ToBase64String(ms.ToArray());
}
}
private static string Decrypt(string base64, byte[] key)
{
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64)))
{
byte[] iv = new byte[16];
ms.Read(iv);
using (AesManaged aes = new AesManaged() { Key = key, IV = iv})
using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read, true))
using (MemoryStream output = new MemoryStream())
{
cs.CopyTo(output);
return Encoding.UTF8.GetString(output.ToArray());
}
}
}
}
Вывод в консоль
130gYdJGjVNVWeCp8ep8kLlyX39fg1nY4vl99wNIYIw=
TstMTm9mvyjiO9nM2M8sdoYLktkpmMRolhGYGPCbwpM=
HGM8CIiXaBpluZdBBggR2yXXeGpDTMkLi/OreZQWPnE=
/sE0aIsc0wkcc3kP3df9TWPRBt/2/OKSd1eAORSBCOc=
Kd6JMwFkMRae1sgjEks76j7+kfRR1Lb3Vz3NVj7DeRw=
Hello World!
Всегда разный вывод с одним и тем же ключом, потому что AesManaged
генерирует рандомный IV
каждый раз.
Answered by aepot on February 11, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP