TransWikia.com

C# Шифрование строки со всегда разным результатом

Stack Overflow на русском Asked on February 11, 2021

Необходимо зашифровать строку таким образом, чтобы по одному и тому же ключу получался всегда разный результат. В AES алгоритмах для этого можно использовать разный вектор, но для дешифровки, помимо ключа, нужно знать этот вектор. Мне необходимо получать уникальное зашифрованное сообщение только по ключу. Какие алгоритмы я могу использовать для этого?

One Answer

Я бы сделал как-то так, по сути результат тот, что соответствует вашему условию.

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP