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

时间:2011-04-13 00:46:37

标签: c# cryptography aes

我正在尝试解密从标准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;
    }

这确实解密了文本,但是生成的文本不是“Password1”,而是“\ 0 \ 0 \ 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 assword 1“。我有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

return Encoding.Unicode.GetString(resultArray);

但这并没有解释所有那些虚假的前导零。很奇怪......

修改...

实际上,我似乎记得SqlMembershipProvider在加密之前使用16字节的盐为密码字节添加前缀,在这种情况下,您可能可以使用以下内容:

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

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