KeyParameter param = new KeyParameter(password);
cipher.Init(true, param);
PaddedBufferedBlockCipher blockCipher = new PaddedBufferedBlockCipher(cipher, new ZeroBytePadding());
这就是我在BouncyCastle中设置密码的方法。怎么没有IV来选择或阻止模式?它是如何工作的?
答案 0 :(得分:1)
所以有关于Bouncy Castle的一些事情。与Java JCE或.NET类相比,每个完整密码都有多个层:
此外,还有一个基类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
包裹。