16

我们需要用 Java 进行一些 Rijndael 开发。

对我们有帮助的文章、图书馆等有什么建议吗?

任何指向密钥库维护以及如何安全存储密钥的指针?

编辑:

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

4

4 回答 4

28

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 )。

于 2009-03-19T21:51:11.690 回答
5

对于一个很棒的免费图书馆,我强烈推荐BouncyCastle。它是积极维护的,高质量的,并且有一系列很好的代码示例。对于参考文档,您将不得不更多地依赖通用JCE 文档。

我不能说我们使用什么库来满足 FIPS 认证要求。但是 CryptoJ 的替代品要便宜得多。

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

于 2009-02-25T19:15:30.237 回答
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 是我迄今为止找到的唯一一个。

于 2011-01-18T22:41:22.413 回答
1

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

对于安全密钥存储,通常的方法是使用加密散列函数从用户输入(密码)中导出加密密钥,并使用导出的密钥对钥匙串进行加密。或者,如果您只需要一个密钥,您可以使用派生密钥本身。

请始终牢记,系统的安全性与所使用的散列函数的强度直接相关。使用加密安全的散列函数,如果可能的话加上盐,并且散列不止一次(例如数百次)。

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

于 2009-02-25T19:07:25.623 回答