c# - 如何在使用 Bouncy CaSTLe 加密之前填充数据

标签 c# cryptography aes

我正在尝试使用 AES 算法和 CBC 模式来加密我的数据。为此,我使用 .Net 库“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;

    }

当我尝试输入不是 16 的倍数时,出现异常。当我用左边为零的数字 (16-length%16) 向右填充数组时,我可以得到一个结果。但结果对我来说也是一个问题。它给了我这样的结果:

[0][0][0][0[111][22][33][44][66][77][33][12][32][23][0][0][0][0][0] 

左边和右边都为零。

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

最佳答案

Bouncy CaSTLe 会为您填充,开始时您需要将密码设置为:

  PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(engine), new Pkcs7Padding());

要使其余代码正常工作,需要使用 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);

我有一个使用 AES-GCM in Bouncy Castle on CodeReview 的简单示例

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

我还有一个高级加密框架的 C# 端口,Kecyzar ,我使用 Bouncy CaSTLe 作为后端,尽管这是一个更难的例子,抽象的加密代码 SymmetricStreamBouncyAesKey 中设置为使用 AES-CBC

关于c# - 如何在使用 Bouncy CaSTLe 加密之前填充数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13357758/

相关文章:

c# - (object) 是一个 'field' 但像 'type' 一样使用

c# - .Net 中的清理与内存回收

encryption - 具有任意长度明文的 AES 测试向量

cryptography - Java 卡 : domain parameters for key agreement?

objective-c - 如何使用带 AES 加密的十六进制十进制 key ?

c# - 创建新的调度程序

c# - 将 ASP.NET MVC 项目部署到服务器

c# - 如何检查 Asp.NET 应用程序是否支持 FIPS

encryption - 我们可以使用 key 作为 AES 的 IV 吗?

c - 用 C 测试 AES 算法实现