【发布时间】: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