我有一个加密字符串,我需要解密它:
我掌握的信息:
- 使用的加密:RFC3826(AES-128 ECB(
- 加密字符串:AjL4iV8YSGnNOCQYOJXIP97GjCAYp2k0QLm56XxJN0p/yu5xQh5uitX3UmfP3bzZaXDd2u6hMwp6cxO3cNL1cg==
- 密钥:MySecretKey
当我使用以下网站时,我可以毫无问题地解密它:
(https://www.devglan.com/online-tools/aes-encryption-decryption)
最终结果:
- Base64:ZTY3OTkzMmQtMTJiMi00OGEyLThlZjctMzAxY2RiOWFiNTdiMjg5WUgzSVRJWFJI
- 纯文本:e679932d-12b2-48a2-8ef7-301cdb9ab7b289YH3ITIXRH
当我试图使用OpenSSL解密它时,我有一些特殊字符:
openssl enc-aes-128-erb-d-a-nopad-nosalt-pass pass:MySecretKey-in-string.txt
输出字符串:ûUz未指定VmwN☺+宋体┬cåÁ⌂▄B░×H·4é▀+>╦G├[ëæ│_i(A&1·:0>▼1³0r
我做错什么了吗?
根据对您正在做的事情的(有限的(描述,可以识别出两个缺陷。
首先,您使用的网站在加密数据时确实应用了填充。您提供的明文由48个字节组成:
$ echo -n 'e679932d-12b2-48a2-8ef7-301cdb9ab57b289YH3ITIXRH' | wc -c
48
这是16的倍数。但是密文有64字节长。这可以通过base64在将密文串输入wc
:之前对其进行解码来看出
$ echo -n 'AjL4iV8YSGnNOCQYOJXIP97GjCAYp2k0QLm56XxJN0p/yu5xQh5uitX3UmfP3bzZaXDd2u6hMwp6cxO3cNL1cg==' | openssl base64 -A -d | wc -c
64
事实上,即使明文是16字节长的倍数,也会将16字节添加到密文中,这意味着要应用填充。因此,在openssl
命令中,不应使用-nopad
选项。
其次,openssl
命令将密钥作为密码短语提供,而网站不会将"密钥"输入字段解释为密码短语。您不应该在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加密输出"的内容将与string.txt
的内容相同,这也是您需要在字段"要解密的文本"中输入的内容。
(echo
的-n
标志和openssl enc
的-A
标志用于避免在末尾添加换行符(。
Java解密,如果有人感兴趣:https://www.devglan.com/java/aes-encryption-javascript-and-decryption-in-java