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