【问题标题】:Rijndael support in JavaJava 中的 Rijndael 支持
【发布时间】:2009-02-25 19:05:06
【问题描述】:

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

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

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

编辑:

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

【问题讨论】:

    标签: java cryptography rijndael


    【解决方案1】:

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

    【讨论】:

    • Rijndael 不等于 AES,而是带有一些限制的 AES - 128 位的固定块大小,并且不支持某些加密模式。任何完整的 AES 实现都应该可以用作 Rijndael。
    • 这正好相反,AES 是 Rijndael 的一个子集
    • @BrunoRohée 是正确的。 AES 是 Rijndael 的子集,请查看stackoverflow.com/questions/748622/…
    • 我不想编辑我的答案,因为这些 cmets 是在被选为正确的之后制作的,我认为 3 cmets 声明 AES 是 Rijndael 的子集应该足以让任何人注意我把它弄反了。
    • 您在 sessionKey 和 iv 中提供的两个值是什么?从哪里得到它们?
    【解决方案2】:

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

    我不能说我们使用什么库来满足 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 是我迄今为止找到的唯一一个。

      【讨论】:

      • 如果您需要使用java进行android开发(虽然问题没有说明,但值得注意的是Bounty Castle现在有一个兄弟,这在android上提供了更多的灵活性,称为Spongy Castle,这是一个衍生物..实际上相当不错)
      【解决方案4】:

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

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

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

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

      【讨论】:

      • 另外值得注意的是,javax.crypto 使用了非常优化的 AES 版本,速度相当快。
      猜你喜欢
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多