我正在尝试创建一个客户端和服务器,以便安全地从客户端向服务器发送文件并加密。首先,我将使用RSA在双方(客户端到服务器)之间发送DES密钥。我发送RSA公共使用它并将加密的DES密钥发送到服务器并解密。然后我将文件名长度,文件名和数据(加密)添加到将要发送到服务器的字节数组中。在使用DES解密文件时,我收到了错误的数据异常,所以我认为文件发送错误或者DES密钥被错误地从客户端发送到服务器。该文件也可以在原点解密。
以下是客户端代码:
//encrypt the file with the des key
byte [] encryptedFile = DESEncrypt(fileBytes);
MessageBox.Show("enc file length " + encryptedFile.Length);
//send the file
byte[] k = DESdecrypt(encryptedFile);
byte[] fileNameByte = Encoding.ASCII.GetBytes(Path.GetFileName(filePath.Text));
byte[] clientData = new byte[4 + fileNameByte.Length + encryptedFile.Length];
byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
fileNameLen.CopyTo(clientData, 0);
fileNameByte.CopyTo(clientData, 4);
encryptedFile.CopyTo(clientData, 4 + fileNameByte.Length);
soc.Send(clientData);
这是服务器代码:
byte[] clientData = new byte[1024 * 5000];
int receivedBytesLen = s.Receive(clientData);
byte[] b = clientData;
int fileNameLen = BitConverter.ToInt32(clientData, 0);
fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
byte[] l = Encoding.ASCII.GetBytes(fileName);
Console.WriteLine("Client:{0} connected & File {1} started received.", s.RemoteEndPoint, fileName);
Console.WriteLine("buffer size : ", b.Length);
Console.WriteLine("index : ", 4 + fileNameLen);
string temp = System.Text.Encoding.UTF8.GetString(b, 3 + fileNameLen, receivedBytesLen);
fileBytes = System.Text.Encoding.UTF8.GetBytes(temp);
Console.WriteLine("rec file");
}
catch (Exception exx)
{
Console.WriteLine(exx.ToString());
Console.Read();
}
//decrypt
byte[] decryptedFile = null;
try
{
decryptedFile = DESdecrypt(fileBytes);
}
catch(Exception exx)
{
Console.WriteLine(exx.ToString());
Console.Read();
}
答案 0 :(得分:0)
问题是我正在尝试解密错误的块。这是因为我在
中使用了错误的索引string temp = System.Text.Encoding.UTF8.GetString(b, 3 + fileNameLen, receivedBytesLen);
并更新为:
Array.Copy(b, fileNameLen + 4, fileBytes, 0, dataLengthInt - fileNameLen-4);
在我使用的文件中,receivedBytesLen是2756字节,而解密数据是1496,所以我需要发送数据长度以从数据块中提取它。