【问题标题】:CryptDeriveKey fails for AES algorithm nameAES 算法名称的 CryptDeriveKey 失败
【发布时间】:2010-12-08 03:57:55
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    为什么要从密码盐而不是密码本身派生密钥?通常你使用“原始”密码和盐;确实在我的书中 (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;
    }
    

    【讨论】:

    • 我不明白,我从原始密码(PasswordDeriveBytes 构造函数的第一个参数)和随机盐(完全按照您发布的方式生成)派生哈希。我远不是加密专家,所以很可能我做错了什么。
    • 好吧,从散列派生在我看来是错误的——这意味着您将密码散列存储在某处,这是散列的主要原因。如果您要存储散列,那么任何人都可以在知道起点的情况下派生密钥。如果您这样做,您也可以选择一个随机密钥。
    • 嗯,我的计划是这样做:用户提供密码,我生成随机盐并使用盐+密码生成哈希。该哈希将用于加密文件,并且盐与文件一起存储(未加密)(我在某处读到存储盐是可以的)。对于解密用户提供密码,我使用该密码和 salt 再次生成哈希并尝试使用哈希解密文件。
    • 啊,这是让我失望的变量名,您不是在派生哈希,而是在创建从密码派生的密钥 :) 我的代码只是使用了另一种密钥算法,尽管它只适用于对称加密,这看起来就像您将要使用的一样。
    • 我责怪在他的博客上发布此代码的人,他称其为哈希 :-D
    【解决方案2】:

    看起来这不支持 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...

    【讨论】:

    • 我也找到了第二个链接,但它不起作用,抛出同样的异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多