java - 使用第三方 Java 库重新实现 AES 加密,不受美国法律限制

标签 java bouncycastle jce

我使用标准 Java 工具和针对特定 AES 算法的 BouncyCaSTLe 提供程序,通过某些特定于任务的参数实现了 AES 加密。

这是代码:

private byte[] aesEncryptedInfo(String info) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidParameterSpecException, InvalidAlgorithmParameterException, NoSuchProviderException {
    Security.addProvider(new BouncyCastleProvider());
    SecretKey secret = new SecretKeySpec(CUSTOMLONGSECRETKEY.substring(0, 32).getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
    cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(VECTOR_SECRET_KEY.getBytes()));
    return cipher.doFinal(info.getBytes("UTF-8"));
}

在某些环境中,此代码需要特殊的策略文件。查看相关问题:InvalidKeyException Illegal key size

我的目标是使用第三方库重新实现它,理想情况下我会使用已经用作提供程序的充气城堡。该库不应对标准 java 策略文件有任何限制。换句话说,不应该有任何限制。

请在您的答案中建议如何使用 BouncyCaSTLe 或其他第三方库重新实现它,这些库可以在没有提到的限制的情况下工作。理想情况下我会看到代码:-)

非常感谢您的阅读!

经过一段时间的延迟,我现在很高兴发布解决方案。希望有人可以从中受益,因为 Bouncy CaSTLe 文档中没有包含很多示例:-)

private byte[] aesEncryptedInfo(String info)
// Creating AES/CBC/PKCS7Padding cipher with specified Secret Key and Initial Vector
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()), new PKCS7Padding());
cipher.init(true, new ParametersWithIV(new KeyParameter(CUSTOMLONGSECRETKEY.getBytes()), VECTOR_SECRET_KEY.getBytes()));

byte[] inputData = info.getBytes("UTF-8");
int outBlockSize = cipher.getOutputSize(inputData.length);
byte[] outputData = new byte[outBlockSize];

int outLength = cipher.processBytes(inputData, 0, inputData.length, outputData, 0);
outLength += cipher.doFinal(outputData, outLength);
if (outLength != outBlockSize) {
    return Arrays.copyOf(outputData, outLength);
}
else {
    return outputData;
}    

}

顺便说一句,我发现 Java API 和 Bouncy CaSTLe API 之间有两个区别: 1. Bouncy CaSTLe 使用对象组合来创建所需的密码。而Java API使用字符串来识别所需的密码。 2. BC加密代码稍大,而Java API代码更紧凑。

该解决方案完全替代了原始 Java API 实现 - 证明是我制作的自定义单元测试。

最佳答案

直接使用 BouncycaSTLe 轻量级加密 API,而不是通过 Java JCE 接口(interface)。 BouncycaSTLe 包含自己的加密 API,可通过 org.bouncycaSTLe.* 包中的各种类访问。它还实现了 JCE 提供程序接口(interface),以便通过标准 JCE 类(例如 CipherKeyGenerator 等)提供一些加密实现。

加密策略限制由 JCE 类强制执行,而不是由 bouncycaSTLe 强制执行。因此,如果您不使用这些类,您将不会遇到任何限制。缺点是你会牺牲一些可移植性。首先,请查看 AESEngine 的 javadoc类,以及 javadocs for the bouncycastle 的其余部分.

关于java - 使用第三方 Java 库重新实现 AES 加密,不受美国法律限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3870784/

相关文章:

c# - 如何使用 .Net Core 创建 PKCS#7 分离签名?

java - Java BouncyCaSTLe 中的确定性 AES-CTR?

java - 将 org.bouncycaSTLe.jce.PKCS10CertificationRequest 更新为 org.bouncycaSTLe.pkcs.PKCS10CertificationRequest;

java - Java 中独立于提供者的加密?

java - 使用 BouncyCaSTLe 进行简单的 HTTPS 查询

java - Maven:不同包的独立资源?

java - Netbeans 的一个可能错误,它正在执行我更改的旧代码

java - @RequestParam Map<String, String> 在 Spring Boot 中打印变量名称作为键

java - 处理所有异常

java - 使用椭圆曲线加密验证签名