c#加密问题

wybstar706 2004-09-15 03:28:27
使用c#编写文件加密器,算法采用对称加密算法,但运行时发现如果文件比较大的时候(比如45MB)加密失败,报OutOfMemoryException异常。但当文件比较小(比如15MB),程序均运行正常。
代码如下:

public byte[] Encrypt(byte[] sourceObject,string key)
{
MemoryStream msOut = new MemoryStream();
CryptoStream encryCs;

encryptMethod.Key = GetValidKey(key);
encryptMethod.IV = GetValidIV(key,encryptMethod.IV.Length);
encryCs = new CryptoStream(msOut,encryptMethod.CreateEncryptor(),CryptoStreamMode.Write);
bw.Write(sourceObject);
encryCs.Write(sourceObject,0,sourceObject.Length);
encryCs.FlushFinalBlock();

encryCs.Close();
return msOut.ToArray();
}

请问各位是为什么呢?难道.net中的加密不能加密大文件吗??
...全文
279 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hame 2004-10-04
  • 打赏
  • 举报
回复
个人认为: FileStream 使用了磁盘缓存空间,而MemoryStream一直使用内存空间.所以会出现楼主所说那种情况。
zl9732 2004-09-20
  • 打赏
  • 举报
回复
学习
kerlw 2004-09-17
  • 打赏
  • 举报
回复
哦,对不起哦,看错了。我上面的帖子写的不对,这种构造函数是构造出可调整大小的,再看看别的地方吧 不好意思~^_^
cathylang 2004-09-17
  • 打赏
  • 举报
回复
学习,up
kerlw 2004-09-17
  • 打赏
  • 举报
回复
你使用的
MemoryStream msOut = new MemoryStream();
是基于指定的字节数组初始化 MemoryStream 类的无法调整大小的新实例。所以当文件过大超过stream的容量的时候就会异常了。你可以使它变成可以调整大小的流,就没问题了。
khpcg 2004-09-17
  • 打赏
  • 举报
回复
using System;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace UDPChat
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{



//private static string Key1="!i~6oxli@]t2K'y$";
//private static string Iv1="~x7Oq{6+ql@#VI$";
private static byte[] Iv=new byte[16];
private static byte[] Key=new byte[16];
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{

//
// TODO: 在此处添加代码以启动应用程序
//
Stream stringkey=new FileStream("c:\\Networking\\Streams\\MyStreamKey1.txt",FileMode.Open,FileAccess.Read);
BinaryReader brK=new BinaryReader(stringkey);
int endOfFileK;
int m=0;

do
{
endOfFileK=brK.PeekChar();
if(endOfFileK!=-1)
{

//keyOne[m]=Convert.ToByte(brK.ReadUInt16());
Key[m]=brK.ReadByte();
Console.WriteLine("Key[{0}]={1}",m,Key[m]);
m++;
//Console.WriteLine("m={0}",m);

}
}
while(endOfFileK!=-1);
Stream stringkey1=new FileStream("c:\\Networking\\Streams\\MyStreamIv1.txt",FileMode.Open,FileAccess.Read);
BinaryReader brK1=new BinaryReader(stringkey1);
int endOfFileK1;
int m1=0;

do
{
endOfFileK1=brK.PeekChar();
if(endOfFileK1!=-1)
{

//keyOne[m]=Convert.ToByte(brK.ReadUInt16());
Iv[m]=brK1.ReadByte();
Console.WriteLine("Iv[{0}]={1}",m1,Iv[m1]);
m1++;
//Console.WriteLine("m={0}",m);

}
}
while(endOfFileK1!=-1);
encryptData();
decryptData();


}



static void encryptData()
{
//Create cipher file stream
FileStream fs=new FileStream("c:\\Networking\\Streams\\MyStreamCipher",FileMode.Create);
//Create the instance of cipher
RijndaelManaged RMCrypto=new RijndaelManaged();
//cipher and output
CryptoStream cs=new CryptoStream(fs,RMCrypto.CreateEncryptor(Key,Iv),CryptoStreamMode.Write);
FileStream fsIn=new FileStream("c:\\Networking\\Streams\\诺丁山\\CD1.rmvb",FileMode.Open);
int datal;
while((datal=fsIn.ReadByte())!=-1)
cs.WriteByte((byte)datal);
//close
fsIn.Close();
cs.Close();
fs.Close();
}

static void decryptData()
{
FileStream fs=new FileStream("c:\\Networking\\Streams\\MyStreamCipher",FileMode.Open);
RijndaelManaged RMCrypto=new RijndaelManaged();
CryptoStream cs=new CryptoStream(fs,RMCrypto.CreateDecryptor(Key,Iv),CryptoStreamMode.Read);
FileStream fsOut=new FileStream("c:\\Networking\\Streams\\MyStreamCipherPlain",FileMode.Create);
int datal;
while((datal=cs.ReadByte())!=-1)
fsOut.WriteByte((byte)datal);
fsOut.Close();
cs.Close();
fs.Close();
}
}
}
khpcg 2004-09-17
  • 打赏
  • 举报
回复
我曾经用AES算法加密过600M得东西啊
linglingchen 2004-09-17
  • 打赏
  • 举报
回复
有些加密方法是會限制加密的內容的大小,比如說rsa算法就有它的限制
happyjun2000 2004-09-17
  • 打赏
  • 举报
回复
调试一下吧
wybstar706 2004-09-17
  • 打赏
  • 举报
回复
我将程序进行了改造,如 khpcg(欢乐英雄)那样,用FileStream,而不用MemoryStream,程序能正常运行并能加密大文件(如150Mb).
但我不太明白为何用MemoryStream就不能成功加密大文件呢???
请指教阿!!!
hxhbluestar 2004-09-16
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpref/html/frlrfSystemIOMemoryStreamClassctorTopic.asp
outspaceman 2004-09-16
  • 打赏
  • 举报
回复
应该是MemoryStream容量不够,造成溢出.
wuyeniao 2004-09-16
  • 打赏
  • 举报
回复
没有看懂啊,用断点看看哪里出的异常

另外看看Stream 是不是有更改长度的属性之类的
wybstar706 2004-09-16
  • 打赏
  • 举报
回复
郁闷阿,居然没人回帖!!!
xiangyangsunboy1 2004-09-15
  • 打赏
  • 举报
回复
没有试过,帮你UP!

110,537

社区成员

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

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

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