我使用标准Java工具和BouncyCastle提供程序为特定的AES算法实现了具有特定任务特定参数的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实现 - 证明是我做的自定义单元测试。
答案 0 :(得分:3)
直接使用Bouncycastle轻量级加密API ,而不是通过Java JCE接口。 Bouncycastle包含自己的加密API,可通过org.bouncycastle.*
包中的各种类访问。它还实现了JCE提供程序接口,以通过标准JCE类(如Cipher
,KeyGenerator
等)使其某些加密实现可用。
加密策略限制由JCE类强制执行,而不是由bouncycastle强制执行。因此,如果您不使用这些类,您将不会遇到任何限制。在缺点方面,你会牺牲一些便携性。要开始使用,请查看AESEngine类的javadoc以及javadocs for the bouncycastle的其余部分。
答案 1 :(得分:1)
为什么不能只添加必要的策略文件?
这将是最简单的事情。 如果您居住在美国并且将软件导出到其他(可能是“不允许的”)国家/地区,您(理论上)会遇到任何问题(包括策略文件/自己进行加密)。
如果您居住在美国境外,为什么还要烦恼,只需要包含政策文件,无人问津。
答案 2 :(得分:0)
购买工具包没有选择权? RSA BSAFE