繁体   English   中英

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

[英]Encrypting/Decrypting a file using C# and 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;
    }

在这里,我的头撞在墙上,谢谢

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

也许您需要向文件添加标头,其大小为解密文件的字节数,以便解密器知道在加密期间在哪里停止以及填充最终块的方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM