Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对称算法的密钥生成_C#_Encryption - Fatal编程技术网

C# 对称算法的密钥生成

C# 对称算法的密钥生成,c#,encryption,C#,Encryption,我有一个简单的对称加密/解密应用程序,运行良好: namespace Crypto { class Program { public static void EncryptSomeText() { string original ="My secretdata!"; using (SymmetricAlgorithm symmetricAlgorithm = new Ae

我有一个简单的对称加密/解密应用程序,运行良好:

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();

当您访问
SymmetricAlgorithm
key
属性时,会生成随机键,前提是您没有将该
设置为某个预定义键。它不是在构造
对称算法
本身时生成的

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
IV
(nonce)值也是如此

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

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

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

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

  • 可能要加密的文本消息不是8字节块的倍数,这就是为什么必须用额外的字节填充消息,使文本消息成为8字节块的倍数。(例如,PKCS5P添加填充方案)

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

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