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

时间:2015-04-13 12:49:14

标签: c# encryption cryptography aes

我在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);
    }

1 个答案:

答案 0 :(得分:1)

Ciphertexts是二进制数据,可能包含不可打印的字节。如果尝试将字节数组编码为Unicode字符串,则会丢失一些字节。在解密过程中无法恢复它们。

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

// encryption
return Convert.ToBase64String(decryptedBytes);

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