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 相比,每个完整密码都有多个层:
- 分组密码;
- 模式;
- 缓冲和填充。
此外,还有一个基础 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
.
包装
KeyParameter param = new KeyParameter(password);
cipher.Init(true, param);
PaddedBufferedBlockCipher blockCipher = new PaddedBufferedBlockCipher(cipher, new ZeroBytePadding());
这就是我在 BouncyCastle 中设置密码的方式。为什么没有 IV 来选择或阻止模式?它是如何工作的?
关于充气城堡,有几点需要了解。与 Java JCE 或 .NET classes 相比,每个完整密码都有多个层:
- 分组密码;
- 模式;
- 缓冲和填充。
此外,还有一个基础 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
.