Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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加密的解密文本有额外的空格_C#_Cryptography_Aes - Fatal编程技术网

C# AES加密的解密文本有额外的空格

C# AES加密的解密文本有额外的空格,c#,cryptography,aes,C#,Cryptography,Aes,我正在尝试解密存储在标准SqlMembershipProvider数据库中的密码。为了做到这一点,我黑了以下控制台应用程序: static void Main(string[] args) { const string encryptedPassword = @"wGZmgyql4prPIr7t1uaxa+RBRJC51qOPBO5ZkSskUtUCY1aBpqNifQGknEfWzky4"; const string iv = @"Jc0RhfD

我正在尝试解密存储在标准SqlMembershipProvider数据库中的密码。为了做到这一点,我黑了以下控制台应用程序:

    static void Main(string[] args)
    {
        const string encryptedPassword = @"wGZmgyql4prPIr7t1uaxa+RBRJC51qOPBO5ZkSskUtUCY1aBpqNifQGknEfWzky4";
        const string iv = @"Jc0RhfDog8SKvtF9aI+Zmw==";
        var password = Decrypt(encryptedPassword, iv);

        Console.WriteLine(password);
        Console.ReadKey();
    }

    public static string Decrypt(string toDecrypt, string iv)
    {
        var ivBytes = Convert.FromBase64String(iv);
        const string decryptKey = "DECRYPTION_KEY_HERE";
        var keyArray = StringToByteArray(decryptKey);
        var toEncryptArray = Convert.FromBase64String(toDecrypt);
        var rDel = new AesCryptoServiceProvider() { Key = keyArray, IV = ivBytes};
        var cTransform = rDel.CreateDecryptor();
        var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        return Encoding.UTF8.GetString(resultArray);
    }

    public static byte[] StringToByteArray(String hex)
    {
        var numberChars = hex.Length;
        var bytes = new byte[numberChars / 2];
        for (var i = 0; i < numberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }
static void Main(字符串[]args)
{
常量字符串encryptedPassword=@“wGZmgyql4prPIr7t1uaxa+RBRJC51QOPBO5ZKSKUTUCY1ABPQNIFQKNEFWZKY4”;
常量字符串iv=@“Jc0RhfDog8SKvtF9aI+Zmw==”;
var password=解密(encryptedPassword,iv);
控制台写入线(密码);
Console.ReadKey();
}
公共静态字符串解密(字符串到解密,字符串iv)
{
var ivBytes=Convert.FromBase64String(iv);
const string decryptKey=“DECRYPTION\u KEY\u HERE”;
var keyArray=StringToByteArray(解密密钥);
var-toEncryptArray=Convert.FromBase64String(toDecrypt);
var rDel=new AesCryptoServiceProvider(){Key=keyArray,IV=ivBytes};
var cTransform=rDel.CreateDecryptor();
var resultArray=cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);
返回Encoding.UTF8.GetString(resultArray);
}
公共静态字节[]StringToByteArray(字符串十六进制)
{
变量numbercars=十六进制长度;
var bytes=新字节[numbercars/2];
对于(变量i=0;i
这确实会解密文本,但是结果文本不是类似于“Password1”,而是“\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0P\0a\0s\0s\0w\0o\0r\0d\01\0”,作为一组空格写入控制台,然后是“p a s w r d 1”。知道我做错了什么吗?

我怀疑部分问题可能是原始密码在加密之前被编码为UTF-16,而您正在将其解码为UTF-8。尝试更改
解密方法的最后一行:

return Encoding.Unicode.GetString(resultArray);
但这并不能解释所有这些虚假的前导零。很奇怪

编辑…

事实上,我似乎记得
SqlMembershipProvider
在加密之前,在密码字节前加上16字节的salt,在这种情况下,您可能可以这样做:

return Encoding.Unicode.GetString(resultArray, 16, resultArray.Length - 16);

但这仍然不能解释为什么这16个字节都是零而不是一堆随机值…

解密密码?嗯?它们应该存储为单向散列,对吗?我看到一个
iv
,但是没有,或者——也许密码是使用与解密不同的加密或填充模式加密到数据库中的?(操作模式似乎不太可能,因为您确实获得了一些有意义的数据,但仍然要找到加密例程的功能并将其完全反转。:@Mitch Wheat,这些都是我继承的遗留系统。我正在精确地解密它们,以便使用salt散列还原它们。@sarnold它是SharePoint网站的标准SqlMembershipProvider,密码格式设置为“加密”。我不确定它们用于填充什么,但我在AescrytPoseServiceProvider上尝试了每一个填充设置,但都没有成功。@Giuliano0正如我在上面回答的,我正在将登录信息从一个旧系统移植到一个新系统,在这个系统中,密码将存储在一个盐散列中。为了做到这一点,我需要能够解密现有的密码。你是对的!这删除了密码中的空格,但没有删除前导的空格。因此,在数据库中,有一个盐字段,当我解密它时,它是“iv”的输入。你可能是对的,我可以按照你的建议做,我将用以空格开头的密码来测试它,以确保安全。