2015-02-12 51 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