Java中的Rijndael支持

17

我们有一个Java中进行Rijndael开发的需求。

您有哪些文章、库等推荐可以帮助我们?

请给出关于密钥库维护以及如何安全存储密钥的任何指导意见。

编辑:

它需要是开源的。基本上,只需要使用Rijndael对数据进行标准的加密/解密。

4个回答

30

Java自带AES加密算法。Rijndael就是AES算法。您不需要任何外部库。您只需要像这样:

byte[] sessionKey = null; //Where you get this from is beyond the scope of this post
byte[] iv = null ; //Ditto
byte[] plaintext = null; //Whatever you want to encrypt/decrypt
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//You can use ENCRYPT_MODE or DECRYPT_MODE
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
byte[] ciphertext = cipher.doFinal(plaintext);

至于加密/解密,就是这些。如果您正在处理大量数据,则最好读取16字节倍数的块并调用update而不是doFinal(仅在最后一个块上调用doFinal)。


8
Rijndael并不等同于AES,而是带有一些限制的AES - 固定块大小为128位,并且不支持某些加密模式。任何完整的AES实现都可以用作Rijndael。 - Cheeso
16
这恰恰相反,AES是Rijndael的一个子集。 - Bruno Rohée
3
@BrunoRohée是正确的。AES是Rijndael算法的子集,请查看此链接:https://dev59.com/s3RB5IYBdhLWcg3wAjTR - tony9099
2
我不想编辑我的答案,因为这些评论是在它被选为正确答案之后发表的,而且我认为有3条评论指出AES是Rijndael的子集应该足以让任何人注意到我搞反了。 - Chochos
你在sessionKey和iv中提供的两个值是什么?你从哪里获取它们? - S Gaber
both should be random - Chochos

5

如果你需要一个很棒的免费库,我强烈推荐BouncyCastle。它是高质量的,有很多代码示例,并且得到了积极维护。至于参考文档,你需要更多地依赖于通用的JCE文档。

我不能说我们使用哪个库来满足FIPS认证要求。但是,有一些代替CryptoJ的选择,价格便宜得多。

一般来说,我建议使用对称密码(如Rijndael)为每条加密消息生成一个新密钥,然后使用非对称算法(如RSA)加密该密钥。这些私钥可以存储在受密码保护的基于软件的密钥库中,例如PKCS#12或Java的“JKS”,或者更安全地存储在“智能卡”硬件令牌或其他加密硬件模块上。


3

正如我们公司最近发现的那样,AES并不完全等同于Rijndael。AES有一个限制,那就是密钥必须是128、192或256位——然而,Rijndael允许使用160和224位的密钥。

如erickson所指出的那样,BouncyCastle提供了一个Rijndael对象,它支持额外的密钥长度:128/160/192/224/256位。具体来说,请查看轻量级API。

Gnu-crypto是另一个开源库,但它也不支持160和224位密钥。

因此,如果您特别需要完整的Rijndael支持,那么到目前为止,我只找到了BouncyCastle这个库。


1
如果您需要在Android开发中使用Java(尽管问题没有说明,但值得注意的是Bounty Castle现在有一个兄弟——Spongy Castle,它在Android上提供了更多的灵活性,是一个衍生版本...而且相当不错)。 - tony9099

1

javax.crypto支持AES:http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html

至于安全密钥存储,通常的方法是使用加密哈希函数从用户输入(密码短语)派生出一个加密密钥,并使用派生密钥来加密密钥链。或者,如果您只需要一个密钥,可以直接使用派生密钥。

始终记住,系统的安全性与所使用的哈希函数的强度直接相关。使用具有密码学安全性的哈希函数,如果可能的话,使用盐,并进行多次哈希(例如数百次)。

话虽如此,这个问题非常模糊。


值得注意的是,javax.crypto 使用了一个非常优化的 AES 版本,并且速度相当快。 - tony9099

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接