RC4 无法与 openssl 命令正常工作?
我需要使用 RC4 对执行结果进行编码。在执行 bash 脚本之前,我正在测试如何加密数据。
我正在使用下一个命令:
echo -ne "test" | openssl rc4 -k test -nosalt -e -nopad | xxd
输出是:
0000000: bdb1 7f03 ....
现在,如果我尝试对这个在线 RC4 编码器执行相同操作 http://www.fyneworks.com/encryption/rc4-encryption/index.asp 输出为: DA EA 54 65
不同的输出,具有相同的数据和相同的密钥? ?数据:“test” key:“test”
我还检查了一个用 C 编写的小程序,输出与在线编码器相同......所以,问题是,我做错了什么命令openssl??
谢谢!
I need to encode the result of a execution with RC4. Before to do the bash script, I'm testing how to crypt the data.
I'm using the next command:
echo -ne "test" | openssl rc4 -k test -nosalt -e -nopad | xxd
And the output is:
0000000: bdb1 7f03 ....
now, If I try to do the same with this online RC4 encoder http://www.fyneworks.com/encryption/rc4-encryption/index.asp the output is: DA EA 54 65
Different output, with the same data and same key?? Data: "test" key: "test"
Also I checked with a small program that I have coded in C, and the output is the same that the online encoder... so, the question is, what I'm doing wrong with the command openssl??
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
RC4 具有可变长度密钥,并且 OpenSSL 的 enc 实用程序强制您选择密钥大小。您正在测试的其他实现没有此类限制,因此您的密钥不匹配。
enc
实用程序的文档描述了密码允许的密钥大小:因此 RC4 仅适用于 128 位(16 字节)密钥。此外,
-k
选项表示从给定的密码中派生密钥。它在内部使用 EVP_BytesToKey 函数执行此操作,该函数实现密钥派生函数 (KDF)。不管怎样,长话短说,您的 RC4 实现没有使用相同的密钥。使用
-p
选项让 OpenSSL 打印它正在使用的实际密钥:此外,由于它需要 16 字节密钥,因此即使您使用以下命令指定短密钥,它也会用零填充较短的密钥
-K
(大写 K)选项。您可以使用xxd
查找“test”的 ascii 十六进制值,然后使用-p
再次查看 OpenSSL 的密钥:因此您必须匹配密钥长度并指定十六进制值密钥使用
-K
选项,您将看到 RC4 实现是等效的。例如,这里我使用 RC-40 将密钥长度限制为 5 个字节,并使用 5 字节密钥“tests”,或74 65 73 74 73
。您会发现,在给出关键“测试”时,您的 Web 实现会获得相同的结果。
RC4 has variable-length keys, and OpenSSL's enc utility forces you to pick a key size. These other implementations you're testing against make no such restriction, so your keys don't match.
The documentation for the
enc
utility describes the allowed key sizes for the cipher:So RC4 works only on a 128-bit (16-byte) key. Also, the
-k
option means to derive a key from the given passphrase. It does this internally using the EVP_BytesToKey function, which implements a Key Derivation Function (KDF).Anyway, long story short, your RC4 implementations aren't using the same key. Use the
-p
option to have OpenSSL print the actual key it is using:Further, since it's expecting 16-byte keys, it'll zero-pad shorter keys even if you specify a short key with the
-K
(uppercase K) option. You can usexxd
to find the ascii hex values of "test" and-p
again to see OpenSSL's key:So you must match key lengths and specify a hex-value key with the
-K
option and you'll see the RC4 implementations are equivalent. E.g., here I use RC-40 to restrict the key length to 5 bytes and use the 5-byte key "tests", or74 65 73 74 73
.You'll find that your web implementation gets the same result when given the key "tests".