C# RijndaelManaged-设置KeySize属性的作用是什么?
假设我将KeySize设置为192,当我通过执行以下操作加密某些数据时:C# RijndaelManaged-设置KeySize属性的作用是什么?,c#,rijndaelmanaged,C#,Rijndaelmanaged,假设我将KeySize设置为192,当我通过执行以下操作加密某些数据时: static void Main() { var querystrings = "dataToEncrypt"; byte[] keyvalue = new byte[] { 241, 205, 121, 123, 109, 246, 247, 103, 31, 225, 167, 220, 247, 119, 247, 119, 78, 125, 127,
static void Main()
{
var querystrings = "dataToEncrypt";
byte[] keyvalue = new byte[] { 241, 205, 121, 123, 109, 246, 247, 103, 31, 225, 167, 220, 247, 119, 247, 119, 78, 125, 127, 167, 156, 213, 230, 250, };
byte[] ivvalue = new byte[] { 194, 177, 79, 213, 87, 46, 213, 189, 243, 169, 32, 13, 217, 62, 34, 170, };
byte[] querystringBytes = Encoding.UTF8.GetBytes(querystrings);
using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
{
rijndaelManaged.BlockSize = 128;
rijndaelManaged.KeySize = 192;
rijndaelManaged.IV = ivvalue;
rijndaelManaged.Key = keyvalue;
rijndaelManaged.Padding = PaddingMode.PKCS7;
rijndaelManaged.Mode = CipherMode.CBC;
using (MemoryStream memoryStream = new MemoryStream())
{
ICryptoTransform transform = rijndaelManaged.CreateEncryptor();
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write))
{
cryptoStream.Write(querystringBytes, 0, querystringBytes.Length);
cryptoStream.FlushFinalBlock();
var output = Convert.ToBase64String(memoryStream.ToArray());
Console.WriteLine($"{output}");
Console.ReadKey();
}
}
}
}
数据按照我的预期进行加密,因为IV和加密密钥的长度分别为128位和192位。但是,如果我将加密密钥设置为128位长(为了参数起见,让我们使用与IV相同的字节数组),即
这仍然会毫无例外地加密。我的问题是:
当我显式地将KeySize设置为192时,KeySize在内部接受128位加密密钥时做什么?为什么没有发生异常?RijndaelManaged类的和属性继承自基类。这些属性的精确行为在MSDN库中没有很好的文档记录,但是如果您查看,您将看到Key和KeySize属性彼此交互,如下所示:
- 设置Key属性时,KeySize属性将自动设置为新密钥的长度(以位为单位)
- 设置KeySize属性时,将清除现有密钥(并在下次访问密钥时自动生成新的随机密钥)
因此,如果您要设置Key属性,那么事先设置KeySize属性是没有意义的。更新了我的问题,以更明确地说明我的困惑
ICryptoTransform
继承自IDisposable
,因此也应该使用s将这些内容包装在中。这并不能解释1。KeySize属性实际上做什么?2.为什么没有异常发生?怎么样?你可以加密一个10字节(块大小?)的数据包,密钥大小为192?谢谢,这是我所期望的,我会在我可以这样做的时候奖励赏金。
static void Main()
{
var querystrings = "dataToEncrypt";
byte[] keyvalue = new byte[] { 194, 177, 79, 213, 87, 46, 213, 189, 243, 169, 32, 13, 217, 62, 34, 170, };
byte[] ivvalue = new byte[] { 194, 177, 79, 213, 87, 46, 213, 189, 243, 169, 32, 13, 217, 62, 34, 170, };
byte[] querystringBytes = Encoding.UTF8.GetBytes(querystrings);
using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
{
rijndaelManaged.BlockSize = 128;
rijndaelManaged.KeySize = 192;
rijndaelManaged.IV = ivvalue;
rijndaelManaged.Key = keyvalue;
rijndaelManaged.Padding = PaddingMode.PKCS7;
rijndaelManaged.Mode = CipherMode.CBC;
using (MemoryStream memoryStream = new MemoryStream())
{
ICryptoTransform transform = rijndaelManaged.CreateEncryptor();
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write))
{
cryptoStream.Write(querystringBytes, 0, querystringBytes.Length);
cryptoStream.FlushFinalBlock();
var output = Convert.ToBase64String(memoryStream.ToArray());
Console.WriteLine($"{output}");
Console.ReadKey();
}
}
}
}