如何使用 openssl 解密 Java-DES-encrypted 消息?
How do I decrypt a Java-DES-encrypted message using openssl?
由于题目是self-explaining,请考虑以下代码:
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
解密加密的消息?
在 Java 上,您在 ECB 模式下使用 DES,在 OpenSSL 上,您在 CBC 模式下使用 DES(存在 IV)。
这是一个显着差异,因为在 CBC 中块是链接的 - 因此第一个块被正确解密但所有后续块都被加扰。
您可以将 Java 部分更改为使用 "DES/CBC" 模式并提供 IV 或更改 openssl 部分并使用 -des-ecb
而不是 -des
。
由于题目是self-explaining,请考虑以下代码:
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
解密加密的消息?
在 Java 上,您在 ECB 模式下使用 DES,在 OpenSSL 上,您在 CBC 模式下使用 DES(存在 IV)。
这是一个显着差异,因为在 CBC 中块是链接的 - 因此第一个块被正确解密但所有后续块都被加扰。
您可以将 Java 部分更改为使用 "DES/CBC" 模式并提供 IV 或更改 openssl 部分并使用 -des-ecb
而不是 -des
。