使用 OpenSSL 问题输出解密字符串
Decrypt String with OpenSSL Issue Output
我有一个加密字符串,我需要解密它:
我掌握的信息:
- 使用的加密:RFC3826 (AES-128 ECB)
- 加密字符串:AjL4iV8YSGnNOCQYOJXIP97GjCAYp2k0QLm56XxJN0p/yu5xQh5uitX3UmfP3bzZaXDd2u6hMwp6cxO3cNL1cg==
- 密钥:MySecretKey
当我使用以下网站时,我可以毫无问题地解密:
(https://www.devglan.com/online-tools/aes-encryption-decryption)
最终结果:
- Base64:ZTY3OTkzMmQtMTJiMi00OGEyLThlZjctMzAxY2RiOWFiNTdiMjg5WUgzSVRJWFJI
- 纯文本:e679932d-12b2-48a2-8ef7-301cdb9ab57b289YH3ITIXRH
当我尝试使用 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
我有一个加密字符串,我需要解密它:
我掌握的信息:
- 使用的加密:RFC3826 (AES-128 ECB)
- 加密字符串:AjL4iV8YSGnNOCQYOJXIP97GjCAYp2k0QLm56XxJN0p/yu5xQh5uitX3UmfP3bzZaXDd2u6hMwp6cxO3cNL1cg==
- 密钥:MySecretKey
当我使用以下网站时,我可以毫无问题地解密:
(https://www.devglan.com/online-tools/aes-encryption-decryption)
最终结果:
- Base64:ZTY3OTkzMmQtMTJiMi00OGEyLThlZjctMzAxY2RiOWFiNTdiMjg5WUgzSVRJWFJI
- 纯文本:e679932d-12b2-48a2-8ef7-301cdb9ab57b289YH3ITIXRH
当我尝试使用 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
:
$ 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