如何使用openssl解密Java-DES加密的消息?

时间:2016-08-24 16:03:25

标签: java openssl des

由于问题标题是自我解释,请考虑以下代码:

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解密加密邮件?

1 个答案:

答案 0 :(得分:2)

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

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

您可以更改要使用的Java部件" DES / CBC"相反,提供IV或更改openssl部分并使用-des-ecb代替-des