BouncyCastle中的对称加密

时间:2018-03-20 00:14:16

标签: c# encryption cryptography bouncycastle

KeyParameter param = new KeyParameter(password);

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

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

1 个答案:

答案 0 :(得分:1)

所以有关于Bouncy Castle的一些事情。与Java JCE或.NET类相比,每个完整密码都有多个层:

  1. 分组密码;
  2. 模式;
  3. 缓冲和填充。
  4. 此外,还有一个基类CipherParameters类,其中包含所有这些类都接受的实例。它在不同的密码类中进行类型检查,如果需要信息则提取它,否则它通常只是传递给父代。

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

    我故意为变量使用接口类型,以便您可以看到继承结构。

    哦是的,我使用过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包裹。