帮我看一下为什么当我用MemoryStream作为解密输入流时会出错,
而我用FileStream作为输入流时不会出错.public static byte[] Decrypt(byte[] cipherData)
{
.... .... byte[] decryptedData; MemoryStream inStream = new MemoryStream();
inStream.Write(cipherData, 0, cipherData.Length);
inStream.Seek(0, SeekOrigin.Begin); //symmetricCrypto已经定义了,并包含了Key和IV
ICryptoTransform cryptoTransform = symmetricCrypto.CreateDecryptor(); CryptoStream cryptoStream = new CryptoStream( inStream, cryptoTransform, CryptoStreamMode.Read); decryptedData = new byte[(int)(cryptoStream.Length)]; cryptoStream.Read(decryptedData, 0, decryptedData.Length);
cryptoStream.Close();
}
而我用FileStream作为输入流时不会出错.public static byte[] Decrypt(byte[] cipherData)
{
.... .... byte[] decryptedData; MemoryStream inStream = new MemoryStream();
inStream.Write(cipherData, 0, cipherData.Length);
inStream.Seek(0, SeekOrigin.Begin); //symmetricCrypto已经定义了,并包含了Key和IV
ICryptoTransform cryptoTransform = symmetricCrypto.CreateDecryptor(); CryptoStream cryptoStream = new CryptoStream( inStream, cryptoTransform, CryptoStreamMode.Read); decryptedData = new byte[(int)(cryptoStream.Length)]; cryptoStream.Read(decryptedData, 0, decryptedData.Length);
cryptoStream.Close();
}
解决方案 »
- C#中的线程为何会被抢占?
- ★如何用c#实现 对远程机器上的文本文件的读取
- (急急,,在线等)怎么样将SqlServer中image类型的数据转换成图片,在转过程中出现问题.烦各位帮帮忙
- 求助 webBrowser 怎么获取分页内容
- ==请问合成图片的好做吗?==
- 请教WinForm关于TreeView同时写入一个ID值和显示值的问题
- 请推荐学习C#图形界面的书籍
- 请教高手:如何在.net里探测socket是否有数据可读
- Graphics 实例化 问题
- 我没倒分!!特来沌清事实,请大家看完我的聊天记录就明白了,来者有分,只想让大家知道事实的真像
- session.remove问题
- C#的datatable如何重新load部分数据?
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
using System.Security.Cryptography;namespace LCG
{
/// <summary>
/// 说明:本加密算法采用对称加密算法中的Rijndael算法,采用128位加密方式
/// </summary>
public class Security
{
//定义一个对称加密的对象,它是一个基类的对象
static private SymmetricAlgorithm cryptoProvider;
static private SymmetricAlgorithm cryptoProvider1;
//定义一个内存读取的对象
static private MemoryStream memoryStream;
static private FileStream fileStream;
//定义一个加密用的写入流对象
static private CryptoStream memoryCrytoStreamWriter; //定义一个加密/解密用的传输流对象
static private ICryptoTransform memoryTransform; //定义一个解密用的读出流对象
static private CryptoStream memoryCrytoStreamReader; //定义一个BinaryWriter对象
static private BinaryWriter binaryWriter; //定义一个StreamWriter对象
static private StreamWriter streamWriter; //定义一个StreamReader对象
static private StreamReader streamReader; //加密/解密时用的key
static private System.Text.UnicodeEncoding Enc = new UnicodeEncoding ();
static private string str = "WHAT";
static private byte[] key = {11, 2, 7, 24, 16, 22, 4, 3}; //加密/解密时用的初始向量
static private byte [] iv = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
static byte [] iv1 = {1, 2, 3, 4, 5, 6, 7, 8}; static private string feedbackString = null;
static private byte [] feedbackBytes; public Security()
{
//创建一个对称加密的实例,采用Rijndael加密算法
key = Enc.GetBytes(str);
iv1 = key;
cryptoProvider = SymmetricAlgorithm.Create("Rijndael");
cryptoProvider1 = SymmetricAlgorithm.Create("DES");
} //解密函数,输入一个待加密的字节数组。返回一个解密后的string对象的值
public string antiRijnDael(byte [] tempBytes)
{
//创建流对象的实例,同时将BinaryWriter对象插入MemoryStream对象中
memoryStream = new MemoryStream();
binaryWriter = new BinaryWriter(memoryStream); //创建解密时传输流的方法实例
memoryTransform = cryptoProvider.CreateDecryptor(key,iv); //将待解密的字节数组写入内存流中
binaryWriter.Write(tempBytes);
binaryWriter.Flush();
memoryStream.Position = 0; //实例化解密用的读出流
memoryCrytoStreamReader = new CryptoStream(memoryStream,memoryTransform,CryptoStreamMode.Read); //实例化StreamReader的对象,并将其插入解密读出流中
streamReader = new StreamReader(memoryCrytoStreamReader); //获取解密后的string值
feedbackString= streamReader.ReadToEnd(); //关闭流对象
memoryCrytoStreamReader.Close();
memoryStream.Close();
binaryWriter.Close();
//返回string值
return feedbackString;
} // 加密函数,输入一个待加密的string对象的值,返回一个加密的字节数组
public byte[] Rijndael(string tempString)
{
//创建流对象的实例
memoryStream = new MemoryStream();
//创建加密时传输流的方法实例
memoryTransform = cryptoProvider.CreateEncryptor(key,iv); //实例化加密用的写入流
memoryCrytoStreamWriter = new CryptoStream(memoryStream,memoryTransform,CryptoStreamMode.Write); //实例化StreamWriter的对象,并将其插入加密写入流中
streamWriter = new StreamWriter(memoryCrytoStreamWriter); //写入待加密的string值
streamWriter.Write(tempString);
streamWriter.Flush();
memoryCrytoStreamWriter.FlushFinalBlock(); //声明并实例化一个字节数组,其长度为加密后的数据的长度加二
feedbackBytes = new byte[memoryStream.Length+2]; //调用changeValue函数给feedbackBytes[0]和feedbackBytes[1]赋值
changeValue(memoryStream.Length,feedbackBytes);
memoryStream.Position = 0; //将加密后的数据读入feedbackBytes字节数组中的第2号到第memoryStream.Length+2好的位置段中
memoryStream.Read(feedbackBytes,2,(int)memoryStream.Length); //关闭流对象
memoryCrytoStreamWriter.Close();
memoryStream.Close();
streamWriter.Close(); //返回加密后的字节数组
return feedbackBytes;
} public static string fileAntiRijnDael(string filePath,int inPosition, out int outPosition)
{
//创建流对象的实例,同时将BinaryWriter对象插入MemoryStream对象中
fileStream = new FileStream(filePath,FileMode.OpenOrCreate,FileAccess.ReadWrite);
//创建解密时传输流的方法实例
memoryTransform = cryptoProvider1.CreateDecryptor(key,iv1);
//MessageBox.Show(fileStream.Length.ToString());
byte [] tempBytes = new byte[2];
fileStream.Seek(inPosition,0);
fileStream.Read(tempBytes,0,2);
int realLength = getValue(tempBytes);
int length = (realLength/8 + 1)*8;
fileStream.Seek(inPosition+2,0);
if ( fileStream.Length > fileStream.Position)
{
tempBytes = new byte[length];
fileStream.Read(tempBytes,0,length);
memoryStream = new MemoryStream();
memoryStream.Write(tempBytes,0,length);
memoryStream.Position = 0;
//实例化解密用的读出流
memoryCrytoStreamReader = new CryptoStream(memoryStream,memoryTransform,CryptoStreamMode.Read);
//MessageBox.Show(memoryCrytoStreamReader.Position.ToString()); //实例化StreamReader的对象,并将其插入解密读出流中
tempBytes = new byte [length];
memoryCrytoStreamReader.Read(tempBytes,0,length); //streamReader = new StreamReader(memoryCrytoStreamReader);
feedbackString = Enc.GetString(tempBytes,0,realLength); //获取解密后的string值
//feedbackChars = new char[length];
/*try
{
feedbackString = streamReader.ReadToEnd();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}*/
//关闭流对象
//MessageBox.Show(fileStream.Position.ToString());
memoryStream.Close();
memoryCrytoStreamReader.Close();
//streamReader.Close();
fileStream.Close();
//binaryWriter.Close();
//返回string值
outPosition = inPosition + length + 2;
return feedbackString;
}
fileStream.Close();
outPosition = inPosition + length + 2;
return null;
} //见下一贴
public static void fileRijnDael(string filePath,string tempString)
{
//创建流对象的实例
fileStream = new FileStream(filePath,FileMode.Append,FileAccess.Write);
byte [] EncrytBytes = Enc.GetBytes(tempString);
int strLength = EncrytBytes.Length;
feedbackBytes = new byte[2];
changeValue((long)strLength,feedbackBytes);
//MessageBox.Show(tempString.Length.ToString());
fileStream.Write(feedbackBytes,0,2); //创建加密时传输流的方法实例
fileStream.Close();
fileStream = new FileStream(filePath,FileMode.Append,FileAccess.Write);
memoryTransform = cryptoProvider1.CreateEncryptor(key,iv1); //实例化加密用的写入流
memoryCrytoStreamWriter = new CryptoStream(fileStream,memoryTransform,CryptoStreamMode.Write); //实例化StreamWriter的对象,并将其插入加密写入流中
//streamWriter = new StreamWriter(memoryCrytoStreamWriter); memoryCrytoStreamWriter.Write(EncrytBytes,0,strLength);
//写入待加密的string值
//streamWriter.Write(tempString);
//streamWriter.Flush();
memoryCrytoStreamWriter.FlushFinalBlock(); //关闭流对象
memoryCrytoStreamWriter.Close();
fileStream.Close();
//streamWriter.Close();
} //feedbackBytes[0],feedbackBytes[1]赋初值函数,用来确定在网络流中传输的字节数组的大小
private static void changeValue(long length,byte [] feedbackBytes)
{
long first;
long second = 0;
if ( length < 256)
{
//当加密后的数据的长度小于256时,赋初值如下
feedbackBytes[0] = Convert.ToByte(second.ToString());
feedbackBytes[1] = Convert.ToByte(length.ToString());
}
else
if ( length >= 256 && length < 65536)
{
//当加密后的数据的长度大于或等于256,赋初值的方法如下
first = length/256;
second = length%256;
feedbackBytes[0] = Convert.ToByte(first.ToString());
feedbackBytes[1] = Convert.ToByte(second.ToString());
}
} private static int getValue(byte[] tempBytes)
{
return Convert.ToInt16(tempBytes[0].ToString())*256 + Convert.ToInt16(tempBytes[1].ToString()); }
public static string dataCheck(string tempString)
{
int temp1 =200;
int temp2 =201;
int temp3 =3;
char replace1 = (char)temp1;
char replace2 = (char)temp2;
char replace3 = (char)temp3;
tempString = tempString.Replace("[",replace1.ToString());
tempString = tempString.Replace("]",replace2.ToString());
tempString = tempString.Replace("'",replace3.ToString());
return tempString; } public static string dataRevert(string tempString)
{
int temp1 =200;
int temp2 =201;
int temp3 =3;
char replace1 = (char)temp1;
char replace2 = (char)temp2;
char replace3 = (char)temp3;
tempString = tempString.Replace(replace1.ToString(),"[");
tempString = tempString.Replace(replace2.ToString(),"]");
tempString = tempString.Replace(replace3.ToString(),"'");
return tempString;
}
}
}