CryptDeriveKey не удается для имени алгоритма AES - PullRequest
1 голос
/ 08 декабря 2010

Я пытаюсь реализовать шифрование 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 ]

5 голосов
/ 08 декабря 2010

Почему вы хотите получить ключ от соли пароля, а не от самого пароля?Обычно вы используете «сырой» пароль и соль;действительно, в моей книге ( ухмылка ) глава 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); 
}

Конечно соль должна быть криптографически безопасным массивом случайных байтов;

0 голосов
/ 08 декабря 2010

Похоже, это не поддерживает AES: http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/61d85001-2eae-4419-b4bf-ce98d46f4d21/

Я также нашел это: http://www.koders.com/csharp/fidDDE5F3FF54C91BC673350363EAECC0D815A68F92.aspx

Похоже, Рейндаэль должен работать. Похоже, что размер ключа установлен только на 16, хотя ...

...