首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RijndaelManaged -设置KeySize属性是做什么的?

RijndaelManaged -设置KeySize属性是做什么的?
EN

Stack Overflow用户
提问于 2016-09-01 15:33:35
回答 1查看 740关注 0票数 4

假设我将KeySize设置为192个,当我通过以下操作加密某些数据时:

代码语言:javascript
复制
 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相同的字节数组),即

代码语言:javascript
复制
 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();
                    }
                }
            }
        }

这仍将毫无例外地加密。我的问题是:

当我显式地将KeySize设置为192时,当它接受128位加密密钥时,KeySize内部会做什么呢?为什么不例外呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-06 15:02:50

钥匙KeySize类的属性是从基类SymmetricAlgorithm继承的。MSDN中没有详细记录这些属性的确切行为,但是如果您查看SymmetricAlgorithm源代码,您将看到密钥和KeySize属性相互作用,如下所示:

  • 设置Key属性时,KeySize属性将自动设置为新键的长度(以位为单位)。
  • 设置KeySize属性时,将清除现有密钥(下一次访问密钥时会自动生成新的随机密钥)。

因此,如果您正在设置Key属性,那么事先设置KeySize属性是没有意义的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39275663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档