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



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

我掌握的信息:

  • 使用的加密: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

最新更新