2015-02-12 73 views
0

我正在使用.NET Framework中提供的AESCryptoServiceProvider,它具有CBC密碼模式和PKCS7填充模式。在閱讀了幾篇文章之後,由於CBC密碼模式需要獨特和不可預測,所以我對於產生IV和傳輸有點困惑。生成IV並傳輸AES C#

  1. AESCryptoServiceProvider提供IV當創建新實例或 稱爲generateIV()。雖然它說隨機四是產生,它不會提及它是否使用CSPRNG或哪個庫。我可以依賴使用使用generateIV()生成的IV的 還是應該使用 RNGCryptoServiceProvider? IV代中的其他最佳實踐?

  2. 當傳送IV時,應該將其轉換爲純文本還是應該用prepended加密文本?任何關於transmission of IV的最佳實踐?

在此先感謝。

+1

http://stackoverflow.com/questions/8041451/good-aes-initialization-vector-練習 – vikky 2015-02-12 08:58:14

+0

已經通過該線程。不管怎樣,謝謝。它說在密碼文本和混淆之前預先安排。 也檢查NIST的標準。 http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf 檢查此以及 http://security.stackexchange.com/questions/42642/should-aes-always -give-the-same-output – 2015-02-12 09:26:52

回答

1

在「AESCryptoServiceProvider」中,生成內部使用的()方法CryptGenRandom()advapi32.dll。 GenerateIV的

方法認定中():

public override void GenerateIV() { 
      Contract.Ensures(IVValue != null && IVValue.Length == BlockSizeValue/8); 
      Contract.Assert(m_cspHandle != null); 
      Contract.Assert(BlockSizeValue % 8 == 0); 

      byte[] iv = new byte[BlockSizeValue/8]; 
      if (!CapiNative.UnsafeNativeMethods.CryptGenRandom(m_cspHandle, iv.Length, iv)) { 
       throw new CryptographicException(Marshal.GetLastWin32Error()); 
      } 

      IVValue = iv; 
     } 

CryptGenRandom的簽名():

/// <summary> 
      ///  Fill a buffer with cryptographically random bytes 
      /// </summary> 
      [DllImport("advapi32", SetLastError = true)] 
      [return: MarshalAs(UnmanagedType.Bool)] 
      public static extern bool CryptGenRandom(SafeCspHandle hProv, 
                int dwLen, 
                [Out, MarshalAs(UnmanagedType.LPArray)] byte[] pbBuffer); 
+0

感謝您提供洞察AESCryptoServiceProvider的GenerateIV()中會發生什麼 – 2015-02-13 06:18:05