C# AESCryptServiceProvider引发加密异常
我正在为学校做一些项目。我正在与TcpClient和TcpListener进行服务器-客户端通信。首先,我在服务器上创建AES密钥,然后使用RSA将其发送到客户端。我在这里没有问题。然而,当我尝试在客户端加密字符串,然后在服务器上加密它时,我得到了一个异常 填充无效,无法删除 服务器代码: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
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的默认填充可以使用了吗?