我正在尝试在我的应用程序中实现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
。我使用Reflector来验证是否抛出了错误,因为CryptDeriveKey()
不喜欢“AES”算法名称(我使用AesCryptoServiceProvider()
来执行加密)。我尝试将名称更改为“AESManaged”,“AES192”和“Rijndael”,但它们都抛出相同的异常。
我如何让它工作?或者是否有另一种导出关键字节的方法? 另外,是否有关于允许的算法名称字符串是什么的文档?我在MSDN文档中找不到该功能的任何内容。
我正在使用Visual Studio 2008并以.NET Framework 3.5为目标
提前感谢您的帮助!
答案 0 :(得分:5)
为什么要从密码盐而不是密码本身派生密钥?通常你使用“原始”密码和盐;确实在我的书( grin )中,第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;
}
答案 1 :(得分:0)
看起来这不支持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但是......