我使用标准 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 类(例如 Cipher
、KeyGenerator
等)提供一些加密实现。
加密策略限制由 JCE 类强制执行,而不是由 bouncycaSTLe 强制执行。因此,如果您不使用这些类,您将不会遇到任何限制。缺点是你会牺牲一些可移植性。首先,请查看 AESEngine 的 javadoc类,以及 javadocs for the bouncycastle 的其余部分.
关于java - 使用第三方 Java 库重新实现 AES 加密,不受美国法律限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3870784/