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

不同的输出,相同的数据和相同的键?数据:“测试”键:“测试”

我还检查了一个我用 C 编写的小程序,其输出与在线编码器相同......所以,问题是,我对命令 openssl 做错了什么?

谢谢!

4

1 回答 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

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

于 2012-02-17T20:30:41.723 回答