【问题标题】:how to use OpenSSL to decrypt Java AES-encrypted data?如何使用 OpenSSL 解密 Java AES 加密的数据?
【发布时间】:2011-02-27 21:56:19
【问题描述】:

我正在连接一个使用 AES 加密数据的旧版 Java 应用程序(该应用程序无法更改)。以下是原始 Java 代码如何实例化 AES 密码:

SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec );

我是 C/C++ 开发人员,不是 Java,但据我所知,这个遗留 Java 代码没有指定模式,也没有指定初始化向量。由于没有指定,任何人碰巧知道默认情况下Java会使用什么?

我们需要新的 C/C++ 应用来解密 Java 加密的数据。但是我不知道如何使用 OpenSSL 的初始化向量和链接模式,因为我不知道 java 是做什么的。

【问题讨论】:

  • 这很好地说明了为什么不应该使用默认值,而是始终明确指出操作模式和填充模式。

标签: java c openssl aes encryption


【解决方案1】:

找到可能的答案:

“默认情况下,Java 密码(至少在 Sun 的实现中)是按照 称为电子密码本(ECB)模式。” (来源:http://www.javamex.com/tutorials/cryptography/block_modes.shtml

所以如果默认使用ECB,我猜这意味着没有初始化向量,我可以使用OpenSSL的以下方法:

void AES_ecb_encrypt(*in, *out, *key, enc);

使用 AES_decrypt() 我可以解密来自 Java 端的 1000+ 字节消息。所以看起来Java确实默认为没有初始化向量的ECB模式。但是,我仍然无法加密并向 Java 应用程序发送新消息。调查仍在继续。


一切顺利。感谢您的众多提示。我可以确认 Java 默认使用 ECB。所有填充字节都设置为添加的字节数(称为 PKCS5 填充)。 "Hello World" -> 由 Java 加密 -> 使用 OpenSSL 解密后将看起来像 "Hello World\5\5\5\5\5"

【讨论】:

  • 一切正常。感谢您的众多提示。我可以确认 Java 默认使用 ECB。所有填充字节都设置为添加的字节数。 “Hello World” -> 由 Java 加密 -> 使用 OpenSSL 解密将看起来像“Hello World\5\5\5\5\5”。
  • 这种填充模式被称为 PKCS#5-Padding,OpenSSL 也应该有一种方法来指示这种填充模式。 (我编辑了您的帖子以添加来自您的 cmets 的信息,因此答案已完成。请随时恢复或再次编辑。)
  • 你有没有找到一种方法来指示填充? stackoverflow.com/q/19810373/655703
【解决方案2】:

一些密码算法需要额外的初始化参数;这些可以作为 java.security.AlgorithmParameters 对象或 java.security.spec.AlgorithmParameterSpec 对象传递给 init()。加密时可以省略这些参数,Cipher 实现使用默认值或者为你生成合适的随机参数。在这种情况下,您应该在执行加密后调用 getParameters() 以获取用于加密的 AlgorithmParameters。这些参数是解密所必需的,因此必须与加密数据一起保存或传输。

http://docstore.mik.ua/orelly/java-ent/jnut/ch26_01.htm

您能否修改 Java 代码以获取这些参数?

【讨论】:

    【解决方案3】:

    在 java 中使用 Bountry castle 库。它支持与 java 中的 openssl 库等效的 c/c++。为我工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      相关资源
      最近更新 更多