在 C# 中使用 AesCryptoServiceProvider 时出现无效填充错误

Invalid padding error when using AesCryptoServiceProvider in C#

我用 C# 编写了一个简单的 encryp/decrypt 方法,它使用 AES 算法。当我尝试加密然后解密具有特定长度(例如 4 或 7 个字符)的字符串时,它工作正常,但是它表示填充无效且无法删除。

    public static string Decrypt(string text)
    {
        Aes a = System.Security.Cryptography.AesCryptoServiceProvider.Create();
        a.Padding = PaddingMode.PKCS7;
        a.Key = Convert.FromBase64String("UDlArN63HCk15fHBski/zvaWiMZJi+jR1BADvVgenCU=");
        a.IV = Convert.FromBase64String("xZG/eLY8eq0mQhUXvKbUDQ==");
        var dc = a.CreateDecryptor();

        byte[] encryptedBytes = Encoding.Unicode.GetBytes(text);
        byte[] decryptedBytes = dc.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);

        return Encoding.Unicode.GetString(decryptedBytes);
    }

    public static string Encrypt(string text)
    {
        Aes a = System.Security.Cryptography.AesCryptoServiceProvider.Create();
        a.Padding = PaddingMode.PKCS7;
        a.Key = Convert.FromBase64String("UDlArN63HCk15fHBski/zvaWiMZJi+jR1BADvVgenCU=");
        a.IV = Convert.FromBase64String("xZG/eLY8eq0mQhUXvKbUDQ==");
        var dc = a.CreateEncryptor();

        byte[] decryptedBytes = Encoding.Unicode.GetBytes(text);
        byte[] encryptedBytes = dc.TransformFinalBlock(decryptedBytes, 0, decryptedBytes.Length);

        return Encoding.Unicode.GetString(encryptedBytes);
    }

密文是二进制数据,可能包含不可打印的字节。如果尝试将字节数组编码为 Unicode 字符串,您将丢失一些字节。解密时将无法恢复。

如果您确实想将密文作为字符串处理,则需要将其转换为文本表示形式,例如 Base 64 或 Hex。

// encryption
return Convert.ToBase64String(decryptedBytes);

// decryption
byte[] decryptedBytes = Convert.FromBase64String(text);