使用openssl命令RC4无法正常工作?

use*_*850 8 openssl rc4-cipher

我需要使用RC4对执行结果进行编码.在执行bash脚本之前,我正在测试如何加密数据.

我正在使用下一个命令:

echo -ne "test" | openssl rc4 -k test -nosalt -e -nopad | xxd
Run Code Online (Sandbox Code Playgroud)

输出是:

0000000: bdb1 7f03                                ....
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试使用这个在线RC4编码器http://www.fyneworks.com/encryption/rc4-encryption/index.asp,输出为:DA EA 54 65

不同的输出,具有相同的数据和相同的密钥?数据:"测试"键:"测试"

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

谢谢!

ind*_*div 11

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

文件enc程序描述了加密允许密钥大小:

    rc4                128 bit RC4
    rc4-64             64 bit RC4
    rc4-40             40 bit RC4
Run Code Online (Sandbox Code Playgroud)

因此RC4仅适用于128位(16字节)密钥.此外,该-k选项意味着从给定的密码短语中导出密钥.它在内部使用EVP_BytesToKey函数执行此操作,该函数实现密钥派生函数(KDF).

无论如何,长话短说,你的RC4实现没有使用相同的密钥.使用该-p选项让OpenSSL打印正在使用的实际密钥:

$ echo -ne "test" | openssl rc4 -k test -nosalt -e -nopad -p
key=098F6BCD4621D373CADE4E832627B4F6
Run Code Online (Sandbox Code Playgroud)

此外,由于它需要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
Run Code Online (Sandbox Code Playgroud)

因此,您必须匹配密钥长度并使用该-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   
Run Code Online (Sandbox Code Playgroud)

在给出关键的"测试"时,您会发现您的Web实现获得了相同的结果.