使用 OpenSSL 问题输出解密字符串

Decrypt String with OpenSSL Issue Output

我有一个加密字符串,我需要解密它:

我掌握的信息:

当我使用以下网站时,我可以毫无问题地解密:

(https://www.devglan.com/online-tools/aes-encryption-decryption)

最终结果:

当我尝试使用 OpenSSL 解密时,我遇到了特殊字符:

openssl enc -aes-128-ecb -d -a -nopad -nosalt -pass pass:MySecretKey -in string.txt

输出字符串: ûUzÊVmwN☺+æ¨+\ȨÌ┬cåÁ⌂▄B░×H·4é▀+>╦ G├[ëæ│_i(A&1·:0>▼è³0r

我是不是做错了什么?

从您所做的(有限的)描述中,可以发现两个缺陷。

首先,您使用的网站在加密数据时确实应用了填充。您提供的明文由 48 个字节组成:

$ echo -n 'e679932d-12b2-48a2-8ef7-301cdb9ab57b289YH3ITIXRH' | wc -c
      48

这是16的倍数,但密文长度为64字节。这可以通过在将密文字符串输入 wc:

之前对其进行 base64 解码来看出
$ echo -n 'AjL4iV8YSGnNOCQYOJXIP97GjCAYp2k0QLm56XxJN0p/yu5xQh5uitX3UmfP3bzZaXDd2u6hMwp6cxO3cNL1cg==' | openssl base64 -A -d | wc -c
      64

尽管您的明文长度是 16 字节的倍数,但密文中仍添加了 16 个字节这一事实意味着应用了填充。所以在你的 openssl 命令中,你不应该使用 -nopad 选项。

其次,您的 openssl 命令提供密钥作为密码,而网站不会将 'Secret Key' 输入字段解释为密码。不要在 openssl 命令中使用 -pass,您应该使用 -K,它将密钥作为实际的字节值序列。

举个例子,下面的openssl命令可以在网站表单中成功复现:

$ echo -n '1234567890123456' | openssl enc -aes-128-ecb -K 6162636465666768696a6b6c6d6e6f70 -nosalt -base64 -A -out string.txt
$ cat string.txt
M3q3c85LGdEj9k8iep/J145kzoc/F027JCP82BRYDhU=

用于加密和

$ cat string.txt | openssl enc -d -aes-128-ecb -K 6162636465666768696a6b6c6d6e6f70 -nosalt -base64 -A
1234567890123456

用于解密。

为了在网站中实现相同的结果,明文输入字段中使用的字符串是1234567890123456,密钥输入字段中使用的字符串是abcdefghijklmnop。字段 "AES Encrypted Output" 的内容将与 string.txt 的内容相同,这也是您需要在字段 "text to be Decrypted" 中输入的内容。

echo-n标志和openssl enc-A标志用于避免在末尾添加换行符。

解密在Java,如果有人感兴趣:https://www.devglan.com/java/aes-encryption-javascript-and-decryption-in-java