问题 在没有无限强度的JCE文件的情况下,AES256加密解密是否可行?


我正在开发的项目有一个需要AES加密和解密的部分。从我可以查找的所有可能的互联网资源中,很难找到任何AES256加密的参考,而无需从Sun(现在的Oracle网站)下载和安装Unlimited Strength JCE文件。除了分发相同的法律问题之外,在要求最终用户访问特定网站并下载某些文件,将它们放入目录然后将内容添加到类路径时,它实际上并没有帮助我们。在Windows等!

在互联网上有一些引用BountyCastle的轻量级API,可能不需要JCE文件,但我无法查找一个非常相关的参考或示例来证明它。

不确定,但这是其他所有编程语言的问题吗?

如果没有安装了那些特定JCE文件的AES 256位加密,那么JNI方法可以帮助吗?

为了详细说明,AES 256加密可以在C / C ++中完成,然后我可以调用那些使用JNI获得所需结果吗?打包软件(作为jar文件)会引起关注,还是会出现其他问题?

另一个重要的因素是该项目将同时运行Mac和Windows,因此可能是使用C / C ++(特定编译器/解释器版本或任何东西)的限制?

有没有不同的方法来处理这个?还有其他方法吗?


2612
2018-03-21 15:04


起源

欢迎来到 堆栈溢出。我冒昧地删除了一些不必要的文本。我们喜欢我们的问题简洁,这个已经很长很长没有那个文本;-) - Joachim Sauer
我想你可以在这里找到一个Java AES实现: jce.iaik.tugraz.at 但我认为这对研究/学生来说是免费的。 - HectorLector
诺拉,别忘了赞成或接受答案。 - Maarten Bodewes


答案:


密钥大小限制在。中实现 Cipher Java类。可以使用任何 其他 实现AES以获得AES-256功能的类。例如,可以使用“轻量级”API 充气城堡 使用任何强度的关键尺寸。在这种情况下,您可以例如使用 org.bouncycastle.crypto.engines.AESFastEngine 直接(和 模式 和a 填充 你的选择。仍然可以使用正常 .jar 对于Bouncy Castle,但您不会使用BouncyCastle提供程序的JCA功能。

这具有一些缺点和优点。轻量级Bouncy Castle API的级别稍低于添加到Sun类的JCA功能 "BC" 供应商。此外,许多组件(例如Java,JSSE中的SSL层或XML加密库)使用JCA来提供所需的加密功能。需要JCA功能的库仍将限制为受限密钥大小。

注意使用其他 供应商 不会起作用 Cipher 类本身检查密钥大小。该 CipherSpi 可能包含在JCA提供程序中的实现类不能(肯定地)影响允许的密钥大小。您只能直接使用实现类。


6
2018-03-23 15:39



链接 帮助 - Norah


首先,不是每个编程环境都不是问题。用C语言编写的OpenSSL例如支持大键。根据JCE和JNI的经验,我建议您找到一种方法来使用纯Java而不是通过JNI加载本机库。这简单得多了。

实用的解决方案: 在安装期间是否使用某种安装程序应用程序安装了应用程序如果是这样,那么一个解决方案可能是使用此安装程序来安装JCE。

不幸的是,BouncyCastle还使用了JCE 常问问题

更新1:  我发现这个库可能就是你要找的东西。但它似乎不再维持: http://www.cryptix.org/

更新2: GNU有一个实现AES256的库: http://www.gnu.org/software/gnu-crypto/ 。有关可用密码的更多信息: http://www.gnu.org/software/gnu-crypto/manual/Ciphers.html

使用GNU-Crypto的代码示例,假设您已经加载了密钥 key_bytes

IBlockCipher cipher = CipherFactory.getInstance("AES");
Map attributes = new HashMap();
attributes.put(IBlockCipher.CIPHER_BLOCK_SIZE, new Integer(16));
attributes.put(IBlockCipher.KEY_MATERIAL, key_bytes);
cipher.init(attributes);
int bs = cipher.currentBlockSize();

for (int i = 0; i + bs < pt.length; i += bs)
{
    cipher.encryptBlock(pt, i, ct, i);
}

for (int i = 0; i + bs < cpt.length; i += bs)
{
    cipher.decryptBlock(ct, i, cpt, i);
}

请确保您使用加密安全随机数生成器,如 的SecureRandom 为密钥创建256字节:

byte[] seed = xxx; // Be sure to get a good new seed on every client machine.
SecureRandom random = new SecureRandom(seed);
byte[] key_bytes = new byte[256];
random.nextBytes(key_bytes);

5
2018-03-21 15:24



Bouncycastle轻量级API可以 不 使用JCE,因此不需要无限制的管辖区加密文件。 - James K Polk
@GregS用它作为答案的基础 - Maarten Bodewes
指向一个未维护的加密库通常应以-1结尾,但我会留下它,因为其他信息是正确的。 - Maarten Bodewes