繁体   English   中英

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

[英]Is AES256 encryption decryption possible in Java without unlimited strength JCE files?

我正在开发的项目有一个需要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 ++(特定编译器/解释器版本或任何东西)的限制?

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

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

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

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

首先,不是每个编程环境都不是问题。 用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加载了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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM