C# 向AES对象分配密钥和IV的目的是什么?
在MSDN for AES中,我可以在示例中看到以下部分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
...
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()调用
?同意。但是,我想知道在哪种情况下,我必须明确指定它,而不是依赖于您链接的方法。非常好的公式化。谢谢。这与我的预期一致,但我不确定,因为有多种方法,有时表明不同的结果,尽管类似。应该有在我看来,单一的做事方式,使得开发者不需要做出不必要的设计决策。