小弟初学socket,想结合加密做一个点对点传输 。无奈在加密的过程中屡屡出错,长时间无法解决。
public static int SendVarData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
byte[] datasize = new byte[4];
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize); //传输的字节大小
//AES加密
string Key = "abcdef1234567890";
string plainText = System.Text.Encoding.Default.GetString(data);
byte[] _key1 = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
SymmetricAlgorithm des = Rijndael.Create();
byte[] inputByteArray = Encoding.UTF8.GetBytes(plainText);
des.Key = Encoding.UTF8.GetBytes(Key);
des.IV = _key1;
byte[] cipherBytes = null;
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cipherBytes = ms.ToArray();//得到加密后的字节数组
cs.Close();
ms.Close();
}
}
while (total < size)
{
sent = s.Send(cipherBytes, total, size, SocketFlags.None); //
这里出错
total += sent;
dataleft -= sent;
}
return total;
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是接收端代码
public static byte[] ReceiveVarData(Socket s)
{
int total = 0;
int recv;
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0, 4, SocketFlags.None);
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = s.Receive(data, total, dataleft, SocketFlags.None);
if (recv == 0)
{
data = null;
break;
}
total += recv;
dataleft -= recv;
}
//对data[]进行解密
string Key = "abcdef1234567890";
byte[] _key1 = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
string str = System.Text.Encoding.Default.GetString(data);
byte[] cipherText = Convert.FromBase64String(str);
SymmetricAlgorithm des2 = Rijndael.Create();
des2.Key = Encoding.UTF8.GetBytes(Key);
des2.IV = _key1;
byte[] decryptBytes = new byte[cipherText.Length];
using (MemoryStream ms = new MemoryStream(data))
{
using (CryptoStream cs = new CryptoStream(ms, des2.CreateDecryptor(), CryptoStreamMode.Read))
{
cs.Read(decryptBytes, 0, cipherText.Length);//
这里出错
cs.Close();
ms.Close();
}
}
return decryptBytes;
}