对于AES算法名称,CryptDeriveKey失败

时间:2010-12-08 03:57:56

标签: c# .net .net-3.5 encryption cryptography

我正在尝试在我的应用程序中实现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为目标

提前感谢您的帮助!

2 个答案:

答案 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但是......