Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AES算法名称的CryptDeriveKey失败_C#_.net_.net 3.5_Encryption_Cryptography - Fatal编程技术网

C# AES算法名称的CryptDeriveKey失败

C# AES算法名称的CryptDeriveKey失败,c#,.net,.net-3.5,encryption,cryptography,C#,.net,.net 3.5,Encryption,Cryptography,我正在尝试在我的应用程序中实现AES加密。我有以下代码来创建用户密码的哈希版本 PasswordDeriveBytes passwdHash = new PasswordDeriveBytes( password, salt, "SHA1", 128 ); byte[] keyBytes = passwdHash.CryptDeriveKey( "A

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

PasswordDeriveBytes passwdHash = new PasswordDeriveBytes( password, salt, 
                                                          "SHA1", 128 );
byte[] keyBytes                = passwdHash.CryptDeriveKey( "AES", "SHA1", 
                                                            192, iv );
第二行抛出一个
System.Security.Cryptography.cryptographyException
,错误消息为
对象标识符(OID)未知
。我使用Reflector验证抛出错误是因为
CryptDeriveKey()
不喜欢“AES”算法名称(我使用
AESCryptServiceProvider()
执行加密)。我尝试将名称更改为“AESSManaged”、“AES192”和“Rijndael”,但它们都抛出相同的异常

我怎样才能让它工作?或者是否有另一种派生密钥字节的方法? 另外,是否有关于允许的算法名称字符串的文档?我在MSDN文档中找不到该函数的任何内容

我正在使用VisualStudio2008和target.NETFramework 3.5


提前感谢您的帮助

看起来这不支持AES:

我还发现:


看起来Rijndael应该能用。密钥大小似乎仅设置为16,但…

似乎不支持AES:

我还发现:


看起来Rijndael应该能用。密钥大小似乎仅设置为16,但…

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

为什么要从密码派生密钥,而不是从密码本身派生密钥?通常您使用“原始”密码和一个salt;事实上,在我的书(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(完全按照您发布的方式生成)派生哈希值的。我远非密码专家,所以很可能我做错了什么。好吧,从散列中派生出来对我来说似乎是错误的——这意味着你将密码散列存储在某个地方,这是散列的主要原因。如果您正在存储散列,那么任何人都可以派生密钥,因为他们知道起始点。如果你这样做的话,你也可以选择一个随机密钥。嗯,我的计划是这样做:用户提供密码,我生成一个随机的salt,然后使用salt+密码生成散列。这个散列将用于加密文件,salt与文件一起存储(未加密)(我在某处读到存储salt是可以的)。对于解密用户提供的密码,我使用该密码和salt再次生成散列,并尝试使用散列对文件进行解密。啊,是变量名引发了我,你不是派生散列,而是创建了一个从密码派生的密钥:)我的代码只使用了另一个密钥算法,尽管它只适用于对称加密,这看起来就像你要用的一样。我责怪在他的博客上发布这段代码的人,他称之为散列:-我不明白,我是从原始密码(第一个参数是
PasswordDeriveBytes
构造函数)和一个随机salt(完全按照你发布的方式生成)导出散列的。我远非密码专家,所以很可能我做错了什么。好吧,从散列中派生出来对我来说似乎是错误的——这意味着你将密码散列存储在某个地方,这是散列的主要原因。如果您正在存储散列,那么任何人都可以派生密钥,因为他们知道起始点。如果你这样做的话,你也可以选择一个随机密钥。嗯,我的计划是这样做:用户提供密码,我生成一个随机的salt,然后使用salt+密码生成散列。这个散列将用于加密文件,salt与文件一起存储(未加密)(我在某处读到存储salt是可以的)。对于解密用户提供的密码,我使用该密码和salt再次生成散列,并尝试使用散列对文件进行解密。啊,是变量名引发了我,你不是派生散列,而是创建了一个从密码派生的密钥:)我的代码只使用了另一个密钥算法,尽管它只适用于对称加密,这看起来就像你正在使用的一样。我责怪在他的博客上发布此代码的人,他称之为哈希:-我也找到了第二个链接,但它不起作用,引发了相同的异常。我也找到了第二个链接,但它不起作用,引发了相同的异常。