.net NET中自动生成的加密密钥

.net NET中自动生成的加密密钥,.net,cryptography,.net,Cryptography,可以使用Rijndael或RC2,为键参数提供空值: var r = new RijndaelManaged(); var encryptor = r.CreateEncryptor(null, null); 主题中的算法将生成随机密钥,然后(和)。这与msdn有点矛盾,msdn的键或iv不应为空。(可能在过去它是这样工作的,密钥生成是后来添加的) 使用这种随机密钥的理由是什么?显然,一旦生成的密钥在创建的加密程序中不可用,我们就会生成一些无法恢复的乱码,因此我

可以使用Rijndael或RC2,为键参数提供空值:

        var r = new RijndaelManaged();
        var encryptor = r.CreateEncryptor(null, null);
主题中的算法将生成随机密钥,然后(和)。这与msdn有点矛盾,msdn的键或iv不应为空。(可能在过去它是这样工作的,密钥生成是后来添加的)

使用这种随机密钥的理由是什么?显然,一旦生成的密钥在创建的加密程序中不可用,我们就会生成一些无法恢复的乱码,因此我们无法解密它

测试用例代码:

        var r = new RijndaelManaged();

        // encryptor 1
        var encryptor = r.CreateEncryptor(null, null);

        var inp = new byte[encryptor.InputBlockSize];
        for (byte i = 0; i < inp.Length; i++)
        {
            inp[i] = i;
        }
        var outp = new byte[encryptor.OutputBlockSize];

        // transform 1
        encryptor.TransformBlock(inp, 0, inp.Length, outp, 0);

        // encryptor 2, same parameters
        var encryptor2 = r.CreateEncryptor(null, null);
        var outp2 = new byte[encryptor.OutputBlockSize];

        // transform 2
        encryptor2.TransformBlock(inp, 0, inp.Length, outp2, 0);

        Assert.AreNotEqual(outp, outp2);
var r=new RijndaelManaged();
//加密机1
var encryptor=r.CreateEncryptor(null,null);
var inp=新字节[encryptor.InputBlockSize];
for(字节i=0;i
我通常使用这样一个事实:它会创建一个随机密钥来创建一个新密钥,但随后会保存加密时使用的密钥,以便解密

您可以使用它生成一个随机密钥来加密某些数据,然后使用RSA公钥加密该随机密钥,并将加密的对称密钥与数据一起存储。然后,您只需要密钥来解密数据。其优点是对称加密比公钥/私钥更快。您可以使用RSA密钥对少量数据进行加密,而对较大的数据使用对称密钥

编辑:
如果只需稍微更改代码并使用无参数
CreateEncryptor
,就可以捕获密钥

var rand = new Random();
var r = new RijndaelManaged();

// Store the key and IV (you need both to decrypt)
var key = r.Key;
var iv = r.IV;

// This will create the encryptor using the key and IV above
var enc = r.CreateEncryptor();

var inp = new byte[enc.InputBlockSize];
rand.NextBytes(inp);

var outp = new byte[enc.OutputBlockSize];

enc.TransformBlock(inp, 0, inp.Length, outp, 0);

// To ensure that we have new keys, create a new Rijndael object
var r2 = new RijndaelManaged();
var enc2 = r2.CreateEncryptor(key, iv);

// Another option would be to set the key and IV of r2 and call the
// parameterless CreateEncryptor
var r3 = new RijndaelManaged();
r3.Key = key;
r3.IV = iv;
var enc3 = r3.CreateEncryptor();

var outp2 = new byte[enc2.OutputBlockSize];
var outp3 = new byte[enc3.OutputBlockSize];
enc2.TransformBlock(inp, 0, inp.Length, outp2, 0);
enc3.TransformBlock(inp, 0, inp.Length, outp3, 0);

if (outp.SequenceEqual(outp2) && outp.SequenceEqual(outp3))
{
    Console.WriteLine("Equal");
    Console.WriteLine("Key: " + Convert.ToBase64String(key));
    Console.WriteLine("IV: " + Convert.ToBase64String(iv));
}

enc.Dispose();
enc2.Dispose();
enc3.Dispose();
r.Dispose();
r2.Dispose();
r3.Dispose();

最后一段描述了一个@MaartenBodewes-谢谢!我写这篇文章时想不出术语。我明白你的意思,但在我的例子中,新生成的密钥不可用。@mikalai-我已经更新了我的答案,告诉你如何存储密钥和IV,以便你可以重用它。