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实现得到的结果是相同的。