如何在使用Bouncy Castle加密之前填充数据

ikb*_*bal 5 c# cryptography aes

我正在尝试使用带有CBC模式的AES算法加密我的数据.出于这个原因,我使用.Net Library'Bouncy Castle'.我没有加密的背景,所以我试图以一种简单的方式使用它.这是我的加密代码

public byte[] encrypt(byte[] key, byte[] iv,byte[] data) 
    {
        IBlockCipher engine=new AesFastEngine();
        KeyParameter keyParam = new KeyParameter(key);
        CbcBlockCipher cipher = new CbcBlockCipher(engine);

        ICipherParameters parameters = new ParametersWithIV(keyParam, iv);

        byte[] output=new byte[16+data.Length];
        cipher.Init(true, parameters);
        cipher.ProcessBlock(data, 0, output, data.Length);

        //process output
        byte[] cipherArray = new byte[data.Length];
        /*
        int k=0;
        for (int i = 0; i < output.Length; i++) 
        {
            if (output[i]!= 0) 
            {
                cipherArray[k++] = output[i];
            }
        }
         */
        return cipherArray;

    }
Run Code Online (Sandbox Code Playgroud)

当我尝试的输入不是16的乘法时,我得到一个例外.当我用右边的数字(16长度%16)向右填充数组时,我可以得到一个结果.但结果对我来说也是一个问题.它给我一个这样的结果:

[0][0][0][0[111][22][33][44][66][77][33][12][32][23][0][0][0][0][0] 
Run Code Online (Sandbox Code Playgroud)

左右两边都是零.

我认为这可能与我使用ProcessBlock(data, 0, output, data.Length)功能有关.我使用它假设输出将是我的加密文本,但似乎输出应该比输入长度更长.由于我没有关于此功能的文档,我可能以错误的方式使用它.任何帮助,将不胜感激

jbt*_*ule 5

Bouncy Castle 会为你做填充,首先你需要将你的密码设置为:

  PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(engine), new Pkcs7Padding());
Run Code Online (Sandbox Code Playgroud)

要使您的其余代码正常工作,需要使用cipher.GetOutputSize(data.Length) ProcessBytesDoFinal因此正确添加了填充。

byte[] output = new byte[cipher.GetOutputSize(data.Length)];
int len = cipher.ProcessBytes(data, 0, data.Length, output, 0);
cipher.DoFinal(output, len);
Run Code Online (Sandbox Code Playgroud)

我有一个关于在 CodeReview 上的 Bouncy Castle中使用AES-GCM的简单示例

AES-GCM增加了认证加密,但是使用api的基本原理是一样的。

我还有一个高级加密框架Kecyzar的 C# 端口,我使用 Bouncy Castle 作为后端,虽然这是一个更难的例子,但抽象的加密代码SymmetricStream是为在BouncyAesKey 中使用 AES-CBC设置的