【问题标题】:How do I decrypt a Java-DES-encrypted message using openssl?如何使用 openssl 解密 Java-DES 加密的消息?
【发布时间】:2016-08-24 16:03:24
【问题描述】:

由于问题标题不言自明,请考虑以下代码:

private static final String ALGORITHM = "DES";
private static final String MESSAGE = "This is an extremely secret message";
private static final byte[] key = { 0, 1, 2, 3, 4, 5, 6, 7 };

...

// Do encryption
final Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(ENCRYPT_MODE, new SecretKeySpec(key, ALGORITHM));
final byte[] encrypted = cipher.doFinal(MESSAGE.getBytes());

// Copy the encrypted message to a file
final InputStream inputStream = new ByteArrayInputStream(encrypted);
final OutputStream outputStream = new FileOutputStream("___SECRET");
copy(inputStream, outputStream);

现在我正在尝试使用以下命令解密___SECRET 文件:

openssl enc -d -des -K 0001020304050607 -iv 0 -in ___SECRET -out ___OPEN

导致:

bad decrypt
3073636028:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:539:

只需解密第一个块(8 个字节),其余部分处于垃圾状态(OEM 编码):

This is MЕ$S6%@╢Т√°ў╝°╢]∙iь

我做错了什么以及如何使用openssl 解密加密消息?

【问题讨论】:

  • @jww:除了算法上的细微差别之外,11783062 是关于使用 openssl 的默认 PBE 进行加密的,这确实是 EVP_BytesToKey;这是关于使用密钥 NOT PBE 进行加密,这是一个主要区别。这里的 PBE 解决方案是完全错误的。 更好的欺骗stackoverflow.com/questions/37354200/…,尽管罗伯特早先的回答已经是正确的。
  • OP:请注意,20 多年前硬件改进导致 DES 不安全,不应将其用于任何安全目的。 三重 DES,由于历史原因在 Java 中被指定为 DESede,仍然是可以接受的安全性,但其他算法尤其是 AES 更好。
  • @dave_thompson_085 是的,我知道 DES 的弱点。我的问题是某种逆向工程的结果,所以openssl 的使用应该只用于脚本。谢谢你们的cmets!

标签: java openssl des


【解决方案1】:

在 Java 上,您在 ECB 模式下使用 DES,在 OpenSSL 上,您在 CBC 模式下使用 DES(存在 IV)。

这是一个显着的区别,因为在 CBC 中块是链接的 - 因此第一个块被正确解密,但所有后续块都被加扰。

您可以将 Java 部分更改为使用“DES/CBC”模式并提供 IV 或更改 openssl 部分并使用 -des-ecb 而不是 -des

【讨论】:

  • 它就像一个魅力!我必须更多地学习它,因为我为不知道这些简单的事情而感到羞耻。非常感谢!
猜你喜欢
  • 2011-12-13
  • 2014-01-08
  • 2020-04-30
  • 2013-10-21
  • 2013-08-29
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多