C# AES:输入数据不是完整的块

C# AES:输入数据不是完整的块,c#,cryptography,aes,aescryptoserviceprovider,C#,Cryptography,Aes,Aescryptoserviceprovider,我在使用AESCryptServiceProvider解密内容时遇到以下错误。我需要使用的模式是CipherMode.CFB,填充模式是PKCS7。我能够用相同的密钥、IV、填充模式和密码模式在iOS中解密相同的内容 我尝试以以下方式使用CryptoStream,但无法解密内容 public byte[] DecryptWithAES(byte[] content, byte[] key, byte[] iv, int mode, int paddingMode) { byte[] pl

我在使用AESCryptServiceProvider解密内容时遇到以下错误。我需要使用的模式是CipherMode.CFB,填充模式是PKCS7。我能够用相同的密钥、IV、填充模式和密码模式在iOS中解密相同的内容

我尝试以以下方式使用CryptoStream,但无法解密内容

public byte[] DecryptWithAES(byte[] content, byte[] key, byte[] iv, int mode, int paddingMode)
{
    byte[] plainBytes = null;
    using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
    {
        aes.BlockSize = 128;
        aes.KeySize = 256;

        aes.IV = iv;
        aes.Key = key;

        aes.Padding = (PaddingMode)paddingMode;
        aes.Mode = (CipherMode)mode;

        ICryptoTransform crypto = aes.CreateDecryptor(aes.Key, aes.IV);
        using (var input = new MemoryStream(content))
        {
            using (var output = new MemoryStream())
            {
                using (var cryptStream = new CryptoStream(input, crypto, CryptoStreamMode.Read))
                {
                    var buffer = new byte[1024];
                    var read = cryptStream.Read(buffer, 0, buffer.Length);
                    while (read > 0)
                    {
                        output.Write(buffer, 0, read);
                        read = cryptStream.Read(buffer, 0, buffer.Length);
                    }
                }

                    plainBytes = output.ToArray();
            }
        }

        return plainBytes;
    }
}
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;

private byte[] Decrypt(byte[] content, byte[] key, byte[] iv, string mode)
        {

            var cipher = CipherUtilities.GetCipher(mode);
            cipher.Init(false, new ParametersWithIV(new KeyParameter(key), iv));
            var blockBytes = cipher.ProcessBytes(content, 0, content.Length);
            var finalBytes = cipher.DoFinal();

            var plainBytes = new byte[content.Length];

            var counter = 0;
            if (blockBytes != null)
            {
                for (var i = 0; i < blockBytes.Length; i++)
                    plainBytes[counter++] = blockBytes[i];
            }

            if (finalBytes != null)
            {
                for (var i = 0; i < finalBytes.Length; i++)
                    plainBytes[counter++] = finalBytes[i];
            }

            return plainBytes;
        }
我也试着用下面的方法解密内容,但不起作用

public byte[] DecryptWithAES(byte[] content, byte[] key, byte[] iv, int mode, int paddingMode)
{
    byte[] plainBytes = null;
    using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
    {
        aes.BlockSize = 128;
        aes.KeySize = 256;

        aes.IV = iv;
        aes.Key = key;

        aes.Padding = (PaddingMode)paddingMode;
        aes.Mode = (CipherMode)mode;

        ICryptoTransform crypto = aes.CreateDecryptor(aes.Key, aes.IV);
        plainBytes = crypto.TransformFinalBlock(content, 0, content.Length);
    }

    return plainBytes;
}
在这两种情况下,填充模式都是PKCS7,密码模式都是CFB

我尝试了长度为22的加密内容。 键长:32, 长度:16


我从昨天起就被这个问题缠住了。请帮帮我。

最后我使用了Bouncy castle库,上面的内容使用“AES/CFB/NopAdd”进行解密。解密内容不需要CTR模式

public byte[] DecryptWithAES(byte[] content, byte[] key, byte[] iv, int mode, int paddingMode)
{
    byte[] plainBytes = null;
    using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
    {
        aes.BlockSize = 128;
        aes.KeySize = 256;

        aes.IV = iv;
        aes.Key = key;

        aes.Padding = (PaddingMode)paddingMode;
        aes.Mode = (CipherMode)mode;

        ICryptoTransform crypto = aes.CreateDecryptor(aes.Key, aes.IV);
        using (var input = new MemoryStream(content))
        {
            using (var output = new MemoryStream())
            {
                using (var cryptStream = new CryptoStream(input, crypto, CryptoStreamMode.Read))
                {
                    var buffer = new byte[1024];
                    var read = cryptStream.Read(buffer, 0, buffer.Length);
                    while (read > 0)
                    {
                        output.Write(buffer, 0, read);
                        read = cryptStream.Read(buffer, 0, buffer.Length);
                    }
                }

                    plainBytes = output.ToArray();
            }
        }

        return plainBytes;
    }
}
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;

private byte[] Decrypt(byte[] content, byte[] key, byte[] iv, string mode)
        {

            var cipher = CipherUtilities.GetCipher(mode);
            cipher.Init(false, new ParametersWithIV(new KeyParameter(key), iv));
            var blockBytes = cipher.ProcessBytes(content, 0, content.Length);
            var finalBytes = cipher.DoFinal();

            var plainBytes = new byte[content.Length];

            var counter = 0;
            if (blockBytes != null)
            {
                for (var i = 0; i < blockBytes.Length; i++)
                    plainBytes[counter++] = blockBytes[i];
            }

            if (finalBytes != null)
            {
                for (var i = 0; i < finalBytes.Length; i++)
                    plainBytes[counter++] = finalBytes[i];
            }

            return plainBytes;
        }
使用Org.bounchycastle.Crypto.Parameters;
使用Org.BouncyCastle.Security;
私有字节[]解密(字节[]内容,字节[]密钥,字节[]iv,字符串模式)
{
var cipher=CipherUtilities.GetCipher(模式);
Init(false,新参数swithiv(新的KeyParameter(key),iv));
var blockBytes=cipher.ProcessBytes(content,0,content.Length);
var finalBytes=cipher.DoFinal();
var plainBytes=新字节[content.Length];
var计数器=0;
if(blockBytes!=null)
{
对于(var i=0;i
试试看


PKCS7从不生成输出大小22。把密码贴出来,可能已经坏了。此外,您不能刷新加密流。您必须先处理它,然后才能使用输出。更正代码并在此处更新。我还尝试了其他填充模式,如无和零。实际上,IOS应用程序不使用填充。在调用cryptStream.Flush()之前,我遇到了一个异常。
事实上,IOS应用程序使用了无填充
,并且可以正常工作。这是更多的证据表明加密代码弄乱了填充。按要求发布加密代码。投票暂时关闭,因为答案不可能。加密代码是用Java服务编写的,我没有相应的代码。但是iOS应用程序和另外一个python客户端能够解密内容。那么可能你没有正确的设置。对AES使用无填充实际上是不可能的。它应该会在解密数据的末尾产生垃圾字节。我不明白他们怎么能产生22字节的输出。它应该是16字节的倍数。你的一个假设是错误的。