【问题标题】:RC4 doesn't work correctly with openssl command?RC4 不能与 openssl 命令正常工作?
【发布时间】:2012-02-17 14:03:49
【问题描述】:

我需要使用 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 上做错了什么??

谢谢!

【问题讨论】:

    标签: openssl rc4-cipher


    【解决方案1】:

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

    enc 实用程序的 documentation 描述了密码允许的密钥大小:

        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”和-p 的ascii hex 值以查看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   
    

    您会发现,当给定关键的“测试”时,您的网络实现会得到相同的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 2016-10-09
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2013-08-31
      相关资源
      最近更新 更多