C# AES:输入数据不是完整的块
我在使用AESCryptServiceProvider解密内容时遇到以下错误。我需要使用的模式是CipherMode.CFB,填充模式是PKCS7。我能够用相同的密钥、IV、填充模式和密码模式在iOS中解密相同的内容 我尝试以以下方式使用CryptoStream,但无法解密内容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
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字节的倍数。你的一个假设是错误的。