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



我在c#中编写了一个简单的加密/解密方法,该方法使用AES alg。当我尝试加密然后解密具有特定长度(如 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);

最新更新