我可以使用标准Java Cipher API使用BouncyCastle的Tweakable Block Ciphers吗?

时间:2015-05-28 01:13:38

标签: java encryption bouncycastle

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(???);

1 个答案:

答案 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密码引擎。

<子> Link to another very similar question