Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AESCryptServiceProvider引发加密异常_C#_Cryptography_Aescryptoserviceprovider - Fatal编程技术网

C# AESCryptServiceProvider引发加密异常

C# AESCryptServiceProvider引发加密异常,c#,cryptography,aescryptoserviceprovider,C#,Cryptography,Aescryptoserviceprovider,我正在为学校做一些项目。我正在与TcpClient和TcpListener进行服务器-客户端通信。首先,我在服务器上创建AES密钥,然后使用RSA将其发送到客户端。我在这里没有问题。然而,当我尝试在客户端加密字符串,然后在服务器上加密它时,我得到了一个异常 填充无效,无法删除 服务器代码: Byte[] bytes = new Byte[1024]; String data = null; clientStream.Read(bytes, 0, bytes.Length); // prebere

我正在为学校做一些项目。我正在与TcpClient和TcpListener进行服务器-客户端通信。首先,我在服务器上创建AES密钥,然后使用RSA将其发送到客户端。我在这里没有问题。然而,当我尝试在客户端加密字符串,然后在服务器上加密它时,我得到了一个异常

填充无效,无法删除 服务器代码:

Byte[] bytes = new Byte[1024];
String data = null;
clientStream.Read(bytes, 0, bytes.Length); // preberemo iz streama
//Array.Clear(bytes, 0, bytes.Length);
// string temp = Encoding.UTF8.GetString(bytes11);
//temp = temp.Replace("\0", "");
//yte[] bytes = Encoding.UTF8.GetBytes(temp);
using (MemoryStream msEncrypt = new MemoryStream())
{

    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, aes.CreateDecryptor(aes.Key,aes.IV), CryptoStreamMode.Write))
    {

        //StreamWriter swEncrypt = new StreamWriter(csEncrypt);

        csEncrypt.Write(bytes, 0, bytes.Length);


    }
    byte[] encrypted = msEncrypt.ToArray();
    string enc = Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);
}
客户端代码:

byte[] messg = Encoding.UTF8.GetBytes(messig);
// dobimo client stream
string enc = null;
using (MemoryStream msEncrypt = new MemoryStream())
{


    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, aes.CreateEncryptor(aes.Key, aes.IV), CryptoStreamMode.Write))
    {

        csEncrypt.Write(messg,0,messg.Length);
    }
    byte[] encrypted = msEncrypt.ToArray();
    enc = Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);
}
byte[] data = new byte[1024];
data = Encoding.UTF8.GetBytes(enc);
//CryptoStream CryptStream = new CryptoStream(stream,aes.CreateEncryptor(aes.Key, aes.IV),CryptoStreamMode.Write);


stream.Write(data, 0, data.Length); // pošljem sporočilo
尝试使用时,服务器上出现异常 msEncrypt.ToArray


但是,如果我手动分配字节[],或删除所有空值,我会得到一个异常,表示输入数据不是一个完整的块。

我使用以下方法解决了此问题:

aes.Padding = PaddingMode.Zeros;
问题可能是Encoding.UTF8.GetStringencrypted,0,encrypted.Length;。这意味着代码将具有任何值的字节视为文本编码。这意味着,如果字节不代表有效文本,它们将改变值,例如用问号替换或一起忽略

需要使用base 64编码将密文视为实际文本。在当今时代,密文总是二进制的,通常以字节分组


请注意,使用PaddingMode.zero并不能解决问题。如果使用UTF-8解码,可能会从密文中删除信息。PaddingMode.Zeros只删除了例外,它并不能解决信息丢失的根本问题。

我还不会否决投票,请阅读我的答案并决定如何处理这个答案。嗯,可能是这样,但PaddingMode.Zeros似乎对我有用。。。我再也没有例外了。。虽然我得到了太多的信息,因为我有字节[1024]数组。。。我解决了这个问题,从读取流中取出int size,然后将数组复制到实际大小的数组中……嗯,是的,这至少同样重要。试图解密过大的密文也会产生同样的后果。现在PKCS7的默认填充可以使用了吗?