Encryption 为什么openssl AES产生的结果与我尝试的每个在线工具不同?

Encryption 为什么openssl AES产生的结果与我尝试的每个在线工具不同?,encryption,openssl,aes,Encryption,Openssl,Aes,我正在尝试使用AES加密字符串 在我的Macbook上,我输入命令 echo -n "hello" | openssl enc -e -aes-128-cbc 然后输入键123456 结果:U2FsdGVkX1+FBre1MZ1YDfgZRmRyt/hMogfMhYeiq8Q= 然而,当我尝试任何在线加密工具时,我得到了不同的结果 例如,对于这个站点,使用相同的加密方案,我得到 NrjrStoGrmkLAvWaJuKtvg== 为什么不同?我缺少什么配置?我无法复制您的两个结果(我不在Mac上

我正在尝试使用AES加密字符串

在我的Macbook上,我输入命令

echo -n "hello" | openssl enc -e -aes-128-cbc
然后输入键
123456

结果:
U2FsdGVkX1+FBre1MZ1YDfgZRmRyt/hMogfMhYeiq8Q=

然而,当我尝试任何在线加密工具时,我得到了不同的结果

例如,对于这个站点,使用相同的加密方案,我得到

NrjrStoGrmkLAvWaJuKtvg==


为什么不同?我缺少什么配置?

我无法复制您的两个结果(我不在Mac上)。问题可能与CBC是一种分组密码这一事实有关,这意味着它在每个加密周期中需要16字节的固定长度的块(与流密码不同)。当数据少于16字节时,它将使用填充

为什么不同? AES标准没有定义(…我知道,这对我们来说不是很有帮助)需要使用哪种填充,因此在PKCS#5或PKCS#7之间的实现可能有所不同

在我的例子中,甚至有人提示我使用此操作,而不是您选择的操作
***警告:使用了不推荐的密钥派生。使用-iter或-pbkdf2会更好。
openssl中的
-pbkdf2
选项对应于PKCS#5。 我们没有关于在线工具用于相同操作的库的信息。 关于结果:

U2FsdGVkX1+FBre1MZ1YDfgZRmRyt/hMogfMhYeiq8Q= and 
NrjrStoGrmkLAvWaJuKtvg==
Base64分别解码为以下内容:

Salted__1XFdrL̅
6Ji&⭾
因此,您可以看到,openssl加密的输出也使用了salt,但即使这样,内容也完全不同

我缺少什么配置? 尽管如此,您可以尝试以下方法:

 openssl enc -e -aes-128-cbc -pbkdf2 -nosalt
SALT用于防止针对所用私钥的暴力攻击,例如,如果收集了多个加密文档,并且在解密过程中它们并不重要。它只是解密的唯一提示,在解密过程中会被消除,但会消除一些攻击

问题是,今后您将如何使用加密方案——只要您始终使用openssl,您就可以确信它会工作,尽管快速谷歌搜索显示不同版本甚至会产生影响,这就是为什么我可能无法解密2018年9月11日openssl 1.1.1上提供的数据。
此外,这里还有一些很好的例子和解释。

首先:要在posted上重现已发布的密文
NrjrStoGrmkLAvWaJuKtvg=
,对于默认设置AES-128-CBC和明文
hello
,必须应用密钥
12345678
(和未发布的
123456

该网站使用填充。该键用UTF8编码,并用
0x00
值填充至所需长度(AES 128为16字节)。在CBC模式中,零向量被应用为IV。由于未对其进行描述(至少我没有找到文档),因此只能通过与参考实现或-网站进行比较来推断

在OpenSSL中,使用
-K
选项指定密钥(以十六进制数字表示),请参阅。如果应用了IV,则必须使用
-IV
选项(也使用十六进制数字)指定该IV。因此,要获得与网站相同的结果,需要在OpenSSL语句中添加:

-K 31323334353637380000000000000000 -iv 00000000000000000000000000000000

如果没有传递密钥,OpenSSL将请求密码,生成随机的8字节salt,并使用OpenSSL函数从salt和密码中派生密钥和IV。默认情况下,使用摘要SHA256(从版本1.1.0开始,MD5之前),迭代计数为1。输出格式为ASCII编码的salt__u,后面是8字节salt和实际密文,均为Base64编码。因此,密文总是以
U2FsdGVkX1
开头。由于每次加密的salt是随机确定的,因此每次都会产生不同的密钥和IV,从而产生不同的密文。键和IV可通过
-p
选项显示

使用密码123456和摘要MD5,可以将发布的OpenSSL密文U2FsdGVkX1+FBre1MZ1YDfgZRmRyt/hMogfMhYeiq8Q=解密为明文
hello
-p
选项也可用于解密并显示:

Key: F1A16DEEFFEE4AB705BB72C21C1F1CA2 
IV:  000A7A05E99BF90C025EFE40B534E836 
反之亦然,此密钥和IV可用于直接加密明文
hello
,从而生成密文
F819466472B7F84CA207CC8587A2ABC4
。如果发布的OpenSSL密文
U2FsdGVkX1+FBre1MZ1YDfgZRmRyt/hMogfMhYeiq8Q=
被Base64解码,并且前16个字节(前缀和salt)被丢弃,则与预期的密文结果相同


应该注意的是,OpenSSL使用的密钥派生不是很安全。从1.1.1版开始,OpenSSL支持PBKDF2,但必须明确指定这一点。

感谢您的有趣解释!