生成IV并传输AES C#

时间:2015-02-12 08:48:08

标签: c# security encryption cryptography aes

我使用AESCryptoServiceProvider,它在.net框架中提供,具有CBC密码模式和PKCS7填充模式。经过几篇文章后,我对生成IV和传输感到困惑,因为CBC密码模式需要独特且不可预测。

  1. AESCryptoServiceProvider在创建新实例时提供IV或 叫generateIV()。虽然它表示随机IV生成它确实 没有提到它是使用CSPRNG还是使用哪个库。我能依靠吗? 使用使用generateIV()生成的IV或我应该使用 RNGCryptoServiceProvider? IV生成中的任何其他最佳实践?

  2. 转移IV时,应该是纯文本还是prepended密文?有关transmission of IV的最佳做法?

  3. 提前致谢。

1 个答案:

答案 0 :(得分:1)

在" AESCryptoServiceProvider"中,generateIV()方法使用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);