【问题标题】:Java Crypto API equivalent to Ruby's OpenSSL (via encrypted_strings library)Java Crypto API 等效于 Ruby 的 OpenSSL(通过 encrypted_strings 库)
【发布时间】:2023-03-04 16:02:02
【问题描述】:

我正在尝试使用 encrypted_strings RubyGem 库解密在 Ruby Web 应用程序中加密的加密消息。

加密客户端代码如下所示:

cipher = EncryptedStrings::SymmetricCipher.new(:passphrase => "abcdefgh"*2)
cipher.encrypt("howdy")
=> "jEUQrH58Ulk=\n" 

默认的对称密码算法似乎是 DES-EDE3-CBC(尽管 RubyGem 的文档不同意,但我会按照代码所说的进行)。所以在 Java 方面,我尝试了以下我在网上找到的作为 Java Cryptography API 的 DES-EDE3-CBC 使用示例:

import javax.crypto.spec.DESedeKeySpec
import javax.crypto.spec.IvParameterSpec
import javax.crypto.Cipher
import javax.crypto.SecretKeyFactory


...
DESedeKeySpec k;
Cipher c;

...
k = new DESedeKeySpec("abcdefghabcdefgh".getBytes());
c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, k);
decrypted = c.doFinal("jEUQrH58Ulk=\n".getBytes());

当我在 Java 端执行此操作时,我得到以下信息:

Wrong key size 

我还尝试使用带有初始化向量的 Java Crypto API,但不知道我应该将字节设置为什么,因为我没有通过 encrypted_strings 库在 Ruby 端执行此操作,而且它似乎是在 C 中设置的与 OpenSSL 接口的代码。

任何指针将不胜感激。

我正在使用充气城堡 JCA 提供程序。我还尝试了 DES/ECB/PKCS5Padding(它与 RubyGems 文档中记录的默认算法相对应,尽管代码似乎引用了前面提到的算法 DES-EDE3-CBC)。

我尝试过阅读 Java 加密 API,但这些文档似乎都有相同的代码示例并且没有太多新线索。我的来源包括:

【问题讨论】:

  • 请不要输入异常和代码。始终复制和粘贴。您的异常与您的代码不匹配,因此您在 SO 上打错了其中一个。没有 DESedeCipherKey() 这样的类。
  • 如果您的 Ruby 实现使用的是 OpenSSL,您始终可以使用本机包装器来完全匹配它。 warnertechnology.com/Computers/Software/JavaOpenSSL.shtml 这是古老的,但它给出了它的想法。有很多商业库可以满足您的需求,但我不知道免费的 Java 实现。
  • @DanielChapman 感谢库链接,如果/当我无法弄清楚 Java Cryptography API 时,我会调查该途径。
  • @GregS 感谢您的反馈。我最初确实复制并粘贴并更新了我的代码以重新运行我的测试,并认为我已经以相同的方式手动更新了 SO 代码,但显然我没有以同样的方式更改该行。我会记得在未来更好地保持同步。我将立即使用所有导入和正确的代码更新我的问题。
  • 对我来说,密文看起来像是 base64 编码。

标签: java ruby cryptography openssl


【解决方案1】:

我会发布它作为答案。使用 DESede,您可以使用 192 位 DES ABC 密钥或 128 位 ABA 密钥。许多 Java 版本只接受 192 位(24 字节)DES ABC 密钥。 DES ABA 密钥是加密、解密、加密 (EDE) 操作的第一个和最后一个密钥相同的地方;换句话说,它与 DESede 与 ABC 相同,其中 C=A。

因此,要创建这样的密钥,您可以复制密钥的前 8 个字节(在您的情况下为 8 个 ASCII 字符 - 直接使用字符作为密钥是错误的)并在最后连接它们。这将导致"abcdefghabcdefghabcdefgh".getBytes("ASCII")。请注意,您应该始终指明字符编码,因为平台可能会使用 UTF-16 作为默认字符编码,从而导致密钥大小增加一倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 2023-04-06
    • 2016-12-29
    • 1970-01-01
    • 2013-02-18
    • 2013-01-09
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多