c# - AES 加密解密的文本有多余的空格

标签 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\0P\0a\0s\0s\0w\0o\0r\0d\01\0”,它以一堆空格的形式写入控制台,然后是“P a s s word 1”。你知道我做错了什么吗?

最佳答案

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

return Encoding.Unicode.GetString(resultArray);

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

编辑...

实际上,我似乎记得 SqlMembershipProvider 在加密之前在密码字节前添加了 16 字节的盐,在这种情况下,您可能能够摆脱这样的情况:

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

但这仍然无法解释为什么这 16 个字节全为零而不是一堆随机值......

关于c# - AES 加密解密的文本有多余的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5643248/

相关文章:

java - 无法在 Android 上使用 AES 密码

c# - 在 foreach 循环中打印出 MyArray[i]

c# - Winform 应用程序中的进度条,递增进度条直到在数据库上执行查询

javascript - 如何通过 Subtle Crypto 正确解密通过 CryptoJS 加密的文本

java - javax.crypto.BadPaddingException:给定最终 block 未正确填充-奇怪的错误

python - 使用 PyCrypto 进行 AES 加密,使用 mcrypt 进行解密

c# - 在 C# 中使用继承而不是名称别名是否正确?

c# - 单元测试适配器连接数据源失败

java - PBKDF2-HMAC-SHA256 for JAVA 的可靠实现

java - OCSP响应中的responderID有什么用?