C# 和 OpenSSL:AES 加密的不同输出

Guy*_*Guy 5 c# openssl aes

我正在尝试编写一个 C# 方法,该方法将输出与 openssl 二进制文件相同的加密字符串 (Base64),但我很难让事情匹配。

许多终端输出和 C# 需要遵循...:P

我们将使用一个非常令人兴奋的示例,即使用密码“123”加密字符串“a”。

首先是当我提供静态盐和密码时的 openssl(这是命令的理想运行方式,也是我希望 C# 输出匹配的内容):

dev@magoo ~# echo -n a | openssl enc -aes-128-cbc -S cc77e2a591358a1c -pass pass:123 -a -p
salt=CC77E2A591358A1C
key=7B2AD689138A44AD32297BBAAA5B0EEE
iv =EC4F0416B2E9A9B2FEEF2E66FF982159
U2FsdGVkX1/Md+KlkTWKHOtnt1ftHSKyWiz6GxkBVck=
Run Code Online (Sandbox Code Playgroud)

第二个是当我提供静态盐时的 openssl,以及从该盐派生的密钥和 iv(从第一个命令的输出中进行 C+P)但没有密码(因为甚至文档都说这将是一个非-)好主意):

dev@magoo ~# echo -n a | openssl enc -aes-128-cbc -S cc77e2a591358a1c -K 7b2ad689138a44ad32297bbaaa5b0eee -iv ec4f0416b2e9a9b2feef2e66ff982159 -a -p
salt=E85778B7FFFFFFFF
key=7B2AD689138A44AD32297BBAAA5B0EEE
iv =EC4F0416B2E9A9B2FEEF2E66FF982159
62e3V+0dIrJaLPobGQFVyQ==
Run Code Online (Sandbox Code Playgroud)

这让我觉得很奇怪。将第一个命令中“调试”输出(-p 参数)中的 key 和 iv 值添加到相同的盐中,我以某种方式得到了不同的盐!(CC77E2A591358A1C 与 E85778B7FFFFFFFF [这里的 4 个字节 0xff 看起来可能很有趣])。

第三是我的应用程序的输出:

dev@magoo ~# mono aestest.exe "a" "123"
==> INPUT     : a
==> SECRET    : 123
==> SALT      : cc77e2a591358a1c
==> KEY       : 7b2ad689138a44ad32297bbaaa5b0eee
==> IV        : ec4f0416b2e9a9b2feef2e66ff982159
==> ENCRYPTED : 62e3V+0dIrJaLPobGQFVyQ==
Run Code Online (Sandbox Code Playgroud)

因此,当我自己手动指定密钥和 IV(然后以某种方式生成不同的盐)时,C# 与 openssl 命令的输出相匹配,但这似乎是错误的。在我看来,C# 应用程序的输出应该与第一组 OpenSSL 的输出匹配,不是吗?

C#代码:

dev@magoo ~# echo -n a | openssl enc -aes-128-cbc -S cc77e2a591358a1c -pass pass:123 -a -p
salt=CC77E2A591358A1C
key=7B2AD689138A44AD32297BBAAA5B0EEE
iv =EC4F0416B2E9A9B2FEEF2E66FF982159
U2FsdGVkX1/Md+KlkTWKHOtnt1ftHSKyWiz6GxkBVck=
Run Code Online (Sandbox Code Playgroud)

我在这里错过了一些非常明显的东西,还是更微妙的东西?我环顾四周,看到了很多关于 C#、OpenSSL 和 AES 的内容,但对这个具体问题一无所知……所以,暂停?;)

Maa*_*wes 1

如果您直接指定密钥和 IV,那么盐甚至不会发挥作用。EVP_BytesToKey需要使用盐来使用密钥派生函数(对于 OpenSSL 而言是专有函数)将密码短语转换为密钥。因此,您可能会得到无关紧要的盐输出。

现在,1) 中 OpenSSL 的第一个输出包含标头(检查 ASCII 值:)、盐,然后是密文,这是十六进制的 64 进制字符串:

53616C7465645F5F CC77E2A591358A1C EB67B757ED1D22B25A2CFA1B190155C9
Run Code Online (Sandbox Code Playgroud)

您的应用程序 3) 和 2) 中的 openssl 命令均输出

EB67B757ED1D22B25A2CFA1B190155C9
Run Code Online (Sandbox Code Playgroud)

所以每件小事似乎都没什么问题。

  • 现在让鲍勃·马利再次从我的脑海中消失:) (2认同)