BouncyCastle提供了Threefish的实现,可以将调整作为参数:
ThreeFishEngine engine = new ThreeFishEngine(256);
engine.init(true, new TweakableBlockCipherParams(...));
但是,TweakableBlockCipherParams
与Java默认AlgorithmParameter
实例使用的Cipher
类型不兼容。
有没有办法通过调整来初始化这个密码?
Cipher cipher = Cipher.getInstance("Threefish-256/CBC/NoPadding");
cipher.init(???);
答案 0 :(得分:1)
如果您不想使用 tweak 参数,则只能通过Java的加密API使用Bouncy Castle的 Threefish 算法在加密期间。通过Java的API,您只能引入密钥和初始化向量参数,但这不会被用作调整参数(我解释了为什么在代码示例之后,见下文)。
此外,要使以下示例正常工作,您必须使用Java Cryptography Extension(JCE)无限强度管辖权策略文件更新您的JRE / JDK,您可以从here下载该文件。 Java 7和8有不同的版本。
如果您不想使用tweak参数,可以通过标准加密API使用Threefish算法。
static final BouncyCastleProvider PROVIDER = new BouncyCastleProvider();
public static void main(String[] args) throws Exception {
KeyGenerator kg = KeyGenerator.getInstance("Threefish-1024", PROVIDER);
kg.init(1024);
SecretKey key = kg.generateKey();
byte[] plaintext = "Hi! I'm cat!".getBytes();
byte[] ciphertext = encrypt(key, plaintext);
System.out.println(new String(decrypt(key, ciphertext)));
// prints "Hi! I'm cat!"
}
static byte[] encrypt(SecretKey key, byte[] plaintext) throws Exception {
return encryptOrDecrypt(true, key, plaintext);
}
static byte[] decrypt(SecretKey key, byte[] ciphertext) throws Exception {
return encryptOrDecrypt(false, key, ciphertext);
}
static byte[] encryptOrDecrypt(boolean encrypt, SecretKey key, byte[] bytes) throws Exception {
Cipher cipher = Cipher.getInstance("Threefish-1024/CBC/PKCS5Padding", PROVIDER);
// note that we are creating a dummy iv parameter, in this case it
// should be 128 bytes long, because if it's not an exception is raised
cipher.init(encrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[128]));
return cipher.doFinal(bytes);
}
我已经下载了带有调试符号from here的Bouncy Castle JAR并调试了上述代码。在Threefish.init
和变量Cipher.init
中调用params
将成为KeyParameter
的实例,而不是TweakableBlockCipherParameters
。因此,tweakBytes
将为空,并且在加密期间不会被使用。
了解这一点,现在无法使用Java API将tweak参数提供给底层的Threefish密码引擎。