简单的顺序问题 C# 序列化 加密

gaogaohui09 2010-11-25 11:04:48
问题:

1.我现在做的是一个传输文件,发送方是先序列化再加密,还是先加密再序列化。这个有要求吗,那种更好?

接收文件也是同样的问题,反序列化和解密的先后顺序。

2. 如果是大文件传输,我需要对小包进行加密和解密,这个顺序呢,是把总的文件加密后,再加密小包吗?同理,接收方!

这是发送文件的代码

/// <param name="socket" >要发送数据且已经连接到远程主机的 socket</param>
/// <param name="fileName">待发送的文件名称</param>
/// <param name="maxBufferLength">文件发送时的缓冲区大小</param>
/// <param name="outTime">发送缓冲区中的数据的超时时间</param>
/// <returns>0:发送文件成功;-1:超时;-2:发送文件出现错误;-3:发送文件出现异常;-4:读取待发送文件发生错误</returns>
/// <remarks >
/// 当 outTime 指定为-1时,将一直等待直到有数据需要发送
/// </remarks> static
public static int SendFile(Socket socket, string fileName, int maxBufferLength, int outTime)
{
if (fileName == null || maxBufferLength <= 0)
{
throw new ArgumentException("待发送的文件名称为空或发送缓冲区的大小设置不正确.");
}

int flag = 0;
try
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
long fileLen = fs.Length; // 文件长度
long leftLen = fileLen; // 未读取部分
int readLen = 0; // 已读取部分
byte[] buffer = null;

if (fileLen <= maxBufferLength)
{ /**//* 文件可以一次读取*/
buffer = new byte[fileLen];
readLen = fs.Read(buffer, 0, (int)fileLen);
flag = SendData(socket, buffer, outTime);
}
else
{ /**//* 循环读取文件,并发送 */
buffer = new byte[maxBufferLength];
while (leftLen != 0)
{
readLen = fs.Read(buffer, 0, maxBufferLength);
if ((flag = SendData(socket, buffer, outTime)) < 0)
{
break;
}
leftLen -= readLen;
}
}
fs.Close();
}
catch (IOException e)
{
Log.WriteLog(e);
flag = -4;
}
return flag;
}

#endregion


这个是序列化和反序列化的类

public class BufferHelper
{
public static byte[] Serialize(object obj)
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
bf.Serialize(stream,obj);
byte[] datas = stream.ToArray();
stream.Dispose();
return datas;
}

public static object Deserialize(byte[] datas, int index)
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream stream = new MemoryStream(datas,index,datas.Length - index);
object obj = bf.Deserialize(stream);
stream.Dispose();
return obj;
}
}


这是MD5加密类

public static class MD5Helper
{
public static string CretaeMD5(string fileName)
{
string hashStr = string.Empty;
try
{
FileStream fs = new FileStream(
fileName,
FileMode.Open,
FileAccess.Read,
FileShare.Read);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] hash = md5.ComputeHash(fs);
hashStr = ByteArrayToHexString(hash);
fs.Close();
fs.Dispose();
}
catch (Exception ex)
{
throw ex;
}
return hashStr;
}

public static string CretaeMD5(Stream stream)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] hash = md5.ComputeHash(stream);
return ByteArrayToHexString(hash);
}

public static string CretaeMD5(byte[] buffer, int offset, int count)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] hash = md5.ComputeHash(buffer, offset, count);
return ByteArrayToHexString(hash);
}

private static string ByteArrayToHexString(byte[] values)
{
StringBuilder sb = new StringBuilder();
foreach (byte value in values)
{
sb.AppendFormat("{0:X2}", value);
}
return sb.ToString();
}
}


请高手指教!
...全文
458 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanfuliang 2011-04-26
  • 打赏
  • 举报
回复
楼主我顶你的,就序列化,以后用着方便,有人不是说了便于存储与传输嘛?
对啊,你这是对于整体框架的一个架设;
烈火蜓蜻 2010-11-25
  • 打赏
  • 举报
回复
RSA不错
gaogaohui09 2010-11-25
  • 打赏
  • 举报
回复
文件的传输,一般用什么加密好啊?
烈火蜓蜻 2010-11-25
  • 打赏
  • 举报
回复
当然密钥的处理有两种
1. 对称密钥, 最好是其它途径交换这个密钥

2. 不对称密钥。
先由接收方生成一个密匙对,
私钥自己keep
公钥给发送方,
然后发送方用公钥加密,传递给接收方。

没有私钥的人是无法知道原文的(被破解了那无话可说)

而私钥是没有在网络上传输,相对比较安全
烈火蜓蜻 2010-11-25
  • 打赏
  • 举报
回复
传输大文件,注意以下,

1. 连接、协议加密密钥及算法
2. 文件分块
3. 加密
4. 传输
5. 接收
6. 解密
7. 组合
gaogaohui09 2010-11-25
  • 打赏
  • 举报
回复
那请明白的跟我说说,传输大文件时,要注意什么,需要用到哪些技术!有什么可以参考的!急等!
gomoku 2010-11-25
  • 打赏
  • 举报
回复
1、传输文件不用先系列化
2、不能用MD5进行加密(无法解密)。
烈火蜓蜻 2010-11-25
  • 打赏
  • 举报
回复
我不明白,传输文件和序列化有什么关系,更想不到和安全有什么关系
gaogaohui09 2010-11-25
  • 打赏
  • 举报
回复
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
byte[] bytefs = BufferHelper.Serialize(fs); //序列化

如何对byte[]进行加密?
vrhero 2010-11-25
  • 打赏
  • 举报
回复
序列化与安全性毫无关系...序列化仅仅是为了保证数据易于存储和传输...
wolftop 2010-11-25
  • 打赏
  • 举报
回复
先序列化再加密,接收方反过来。

gaogaohui09 2010-11-25
  • 打赏
  • 举报
回复
我现在也只是自己想实践一下,为了保证安全性,不是最好都要序列化吗?

机器人 2010-11-25
  • 打赏
  • 举报
回复
你传输的是文件,为什么会用到序列化?
gaogaohui09 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 linux7985 的回复:]
RSA不错
[/Quote]

有参考实例吗?对于大文件的传输这块的,给点参考吧!我实在是不会啊?

110,525

社区成员

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

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

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