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

Nor*_*rah 11 java encryption java-native-interface aes

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

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

Maa*_*wes 6

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

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

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


uld*_*all 5

首先,不是每个编程环境都不是问题.用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);
}
Run Code Online (Sandbox Code Playgroud)

请确保您使用加密安全随机数生成器(如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);
Run Code Online (Sandbox Code Playgroud)

  • Bouncycastle轻量级API不*使用JCE,因此不需要无限制的管辖区加密文件. (4认同)