RC4在openssl命令中无法正常工作?

8

我需要使用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” 密钥:“test”
我还用我自己用C编写的小程序检查了一下,结果与在线编码器相同...所以问题是,我在openssl命令中做错了什么?
谢谢!
1个回答

12

RC4使用可变长度的密钥,而OpenSSL的enc实用程序强制您选择一个密钥大小。您正在测试的这些其他实现没有这样的限制,因此您的密钥不匹配。

enc实用程序的文档描述了密码算法允许的密钥大小:

    rc4                128 bit RC4
    rc4-64             64 bit RC4
    rc4-40             40 bit RC4

因此,RC4仅适用于128位(16字节)密钥。另外,-k选项意味着从给定的口令派生一个密钥。它在内部使用EVP_BytesToKey函数执行密钥派生功能(KDF)。

总之,长话短说,您的RC4实现未使用相同的密钥。请使用-p选项让OpenSSL打印实际使用的密钥:

$ echo -ne "test" | openssl rc4 -k test -nosalt -e -nopad -p
key=098F6BCD4621D373CADE4E832627B4F6

此外,因为它期望的是16字节的密钥,即使你使用 -K(大写K)选项指定了一个短密钥,它也会对其进行零填充。你可以使用xxd查找“test”的ASCII十六进制值,并再次使用-p查看OpenSSL的密钥:

$ echo -ne "test" | xxd
0000000: 7465 7374                                test
$ echo -ne "test" | openssl rc4 -K 74657374 -nosalt -e -nopad -p
key=74657374000000000000000000000000

所以你必须匹配键长度,并在-K选项中指定十六进制值密钥,然后你会发现RC4实现是等效的。例如,在这里我使用RC-40将密钥长度限制为5个字节,并使用5个字节的密钥“tests”,或74 65 73 74 73

$ echo -ne "test" | openssl rc4-40 -K 7465737473 -nosalt -e -nopad | xxd
0000000: dd9b 5cb9   
你会发现,当使用键"tests"时,你的Web实现得到的结果是相同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接