gpt4 book ai didi

c# - key 和 IV 分配给 AES 对象的目的是什么?

转载 作者:行者123 更新时间:2023-12-04 07:39:42 24 4
gpt4 key购买 nike

在 AES 的 MSDN 中,我可以在示例中看到以下部分。

...
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
...
} ...
我试图跳过 key 和 IV 到 AES 对象的分配(尽管在创建加密器时设置它们像这样。
...
using (Aes aesAlg = Aes.Create())
{
//aesAlg.Key = Key;
//aesAlg.IV = IV;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(Key, IV);
...
} ...
似乎对结果没有任何影响。然而,由于它是样本的一部分,我担心它会出现问题。可能是我只尝试了没有显示的示例。
我什么时候需要将 key 和 IV 分配给 AES 对象?

最佳答案

在第一个代码片段中,您已将值分配给 KeyIV对称算法对象的属性,因此在创建加密转换时无需再次传递它们。在这种情况下,使用使用已分配 Key 的无参数重载和 IV创建加密器/解密器。

using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
ICryptoTransform encryptor = aesAlg.CreateEncryptor();
// ...
}
第二个代码片段将使用传递的 Key 创建相同的转换。和 IV参数不考虑 aesAlg.KeyaesAlg.IV值。考虑以下:
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(someOtherKey, somOtherIV);
// ...
}
在这里, someOtherKeysomeOtherIV用于创建变换和 aesAlg属性被忽略。另一个需要考虑的例子:
using (Aes aesAlg = Aes.Create())
{
ICryptoTransform encryptor = aesAlg.CreateEncryptor();
// ...
}
现在,两个 aesAlg.Key & aesAlg.IV属性是 null.CreateEncryptor()将使用它们来创建转换。但是,该方法不会抛出任何异常,因为这些属性的 getter - 按照设计 - 不会返回 null而是创建和分配随机值。
您可能想尝试以下操作:
private void SomeCaller()
{
using (var crypto = Aes.Create())
{
// A random Key is generated...
PrintHexValue(crypto.Key);
// And assigned...
PrintHexValue(crypto.Key);

var pass = "Konrad Viltersten";
var bytes = Encoding.UTF8.GetBytes(pass);
var rfc = new Rfc2898DeriveBytes(pass,
new SHA256Managed().ComputeHash(bytes), 1000);
var key = rfc.GetBytes(crypto.LegalKeySizes[0].MaxSize / 8);
var iv = rfc.GetBytes(crypto.LegalBlockSizes[0].MinSize / 8);

// Doesn't change the crypto.Key and crypto.IV properties...
var encr = crypto.CreateEncryptor(key, iv);

// The generated password-based key...
PrintHexValue(key);
// The random key remains...
PrintHexValue(crypto.Key);

crypto.Key = key;
crypto.IV = iv;

// The password-based key is assigned to the crypto.Key...
PrintHexValue(crypto.Key);
}
}

private void PrintHexValue(byte[] bytes) =>
Console.WriteLine(BitConverter.ToString(bytes).Replace("-", string.Empty));
结论
您的第二个代码片段是创建加密转换的快捷方式。您将需要第一个在更广泛的范围内,例如 this一个例子。

关于c# - key 和 IV 分配给 AES 对象的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67551623/

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