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
-K
此外,由于它需要 16 字节的密钥,因此即使您使用(大写 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 字节密钥“测试”,或者74 65 73 74 73
.
$ echo -ne "test" | openssl rc4-40 -K 7465737473 -nosalt -e -nopad | xxd
0000000: dd9b 5cb9
您会发现,当给出关键的“测试”时,您的 Web 实现会得到相同的结果。