我使用AESCryptoServiceProvider,它在.net框架中提供,具有CBC密码模式和PKCS7填充模式。经过几篇文章后,我对生成IV和传输感到困惑,因为CBC密码模式需要独特且不可预测。
AESCryptoServiceProvider在创建新实例时提供IV或 叫generateIV()。虽然它表示随机IV生成它确实 没有提到它是使用CSPRNG还是使用哪个库。我能依靠吗? 使用使用generateIV()生成的IV或我应该使用 RNGCryptoServiceProvider? IV生成中的任何其他最佳实践?
转移IV时,应该是纯文本还是prepended密文?有关transmission of IV的最佳做法?
提前致谢。
答案 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);