对于AES算法名称,CryptDeriveKey失败

我正在尝试在我的应用程序中实现AES加密。 我有以下代码来创建用户密码的哈希版本。

PasswordDeriveBytes passwdHash = new PasswordDeriveBytes( password, salt, "SHA1", 128 ); byte[] keyBytes = passwdHash.CryptDeriveKey( "AES", "SHA1", 192, iv ); 

第二行抛出System.Security.Cryptography.CryptographicException ,错误消息Object identifier (OID) is unknown 。 我使用Reflectorvalidation错误是否被抛出,因为CryptDeriveKey()不喜欢“AES”算法名称(我使用AesCryptoServiceProvider()来执行加密)。 我尝试将名称更改为“AESManaged”,“AES192”和“Rijndael”,但它们都抛出相同的exception。

我如何让它工作? 或者是否有另一种导出关键字节的方法? 另外,是否有关于允许的算法名称字符串是什么的文档? 我在MSDN文档中找不到该function的任何内容。

我正在使用Visual Studio 2008并以.NET Framework 3.5为目标

在此先感谢您的帮助!

为什么要从密码盐而不是密码本身派生密钥? 通常你使用“原始”密码和盐; 确实在我的书( )中,第6章有以下样本。

 private void GetKeyAndIVFromPasswordAndSalt( string password, byte[] salt, SymmetricAlgorithm symmetricAlgorithm, ref byte[] key, ref byte[] iv) { Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt); key = rfc2898DeriveBytes.GetBytes(symmetricAlgorithm.KeySize / 8); iv = rfc2898DeriveBytes.GetBytes(symmetricAlgorithm.BlockSize / 8); } 

当然,salt应该是加密安全的随机字节数组;

 private static byte[] GenerateKeyGenerateRandomBytes(int length) { byte[] key = new byte[length]; RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider(); provider.GetBytes(key); return key; } 

看起来这不支持AES: http : //social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/61d85001-2eae-4419-b4bf-ce98d46f4d21/

我也发现了这个: http : //www.koders.com/csharp/fidDDE5F3FF54C91BC673350363EAECC0D815A68F92.aspx

看起来Rijndael应该可行。 看来密钥大小只设置为16但…