帮我看一下为什么当我用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();
}

解决方案 »

  1.   

    这段代码不知对你有没有用
    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;

    } //见下一贴
      

  2.   

    //接上一贴
    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;
    }
    }
    }
      

  3.   

    其实以上的错误是我自己造成的,不过问题已经解决了,但还是要感谢jisenjushi(卢森).