C#的文件传输AES加密问题

cyclone_li 2015-07-22 02:30:07
小弟初学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;
}
...全文
251 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cyclone_li 2015-07-22
  • 打赏
  • 举报
回复
引用 5 楼 yangb0803 的回复:
你别將加密解密跟收发, 写在一起啊... 先写个加密解密的函数, 然后, 你发送时, 调加密函数对发送内容加密, 接收时, 对收到后的内容调用解密函数一次, 会好调试些. 加解密函数单独写到一个类里面, 那些向量,密钥什么的, 都是共用的, 你也不用象在程序中这样,要多次定义...
我再试试 谢谢
cyclone_li 2015-07-22
  • 打赏
  • 举报
回复
引用 5 楼 yangb0803 的回复:
你别將加密解密跟收发, 写在一起啊... 先写个加密解密的函数, 然后, 你发送时, 调加密函数对发送内容加密, 接收时, 对收到后的内容调用解密函数一次, 会好调试些. 加解密函数单独写到一个类里面, 那些向量,密钥什么的, 都是共用的, 你也不用象在程序中这样,要多次定义...
我是分开的呢 但是都出现了问题 。
道玄希言 2015-07-22
  • 打赏
  • 举报
回复
你别將加密解密跟收发, 写在一起啊... 先写个加密解密的函数, 然后, 你发送时, 调加密函数对发送内容加密, 接收时, 对收到后的内容调用解密函数一次, 会好调试些. 加解密函数单独写到一个类里面, 那些向量,密钥什么的, 都是共用的, 你也不用象在程序中这样,要多次定义...
道玄希言 2015-07-22
  • 打赏
  • 举报
回复
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(Encoding.UTF8.GetBytes(key), _key1), CryptoStreamMode.Write)
道玄希言 2015-07-22
  • 打赏
  • 举报
回复
1. sent = s.Send(cipherBytes, 0, cipherBytes.Length, SocketFlags.None);
cyclone_li 2015-07-22
  • 打赏
  • 举报
回复
学校里布置的暑期作业 ,想锻炼下自己
  • 打赏
  • 举报
回复
当年连微软的 MSN 都没有加密。你现在才刚做一个练手的东西,有多少人需要拦截你的信息?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧