C# RIJNDAEL 大文件 分割/合并 并 加密

小范f-li.cn 2010-06-25 09:39:42
http://www.cnblogs.com/Googler/archive/2010/06/24/1764651.html
public void EncryptFile(string inFileName, string outFileName, long splitSize, SplitFileMode mode)
{
FileStream _inStream = new FileStream(inFileName, FileMode.Open, FileAccess.Read);
long fileLength = _inStream.Length, oddSize, avgSize = Math.DivRem(fileLength, splitSize, out oddSize),
i = 0L, count, size;
switch (mode)
{
case SplitFileMode.ByInputFileLength:
count = avgSize;
size = splitSize;
break;
default:
count = splitSize;
size = avgSize;
break;
}
using (ICryptoTransform encrypto = rijndael.CreateEncryptor(legalKey, legalIV))
using (CryptoStream inStream = new CryptoStream(_inStream, encrypto, CryptoStreamMode.Read))
{
byte[] buffer = new byte[BufferUtility.FileBufferSize];
while (i < count)
{
long wrote = 0L, length = (++i) == count ? size + oddSize : size;
using (FileStream outStream = new FileStream(String.Concat(outFileName, "_Part", i, ".temp"), FileMode.Create, FileAccess.Write))
{
int read;
while (wrote < length)
{
read = inStream.Read(buffer, 0, Math.Min(buffer.Length, (int)(length - wrote)));
outStream.Write(buffer, 0, read);
wrote += (long)read;
}
if (i == count)
{
while ((read = inStream.Read(buffer, 0, buffer.Length)) != 0)
{
outStream.Write(buffer, 0, read);
}
BufferUtility.Write(fileLength, buffer, 0);
outStream.Write(buffer, 0, 8);
}
}
}
}
}
public void DecryptFile(string inFileName, string outFileName, long splitSize, SplitFileMode mode)
{
byte[] buffer = new byte[BufferUtility.FileBufferSize];
long i = 1, fileLength;
while (File.Exists(String.Concat(inFileName, "_Part", i, ".temp")))
{
i++;
}
FileStream _lastInStream = new FileStream(String.Concat(inFileName, "_Part", --i, ".temp"), FileMode.Open, FileAccess.ReadWrite);
long _lastInStreamLength = _lastInStream.Length - 8;
_lastInStream.Position = _lastInStreamLength;
_lastInStream.Read(buffer, 0, 8);
_lastInStream.Position = 0L;
_lastInStream.SetLength(_lastInStreamLength);
BufferUtility.Read(out fileLength, buffer, 0);
long oddSize, avgSize = Math.DivRem(fileLength, splitSize, out oddSize),
count, size;
i = 0L;
switch (mode)
{
case SplitFileMode.ByInputFileLength:
count = avgSize;
size = splitSize;
break;
default:
count = splitSize;
size = avgSize;
break;
}
using (ICryptoTransform decrypto = rijndael.CreateDecryptor(legalKey, legalIV))
using (CryptoStream outStream = new CryptoStream(new FileStream(outFileName, FileMode.Create, FileAccess.Write), decrypto, CryptoStreamMode.Write))
{
while (i < count)
{
long wrote = 0L, length = (++i) == count ? size + oddSize : size;
using (FileStream inStream = i == count ? _lastInStream : new FileStream(String.Concat(inFileName, "_Part", i, ".temp"), FileMode.Open, FileAccess.Read))
{
int read;
while (wrote < length)
{
read = inStream.Read(buffer, 0, Math.Min(buffer.Length, (int)(length - wrote)));
outStream.Write(buffer, 0, read);
wrote += (long)read;
}
if (i == count)
{
while ((read = inStream.Read(buffer, 0, buffer.Length)) != 0)
{
outStream.Write(buffer, 0, read);
}
BufferUtility.Write(fileLength, buffer, 0);
inStream.Write(buffer, 0, 8);
}
}
}
}
}

...全文
69 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xy325432 2010-06-25
  • 打赏
  • 举报
回复
帮你顶下
小范f-li.cn 2010-06-25
  • 打赏
  • 举报
回复
sf...

110,537

社区成员

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

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

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