哪位高手能帮忙解决一下这个问题
在这个类里面可以加密但解密时就出错误了 temp = rsac.Decrypt(temp,false );(不正确的数据) namespace crypto
{
    /// <summary>
    /// 非对称RSA
    /// </summary>
    public class RSA_
    {
        private RSACryptoServiceProvider rsa;
        public RSA_()
        {
            rsa = new RSACryptoServiceProvider(1024);
        }
        /// <summary>
        /// 得到公钥
        /// </summary>
        /// <returns></returns>
        public string GetPublicKey()
        {
            return rsa.ToXmlString(false);
        }
        /// <summary>
        /// 得到私钥
        /// </summary>
        /// <returns></returns>
        public string GetPrivateKey()
        {
            return rsa.ToXmlString(true);
           
        }
       
        ///// <summary>
        ///// 加密
        ///// </summary>
        ///// <param name="inFileName">待加密文件路径</param>
        ///// <param name="outFileName">加密后文件路径</param>
        ///// <param name="PublicKey">公钥</param>
        public void Encrypt(string inFileName, string outFileName)
        {
           
            //字节缓冲区定为64(密钥为1024),最大长度为(rsac.KeySize/8   -   11)   
            byte[] src = new byte[64];
            //Encrypt.cs是要加密的文件   
            FileStream fs = new FileStream(@inFileName , FileMode.Open, FileAccess.Read);
            //Result.txt存储的是加密之后的数据   
            FileStream res = new FileStream(@outFileName , FileMode.Create, FileAccess.Write);
            int len;
            //加密   
            while ((len = fs.Read(src, 0, 64)) > 0)
            {
                byte[] temp = new byte[len];
                Array.Copy(src, 0, temp, 0, len);
                temp = rsa.Encrypt(temp, false);
                res.Write(temp, 0, temp.Length);
            }
            fs.Close();
            res.Close();
            //存储密钥到文件,以便解密用。   
            StreamWriter sw = new StreamWriter("RSA.key");
            sw.Write(rsa.ToXmlString(true));
            sw.Close();   
        }        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="Source">待解密字符串</param>
        /// <param name="PrivateKey">私钥</param>
        /// <returns></returns>
        public string Decrypt(string Source, string PrivateKey)
        {
            rsa.FromXmlString(PrivateKey);
            byte[] done = rsa.Decrypt(Convert.FromBase64String(Source), false);
            return Convert.ToBase64String(done);
        }
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="Source">待解密字符数组</param>
        /// <param name="PrivateKey">私钥</param>
        /// <returns></returns>
        public byte[] Decrypt(byte[] Source, string PrivateKey)
        {
            rsa.FromXmlString(PrivateKey);
            return rsa.Decrypt(Source, false);
        }
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="inFileName">待解密文件路径</param>
        /// <param name="outFileName">解密后文件路径</param>
        /// <param name="PrivateKey">私钥</param>
        public void Decrypt(string inFileName, string outFileName, string PrivateKey)
        {
    
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            //读密钥   
            StreamReader sr = new StreamReader("RSA.key");
            String str = sr.ReadToEnd();
            sr.Close();
            rsac.FromXmlString(str);            byte[] src = new byte[64];            FileStream fs = new FileStream(@inFileName , FileMode.Open, FileAccess.Read);
            FileStream res = new FileStream(@outFileName , FileMode.Create, FileAccess.Write);
            int len;
            //解密   
            while ((len = fs.Read(src, 0,64)) > 0)
            {
                byte[] temp = new byte[len];
                Array.Copy(src, 0, temp, 0, len);
                temp = rsa.Decrypt(temp,false );
                res.Write(temp, 0, temp.Length);
            }
            fs.Close();
            res.Close();           }

解决方案 »

  1.   

    解密的时候不能以64字节读取,改成128就行了
    ///   <summary> 
    ///   解密 
    ///   </summary> 
    ///   <param   name= "inFileName "> 待解密文件路径 </param> 
    ///   <param   name= "outFileName "> 解密后文件路径 </param> 
    ///   <param   name= "PrivateKey "> 私钥 </param> 
    public void Decrypt(string inFileName, string outFileName, string PrivateKey)
    {    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        //读密钥       
        StreamReader sr = new StreamReader("E:\\RSA.key");
        String str = sr.ReadToEnd();
        sr.Close();
        rsa.FromXmlString(str);    byte[] src = new byte[128];    FileStream fs = new FileStream(@inFileName, FileMode.Open, FileAccess.Read);
        FileStream res = new FileStream(@outFileName, FileMode.Create, FileAccess.Write);
        int len;
        //解密       
        while ((len = fs.Read(src, 0, 128)) > 0)
        {
            byte[] temp = new byte[len];
            Array.Copy(src, 0, temp, 0, len);
            temp = rsa.Decrypt(temp, false);
            res.Write(temp, 0, temp.Length);
        }
        fs.Close();
        res.Close();
    }