Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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# 向AES对象分配密钥和IV的目的是什么?_C#_Aes - Fatal编程技术网

C# 向AES对象分配密钥和IV的目的是什么?

C# 向AES对象分配密钥和IV的目的是什么?,c#,aes,C#,Aes,在MSDN for AES中,我可以在示例中看到以下部分 ... using (Aes aesAlg = Aes.Create()) { aesAlg.Key = Key; aesAlg.IV = IV; ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); ... } ... 我试图跳过对AES对象的key和IV赋值(尽管在创建加密程序时会这样设置它们) ... using (A

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

...
using (Aes aesAlg = Aes.Create())
{
  aesAlg.Key = Key;
  aesAlg.IV = IV;
  ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
  ...
} ...
我试图跳过对AES对象的key和IV赋值(尽管在创建加密程序时会这样设置它们)

...
using (Aes aesAlg = Aes.Create())
{
  //aesAlg.Key = Key;
  //aesAlg.IV = IV;
  ICryptoTransform encryptor = aesAlg.CreateEncryptor(Key, IV);
  ...
} ...
这似乎对结果没有影响。但是,由于它是样本的一部分,我担心在重要的时候会有一个案例。可能是我只尝试了一些没有显示的例子


什么时候需要将key和IV分配给AES对象?

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

使用(Aes aesAlg=Aes.Create())
{
aesAlg.Key=Key;
aesAlg.IV=IV;
ICryptoTransform encryptor=aesAlg.CreateEncryptor();
// ...
}

第二代码段将使用已通过的<代码> >键和<代码> IV>代码> PARAMS,不管<代码> AESALG.KEY < /COD>和<代码> AESALG.IV值。请考虑以下内容:

使用(Aes aesAlg=Aes.Create())
{
aesAlg.Key=Key;
aesAlg.IV=IV;
ICryptoTransform encryptor=aesAlg.CreateEncryptor(someOtherKey,someotheriv);
// ...
}
在这里,
someOtherKey
someOtherIV
用于创建转换,而
aesAlg
属性被忽略。需要考虑的另一个示例:

使用(Aes aesAlg=Aes.Create())
{
ICryptoTransform encryptor=aesAlg.CreateEncryptor();
// ...
}
现在,
aesAlg.Key
aesAlg.IV
属性都是
null
.CreateEncryptor()
将使用它们创建转换。但是,该方法不会引发任何异常,因为这些属性的getter(通过设计)不会返回
null
,而是创建并分配随机值

您可能希望尝试以下操作:

private void SomeCaller()
{
使用(var crypto=Aes.Create())
{
//将生成一个随机密钥。。。
PrintHexValue(加密密钥);
//分配给。。。
PrintHexValue(加密密钥);
var pass=“Konrad Viltersten”;
var bytes=Encoding.UTF8.GetBytes(pass);
var rfc=新的Rfc2898DeriveBytes(通过,
新的SHA256Managed().ComputeHash(字节),1000;
var key=rfc.GetBytes(crypto.LegalKeySizes[0].MaxSize/8);
var iv=rfc.GetBytes(crypto.LegalBlockSizes[0].MinSize/8);
//不会更改crypto.Key和crypto.IV属性。。。
var encr=crypto.CreateEncryptor(密钥,iv);
//生成的基于密码的密钥。。。
打印值(键);
//随机键仍然是。。。
PrintHexValue(加密密钥);
加密密钥=密钥;
crypto.IV=IV;
//基于密码的密钥已分配给加密密钥。。。
PrintHexValue(加密密钥);
}
}
私有void PrintHexValue(字节[]字节)=>
WriteLine(BitConverter.ToString(bytes.Replace(“-”,string.Empty));
结论


您的第二个代码段是创建加密转换的快捷方式。您需要在更广泛的范围内使用第一个代码段,例如。

AES继承自SymmetricalGorthm,并根据该类的:要解密使用SymmetricalGorthm类之一加密的数据,必须将Key属性和IV属性设置为与用于加密的值相同-因此,为了能够解密,您必须知道用于加密的密钥和IV。因此,设置AES类的密钥和IV应该允许这样做。不确定在这种情况下如何设置密钥和IV,但是,您也没有定义加密模式。Microsoft的默认加密ode是CBC模式的加密。CBC模式需要一个不可预测的随机IV来确保安全。因此,您需要生成它。最好使用AES-GCM/@TimothyG。同意这一点。但是,这不是问题所在。我正在创建加密器期间设置密钥和向量,如示例所示。然而,我注意到,检查请在网络上,也直接分配给对象属性,然后在创建方法中再次传递它们。我想知道为什么以及是否需要它。显然,在我的情况下,没有它它它工作得很好。但是,我感觉可能有一些情况下,它必须直接在AES实例上设置。@dr.null你是说如果我不指定,它是
null
然后通过
GenerateKey()调用
?同意。但是,我想知道在哪种情况下,我必须明确指定它,而不是依赖于您链接的方法。非常好的公式化。谢谢。这与我的预期一致,但我不确定,因为有多种方法,有时表明不同的结果,尽管类似。应该有在我看来,单一的做事方式,使得开发者不需要做出不必要的设计决策。