实施充气城堡加密/解密的问题 [英] Problem implementing bouncy castle encryption/decryption

查看:92
本文介绍了实施充气城堡加密/解密的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用充气城堡库实现加密和解密。在方法1中,我很难指定填充,我无法动态指定加密模式。在方法2中,我设法指定填充,但我没有设法指定加密模式,所以我猜它使用的是ECB。我拿了一些随机文本文件来加密和解密。但这两种方法似乎都有错误。使用方法1,它似乎添加了原始文本的额外字节/字符,就像填充原始文本一样。并且方法2在解密时不显示完整的消息,则缺少文本。所以我试着做一个.DoFinal()函数,但这只是给我一个错误信息,说Pad Block已损坏。必须以某种方式指定填充和加密模式,甚至可能是动态的。但是大多数示例都是Java中没有直接转换为C#的示例。欢迎所有投入。



我尝试过:



I am trying to implement encryption and decryption with the bouncy castle library. In Method 1 I struggle to specify a padding and I cannot dynamically specify the encryption mode. In Method 2 I managed to specify a padding but I did not manage to specify an encryption mode so I guess it is using ECB. I took some random text file to encrypt and decrypt. But both methods seems to have an error. With Method 1 it seems to add extra bytes/characters of the original text like it was padding with the raw text. And with method 2 when it decrypts it does not display the full message there is text which is missing. So I tried to do a .DoFinal() function but that just gives me an error message which says Pad Block corrupted. There must somehow be a way of specifying a padding and a encryption mode, perhaps even dynamically. However most examples are in Java which do not directly translate to C#. All input welcome.

What I have tried:

<pre>
private void button1_Click(object sender, EventArgs e)
        {
            FileStream varFileStreamInput, varFileStreamOutput;
            Byte[] varInBuffer, varOutBuffer;
            varInBuffer = new Byte[16];
            varOutBuffer = new Byte[16];
            Int32 varBytesRead, varProcessedBytes;

            //Method.1
            //Key Generation with IV.
            PbeParametersGenerator varKeyGenerator = new Pkcs12ParametersGenerator(new Sha256Digest());            
            varKeyGenerator.Init(Encoding.ASCII.GetBytes(varPassword), Encoding.ASCII.GetBytes(varSalt), 10240);
            ParametersWithIV varParmWithIV = (ParametersWithIV)varKeyGenerator.GenerateDerivedParameters("AES128", 128, 128);

            //Init of Block Cipher with engine type and parameters but no padding.
            Org.BouncyCastle.Crypto.Modes.CbcBlockCipher varCBCBlckCpher = new CbcBlockCipher(new AesEngine());
            varCBCBlckCpher.Init(true, varParmWithIV);
            
            //Encrypt
            varFileStreamInput = new FileStream(@"C:\Temp12\Test1.txt", FileMode.Open);
            varFileStreamOutput = new FileStream(@"C:\Temp12\Test1.txt.enc", FileMode.Create);

            varBytesRead = varProcessedBytes = 0;
            while (varFileStreamInput.Position != varFileStreamInput.Length)
            {
                varBytesRead = varFileStreamInput.Read(varInBuffer, 0, 16);
                varProcessedBytes = varCBCBlckCpher.ProcessBlock(varInBuffer, 0, varOutBuffer, 0);
                varFileStreamOutput.Write(varOutBuffer, 0, varProcessedBytes);
            }            
            varFileStreamOutput.Flush();
            varFileStreamOutput.Close();
            varFileStreamInput.Close();


            //Open files again for decryption, to test if encryption worked correctly.
            varCBCBlckCpher.Init(false, varParmWithIV);
            varFileStreamInput = new FileStream(@"C:\Temp12\Test1.txt.enc", FileMode.Open);
            varFileStreamOutput = new FileStream(@"C:\Temp12\Test1.txt.dec", FileMode.Create);

            varBytesRead = varProcessedBytes = 0;
            while (varFileStreamInput.Position != varFileStreamInput.Length)
            {
                varBytesRead = varFileStreamInput.Read(varInBuffer, 0, 16);
                varProcessedBytes = varCBCBlckCpher.ProcessBlock(varInBuffer, 0, varOutBuffer, 0);
                varFileStreamOutput.Write(varOutBuffer, 0, varProcessedBytes);
            }            
            varFileStreamOutput.Flush();
            varFileStreamOutput.Close();
            varFileStreamInput.Close();

            //--------------------------------------------------------------------------------------------------------------------------

            //Method.2
            //Key Generation without IV.
            Org.BouncyCastle.Crypto.ICipherParameters varICphrParm = varKeyGenerator.GenerateDerivedParameters("AES128", 128);
            BufferedBlockCipher varBufferedBlockCipher = new PaddedBufferedBlockCipher(new AesEngine(), new Pkcs7Padding());
            varBufferedBlockCipher.Init(true, varICphrParm);

            varFileStreamInput = new FileStream(@"C:\Temp12\Test1.txt", FileMode.Open);
            varFileStreamOutput = new FileStream(@"C:\Temp12\Test2.txt.enc", FileMode.Create);

            varBytesRead = varProcessedBytes = 0;

            while (varFileStreamInput.Position != varFileStreamInput.Length)
            {
                varBytesRead = varFileStreamInput.Read(varInBuffer, 0, 16);
                varProcessedBytes = varBufferedBlockCipher.ProcessBytes(varInBuffer, varOutBuffer, 0);
                varFileStreamOutput.Write(varOutBuffer, 0, varProcessedBytes);
            }
            varFileStreamOutput.Flush();
            varFileStreamOutput.Close();
            varFileStreamInput.Close();

            //Open files again for decryption, to test if encryption worked correctly.
            varBufferedBlockCipher.Init(false, varICphrParm);

            varFileStreamInput = new FileStream(@"C:\Temp12\Test2.txt.enc", FileMode.Open);
            varFileStreamOutput = new FileStream(@"C:\Temp12\Test2.txt.dec", FileMode.Create);

            varBytesRead = varProcessedBytes = 0;

            while (varFileStreamInput.Position != varFileStreamInput.Length)
            {
                varBytesRead = varFileStreamInput.Read(varInBuffer, 0, 16);
                varProcessedBytes = varBufferedBlockCipher.ProcessBytes(varInBuffer, varOutBuffer, 0);
                varFileStreamOutput.Write(varOutBuffer, 0, varProcessedBytes);
            }
            //varOutBuffer = varBufferedBlockCipher.DoFinal(varInBuffer); <-- Error here Pad Block corrupted.
            //varFileStreamOutput.Write(varOutBuffer, 0, varProcessedBytes);

            varFileStreamOutput.Flush();
            varFileStreamOutput.Close();
            varFileStreamInput.Close();
        }

推荐答案

我测试了下面的代码,它似乎适用于CBC和PKSC7 Padding以及一个密钥生成器密钥和IV。

I have tested the code below and it seems to work for CBC and PKSC7 Padding and a key generator for the key and the IV.
FileStream varFileStreamInput, varFileStreamOutput;
            Byte[] varInBuffer, varOutBuffer;
            varInBuffer = new Byte[1000];
            varOutBuffer = new Byte[1000];
            Int32 varBytesRead;

            //Method.3
            //Key Generation with IV.
            PbeParametersGenerator varKeyGenerator = new Pkcs12ParametersGenerator(new Sha256Digest());
            varKeyGenerator.Init(Encoding.ASCII.GetBytes(varPassword), Encoding.ASCII.GetBytes(varSalt), 10240);
            ParametersWithIV varParmWithIV = (ParametersWithIV)varKeyGenerator.GenerateDerivedParameters("AES128", 128, 128);

            //Init of Block Cipher with engine type and parameters but no padding.
            Org.BouncyCastle.Crypto.BufferedBlockCipher varBufBlckCipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(new AesEngine()), new Pkcs7Padding());
            varBufBlckCipher.Init(true, varParmWithIV);

            //Encrypt
            varFileStreamInput = new FileStream(@"C:\Temp12\Test1.txt", FileMode.Open);
            varFileStreamOutput = new FileStream(@"C:\Temp12\Test3.txt.enc", FileMode.Create);

            varBytesRead = 0;
            while (varFileStreamInput.Position != varFileStreamInput.Length)
            {
                varBytesRead = varFileStreamInput.Read(varInBuffer, 0, 1000);
                varOutBuffer = varBufBlckCipher.ProcessBytes(varInBuffer, 0, varBytesRead); // ProcessBlock(varInBuffer, 0, varOutBuffer, 0);
                varFileStreamOutput.Write(varOutBuffer, 0, varOutBuffer.Length);
            }
            varOutBuffer = varBufBlckCipher.DoFinal();
            varFileStreamOutput.Write(varOutBuffer, 0, varOutBuffer.Length);

            varFileStreamOutput.Flush();
            varFileStreamOutput.Close();
            varFileStreamInput.Close();


            //Open files again for decryption, to test if encryption worked correctly.
            varBufBlckCipher.Init(false, varParmWithIV);
            varFileStreamInput = new FileStream(@"C:\Temp12\Test3.txt.enc", FileMode.Open);
            varFileStreamOutput = new FileStream(@"C:\Temp12\Test3.txt.dec", FileMode.Create);

            varBytesRead = 0;
            while (varFileStreamInput.Position != varFileStreamInput.Length)
            {
                varBytesRead = varFileStreamInput.Read(varInBuffer, 0, 1000);
                varOutBuffer = varBufBlckCipher.ProcessBytes(varInBuffer, 0, varBytesRead); // ProcessBlock(varInBuffer, 0, varOutBuffer, 0);
                varFileStreamOutput.Write(varOutBuffer, 0, varOutBuffer.Length);
            }
            varOutBuffer = varBufBlckCipher.DoFinal();
            varFileStreamOutput.Write(varOutBuffer, 0, varOutBuffer.Length);

            varFileStreamOutput.Flush();
            varFileStreamOutput.Close();
            varFileStreamInput.Close();


这篇关于实施充气城堡加密/解密的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆