【问题标题】:replace JCE with Bouncycastle jar用 Bouncycastle jar 替换 JCE
【发布时间】:2014-10-02 05:54:43
【问题描述】:

我必须摆脱 JCE jar,应该用 bouncy castle jar 替换以进行 AES 加密和解密。

当我将 JCE 策略 jar 替换为 AES 256 算法的 BC jar 时,我得到了无效的密钥大小异常。但它适用于密钥大小 128。

如果是 AES 256 算法,我如何使用 BC 罐子。

谢谢。

【问题讨论】:

  • 请添加更多细节。你是如何替换 jce.jar 的,为什么? Bouncy 有一个 Java 加密实现来添加/替换 Java,但这仅适用于 Java 1.2、1.3 - Java 的旧版本。
  • 我们正在将应用程序中的 java 版本从 java 6 升级到 java 7。通过指定 jdk 版本号,java 安装是通过脚本自动完成的。我们必须替换特定于 Java 7 的策略 JCE jar 而不是 java6。所以我们在每次升级过程中都认为,如果我们在类路径中提供 bouncy castle jars 就足以用于 AES 256 加密,我们不需要替换 JCE jars。
  • 限制在Cipher 类中。虽然我不确定你不能做你想做的事,但我不认为你走在正确的道路上。
  • 我们能否仅使用 BC jar 来执行 AES 256 加密,而不覆盖 jdk lib 文件夹中的 JCE 策略 jar。我尝试按照链接进行操作,但 wiki 页面本身已从 BC 网站下载。 stackoverflow.com/questions/12895031/…
  • 是的,你可以,但你不能使用Cipher 或任何依赖它的类。相反,您可以使用“轻量级 API”,即直接调用像 BufferedBlockCipher 和相关的 Bouncy Castle 类。当然,这也不允许在需要Cipher 的更高级别协议中使用 AES。

标签: java encryption cryptography aes bouncycastle


【解决方案1】:

此答案假定无法使用提到的脚本安装unlimited strength jurisdictional cryptography files


Cipher 的密钥大小限制在 Cipher 类本身中。绕过它是不可能的。

相反,您可以使用 Bouncy Castle 轻量级 API。对于 API 实现本身所需的类数量而言,轻量级 API 是轻量级的,但对您而言并不多。

例如(带有 PKCS#7(PKCS#5 兼容)填充的 AES CBC:

public class BouncyLightWeightCipherExample {

    private static final boolean FOR_DECRYPTION = false;

    public static void main(String[] args) throws NoSuchAlgorithmException, Exception {
        final byte[] keyData = new byte[256 / Byte.SIZE];
        final byte[] ivData = new byte[16];
        final byte[] testData = "owlstead".getBytes(UTF_8);

        // JCE creation
        final Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");

        // initialization
        c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyData, "AES"), new IvParameterSpec(ivData));

        // and encryption
        final byte[] ciphertext = c.doFinal(testData);

        // Bouncy Castle creation
        final BlockCipher blockCipher = new AESFastEngine();
        final CBCBlockCipher withModeOfOperation = new CBCBlockCipher(blockCipher);
        final PaddedBufferedBlockCipher withPadding = new PaddedBufferedBlockCipher(withModeOfOperation);

        // initialization
        final ParametersWithIV keyAndIV = new ParametersWithIV(new KeyParameter(keyData), ivData);
        withPadding.init(FOR_DECRYPTION, keyAndIV);

        // and decryption
        int plaintextSize = withPadding.processBytes(ciphertext, 0, ciphertext.length, ciphertext, 0);
        plaintextSize += withPadding.doFinal(ciphertext, plaintextSize);
        final byte[] plaintext = Arrays.copyOf(ciphertext, plaintextSize);

        // there we are
        System.out.println(new String(plaintext, UTF_8));
    }
}

【讨论】:

  • 像往常一样,这是一个出色而彻底的答案。但是,从 cmets 和他的后续问题来看,我不确定 OP 是否理解他需要使用 // Bouncy Castle creation 及以下的示例重写他的代码,并且 必须 丢弃使用 JCE 类的代码.
  • 非常感谢 owlstead
【解决方案2】:

要使用 AES 256 进行加密,您必须使用“Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files”。有 2 个 jar,local_policy.jar 和 US_export_policy.jar。

您可以从 oracle 网站获取这些文件。

一旦您有了这些 jar,请将“your_java_installation_directory/jre/lib/security”jar 替换为这些。

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    相关资源
    最近更新 更多