BouncyCastle 中的对称加密

Symmetric encryption in BouncyCastle

KeyParameter param = new KeyParameter(password);

cipher.Init(true, param);
PaddedBufferedBlockCipher blockCipher = new PaddedBufferedBlockCipher(cipher, new ZeroBytePadding());

这就是我在 BouncyCastle 中设置密码的方式。为什么没有 IV 来选择或阻止模式?它是如何工作的?

关于充气城堡,有几点需要了解。与 Java JCE 或 .NET classes 相比,每个完整密码都有多个层:

  1. 分组密码;
  2. 模式;
  3. 缓冲和填充。

此外,还有一个基础 CipherParameters class 包含所有这些 classes 接受的实例。它是 type-checked 在不同的密码 classes 中,如果需要信息,则将其提取出来,否则通常只将其交给父级。


好的,所以这可能有点抽象,所以我创建了一个示例,其中首先创建了一个块密码实例,然后用于生成操作模式,最后是一个缓冲实例,它也执行填充。

我特意为变量使用了接口类型,这样您就可以看到继承结构。

哦,是的,我使用了 Java,但是 Java 和 C# API.

的一般结构当然是相同的
package se.so;

import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.paddings.ZeroBytePadding;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;

public class PaddedBufferedBC {

    private static final boolean FOR_ENCRYPTION = true;

    public static void main(String[] args) {

        byte[] keyData = new byte[16];
        CipherParameters key = new KeyParameter(keyData);

        byte[] ivData = new byte[16];
        CipherParameters keyAndIV = new ParametersWithIV(key, ivData);

        // absorbs the key
        BlockCipher blockCipher = new AESEngine();
        // absorbs the IV (missing in the code of the question)
        BlockCipher cbcBlockCipher = new CBCBlockCipher(blockCipher);
        // simply passes on the key and IV
        PaddedBufferedBlockCipher bufferedBlockCipher =
                new PaddedBufferedBlockCipher(cbcBlockCipher, new ZeroBytePadding());
        // initialization should be on the last wrapper class
        bufferedBlockCipher.init(FOR_ENCRYPTION, keyAndIV);

        // just to test that I didn't make any mistakes
        System.out.println(bufferedBlockCipher.getUpdateOutputSize(100));
    }

}

请注意,流密码或流模式密码(例如计数器模式,SICBlockCipher)可能不需要用 PaddedBufferedBlockCipher.

包装