3

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

我掌握的信息:

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

难道我做错了什么?

4

2 回答 2

1

从您正在做的(有限的)描述中,可以确定两个缺陷。

首先,您使用的网站在加密数据时确实应用了填充。您提供的明文由 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命令将密钥作为密码提供,而网站不会将“密​​钥”输入字段解释为密码。而不是-pass在您的openssl命令中使用,您应该使用-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要使用的字符串是 ,Secret Key 输入字段中要使用的字符串是abcdefghijklmnop。“AES 加密输出”字段的内容将与 的内容相同string.txt,这也是您需要在“要解密的文本”字段中输入的内容。

-n标志 forecho-A标志 foropenssl enc用于避免在末尾添加换行符)。

于 2018-07-20T05:12:11.437 回答
0

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

于 2018-07-23T08:51:00.017 回答