2016-09-01 40 views
4

鑑於我設置密鑰長度爲192,當我通過執行以下操作加密一些數據:RijndaelManaged - 設置KeySize屬性的功能是什麼?

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),即

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在內部執行什麼操作?因爲它在接受128位加密密鑰時,我明確將KeySize設置爲192?爲什麼沒有發生異常?

+0

已更新我的問題,以便更明確地瞭解我的困惑 –

+0

'ICryptoTransform'繼承自'IDisposable',所以這些應該也包含在''using''中。 –

+0

這並不能解釋1. KeySize屬性實際上做了什麼? 2.爲什麼沒有發生異常? –

回答

3

RijndaelManaged類的KeyKeySize屬性繼承自基類SymmetricAlgorithm類。這些屬性的確切行爲沒有很好地記錄在MSDN庫,但如果你看看SymmetricAlgorithm source code,你會看到密鑰和密鑰大小的屬性彼此交互如下:

  • 當您設置Key屬性,KeySize屬性自動設置爲新密鑰的位長度。
  • 設置KeySize屬性時,現有密鑰被清除(並且在下次訪問密鑰時自動生成新的隨機密鑰)。

因此,如果您正在設置Key屬性,則沒有必要事先設置KeySize屬性。

+0

謝謝,這是我的預期,我會獎賞賞金時,它可用於我這樣做。 –

相關問題