我正在为学校做一些项目。我正在与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()时,服务器上会出现异常;
但是,如果我以二进制方式分配Byte[],或者删除所有null值,就会得到一个异常,上面写着“输入数据不是一个完整的块”。
发布于 2014-11-30 10:13:37
我用以下方法解决了这个问题:
aes.Padding = PaddingMode.Zeros;发布于 2014-11-30 14:27:20
问题很可能是Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);。这意味着代码将具有任何值的字节视为文本编码。这意味着,如果字节不代表有效的文本,那么它们要么会更改值(例如,用问号替换),要么将所有内容一起删除。
需要使用基64编码将密文作为实际文本来处理。在当今时代,密文总是二进制的(通常按字节分组)。
请注意,使用PaddingMode.Zeros并不能解决问题。如果使用UTF-8解码,可能会从密文中删除信息。PaddingMode.Zeros只删除异常,并不能解决信息丢失的根本问题。
https://stackoverflow.com/questions/27211859
复制相似问题