使用C#和RSA加密/解密文件

时间:2013-10-23 14:59:31

标签: c# rsa

我正在尝试使用RSA和C#加密然后解密XML文件,虽然我真的很接近,但是有一个问题。一旦它被解密,几乎所有的文件都在那里,但最后还是有一个打嗝。它或者是文件末尾的间隙,或者更多数据附加到文件的最后。

这是我的加密方法:

    public static bool Encrypt(ProcessingHolder ph)
    {
        FileInfo inFile = ph.encryptedFI;
        FileInfo outFile = ph.unEncryptedFI;

        X509Certificate2 daCert = new X509Certificate2(keyFP, daCertPassword);
        RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)daCert.PrivateKey;

        bool done = false;
        FileStream fs = null;
        FileStream fso = null;

        try
        {
            //opens the file to encrypt into a filestream object
            fs = inFile.OpenRead();

            //240 is what the iOS side is using
            //algorithm that calculates max bytes ((KeySize - 384) / 8) + 37 
            //(returns 245)
            int chunkSize = 245;

            fso = outFile.OpenWrite();
            byte[] buffer = new byte[chunkSize];
            int totalRead = 0;


            while (totalRead < fs.Length)
            {
                int readBytes = fs.Read(buffer,0, chunkSize);

                totalRead += readBytes;

                //check to see if the final chunk of data is less than 245 so as not to write empty buffer
                if (readBytes < chunkSize) buffer = new byte[readBytes];
                //byte[] encr = new byte[readBytes];

                //actual encryption
                //encr = RSA.Encrypt(buffer, false);

                byte[] encr = RSA.Encrypt(buffer, false);
                fso.Write(encr, 0, encr.Length);
            }
            fso.Flush();
            fso.Close();
            fs.Close();
            done = true;
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Decrypt failed with message " + ex.Message);
            done = false;
        }
        finally
        {
            if (fs != null) fs.Close();
            if (fso != null) fso.Close();
        }
        return done;
    }
}

这是我的解密方法:

    public static bool Decrypt(ProcessingHolder ph)
    {
        FileInfo inFile = ph.encryptedFI;
        FileInfo outFile = ph.unEncryptedFI;

        X509Certificate2 daCert = new X509Certificate2(keyFP, daCertPassword);
        RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)daCert.PrivateKey;

        bool done = false;
        FileStream fs = null;
        FileStream fso = null;

        try
        {
            fs = inFile.OpenRead();
            int chunkSize = 256;

            fso = outFile.OpenWrite();
            byte[] buffer = new byte[chunkSize];
            int totalRead = 0;

            while (totalRead < fs.Length)
            {
                int readBytes = fs.Read(buffer, 0, chunkSize);
                totalRead += readBytes;

                //check to see if the final chunk of data is less than 245 so as not to write empty buffer
                //if (readBytes < chunkSize) buffer = new byte[readBytes];

                byte[] decr = RSA.Decrypt(buffer, false);
                fso.Write(decr, 0, decr.Length);
            }
            fso.Flush();
            fso.Close();
            fs.Close();
            done = true;
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Decrypt failed with message " + ex.Message);
            done = false;
        }
        finally
        {
            if (fs != null) fs.Close();
            if (fso != null) fso.Close();
        }
        return done;
    }
在这里,我的头靠在墙上,先谢谢

1 个答案:

答案 0 :(得分:0)

如果文件不是块大小长度的倍数,加密过程中会发生什么? IE浏览器。一个500字节长的文件会读取两组245,但它们还剩下10个字节?这可能会丢失最后几个字节或添加额外的值?

也许您需要在文件中添加一个标题,其中包含解密文件的字节大小,以便解密器知道停止的位置以及在加密期间填充最后一个块的方法