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

时间:2010-10-06 08:43:44

标签: java bouncycastle jce

我使用标准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实现 - 证明是我做的自定义单元测试。

3 个答案:

答案 0 :(得分:3)

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

加密策略限制由JCE类强制执行,而不是由bouncycastle强制执行。因此,如果您不使用这些类,您将不会遇到任何限制。在缺点方面,你会牺牲一些便携性。要开始使用,请查看AESEngine类的javadoc以及javadocs for the bouncycastle的其余部分。

答案 1 :(得分:1)

为什么不能只添加必要的策略文件?

这将是最简单的事情。 如果您居住在美国并且将软件导出到其他(可能是“不允许的”)国家/地区,您(理论上)会遇到任何问题(包括策略文件/自己进行加密)。

如果您居住在美国境外,为什么还要烦恼,只需要包含政策文件,无人问津。

答案 2 :(得分:0)

购买工具包没有选择权? RSA BSAFE