从 AES 解密时,解密文本末尾会出现随机字母和数字

问题描述 投票:0回答:1

我目前面临的问题是,当从我的解密方法返回解密数据时,原始数据的文本末尾有随机数字和字母。我正在使用 AES 加密,这是我第一次使用它,所以如果我遗漏了一些明显的东西或者做了一些不好的做法,请好好指出。

我的加密方式是-

        public static byte[] Encrypt(int key, string plainText, int iv)
        {
            byte[] encryptedText;
            Aes aesAlg = Aes.Create();
            string keyString = key.ToString();
            Rfc2898DeriveBytes sourceDeriveBytes = new(keyString, Encoding.UTF8.GetBytes(keyString));
            byte[] keyBytes = sourceDeriveBytes.GetBytes(16);
            aesAlg.Key = keyBytes;

            string ivString = iv.ToString();
            Rfc2898DeriveBytes zendeskDeriveBytes = new(ivString, Encoding.UTF8.GetBytes(ivString));
            byte[] ivBytes = zendeskDeriveBytes.GetBytes(16);
            aesAlg.IV = ivBytes;

            aesAlg.Padding = PaddingMode.None;

            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                }
                encryptedText = msEncrypt.ToArray();

            }

            return encryptedText;
        }

我的解密方法是-

        public static string Decrypt(int key, byte[] encryptedText, int iv)
        {
            string plainText;
            Aes aesAlg = Aes.Create();
            string keyString = key.ToString();
            Rfc2898DeriveBytes pbkdf = new(keyString, Encoding.UTF8.GetBytes(keyString));
            byte[] keyBytes = pbkdf.GetBytes(16);
            aesAlg.Key = keyBytes;

            string ivString = iv.ToString();
            Rfc2898DeriveBytes zendeskDeriveBytes = new(ivString, Encoding.UTF8.GetBytes(ivString));
            byte[] ivBytes = zendeskDeriveBytes.GetBytes(16);
            aesAlg.IV = ivBytes;

            aesAlg.Padding = PaddingMode.None;

            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msDecrypt = new MemoryStream(encryptedText))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        plainText = srDecrypt.ReadToEnd();
                    }
                }
            }

            return plainText;
        }

返回的解密文本的示例是

TESTa��6�F�~4�?�03p��]��]�*�R���p��]��]�*�R��
。我需要在代码中更改哪些内容才能删除数据末尾的额外字符?

c# encryption cryptography aes aescryptoserviceprovider
1个回答
0
投票

您使用的是 PaddingMode.None,它要求输入数据能够完全被块大小整除(AES 为 16 字节)。

尝试加密/解密

TESTTESTTESTTEST
(4个TEST,16字节),你会得到像第一个截图一样的正确结果。

我更喜欢您使用

PKCS7
填充而不是
None
填充,因为
PKCS7
没有这个问题。

改变

aesAlg.Padding = PaddingMode.None;

aesAlg.Padding = PaddingMode.PKCS7;

None Padding

PKCS7 Padding

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.