对称算法的密钥生成

时间:2017-11-02 10:29:20

标签: c# encryption

我有简单的对称加密/解密应用程序,可以正常工作:

namespace Crypto
{
    class Program
    {


        public static void EncryptSomeText()
        {
            string original ="My secretdata!";

            using (SymmetricAlgorithm symmetricAlgorithm =
            new AesManaged())
            {
                byte[] encrypted = Encrypt(symmetricAlgorithm, original);
                string roundtrip = Decrypt(symmetricAlgorithm, encrypted);

                // Displays: My secret data! 
                Console.WriteLine("Original:{ 0}", original);
                Console.WriteLine("RoundTrip:{ 0}", roundtrip);
            }
        }

        static byte[] Encrypt(SymmetricAlgorithm aesAlg, string plainText)
        {
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt =
                new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                    return msEncrypt.ToArray();
                }
            }
        }

        static string Decrypt(SymmetricAlgorithm aesAlg, byte[] cipherText)
        {
            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                using (CryptoStream csDecrypt =
                new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        return srDecrypt.ReadToEnd();
                    }
                }
            }
        }


        static void Main(string[] args)
        {
            SymmetricAlgorithm sma =  SymmetricAlgorithm.Create();

            byte[] b = Encrypt(sma,"bla bla");
            string s=  Decrypt(sma, b);
            Console.WriteLine("Decrypted {0}", s);


        }
    }
}

我只想知道密钥创建。这是否意味着它是在对称算法创建过程中以自动方式创建的?它每次生成不同吗?我想,用户应该为此目的传递密钥。

SymmetricAlgorithm sma =  SymmetricAlgorithm.Create();

2 个答案:

答案 0 :(得分:1)

当您访问Key的{​​{1}}属性时会生成随机密钥,前提是您未在此之前将SymmetricAlgorithm设置为某个预定义密钥。在构建Key时,它不会生成。

SymmetricAlgorithm

var sma = SymmetricAlgorithm.Create(); // no key generated here yet var key = sma.Key; // generated key // accessing `Key` causes random key generation var sma = SymmetricAlgorithm.Create(); // no key here sma.Key = myKey; // you set the key, so no random key is generated (nonce)值也是如此。

生成随机密钥只有一次意义,然后您必须以某种安全的方式在加密\解密方之间共享它,并将其用于将来的加密\解密。当你在那里时,请注意每个加密的IV值应该是随机的,所以通常你只是将这个IV值加到加密的二进制数组中,在解密之前你从加密数组的开头剪掉那个IV并用于解密

答案 1 :(得分:0)

在这个github page上有一个用Java写的实用程序类,它使用对称算法执行加密/解密,以下可能是使用对称算法的加密流程之一:

  • 使用所选算法(DES,3DES,AES等)生成秘密密钥

  • 生成可用种子生成算法计算得出的种子字节的安全随机数

  • 可能要加密的文本消息不是8字节块的倍数,这就是为什么必须用其他字节填充消息以使文本消息成为8字节块的倍数的原因(例如PKCS5Padding填充方案)< / p>

  • 使用随机生成的安全种子字节作为初始化矢量作为分组密码

  • 使用对称密钥和分组密码初始化密码功能
  • 完成加密
  • 将二进制文件应用于具有选定标准的文本编码,以用于初始化矢量(IV)和加密的二进制数据
  • 在发送前定义消息格式,以便将消息分成IV并加密,以便在接收方解密