gpt4 book ai didi

.net - .NET 中自动生成的加密 key

转载 作者:行者123 更新时间:2023-12-02 02:34:43 28 4
gpt4 key购买 nike

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

        var r = new RijndaelManaged();
var encryptor = r.CreateEncryptor(null, null);

主题中的算法将生成随 secret 钥( firstsecond )。这与 msdn 有点矛盾,says该键或 iv 不应为空。 (以前可能是这样, key 生成是后来添加的)。

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

测试用例代码:

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

最佳答案

我通常使用它创建随 secret 钥的事实来创建新 key ,但然后保存加密时使用的 key ,以便我可以解密。

您可以用它做的一件事是生成一个随 secret 钥来加密一些数据,然后使用 RSA 公钥加密随 secret 钥并将加密的对称 key 与数据一起存储。然后你只需要 key 来解密数据。优点是对称加密比公钥/私钥更快。您可以使用 RSA key 来加密少量数据,并使用对称 key 来加密大量数据。

编辑:
只需稍微更改代码并使用无参数 CreateEncryptor 即可捕获 key 。

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

关于.net - .NET 中自动生成的加密 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28639512/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com