2012-02-17 196 views
8

我需要用RC4編碼執行結果。在做bash腳本之前,我正在測試如何隱藏數據。RC4無法正確使用openssl命令?

我使用的下一個命令:

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編碼,輸出和在線編碼器一樣...所以,問題是, m做錯了命令openssl?

謝謝!

回答

11

RC4具有可變長度的鍵,OpenSSL的enc工具強制您選擇一個鍵的大小。這些您正在測試的其他實現不會造成這種限制,因此您的密鑰不匹配。

documentationenc實用描述了被允許的密鑰長度的密碼:

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找到「測試」和-p的ASCII十六進制值再次看到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實現會得到相同的結果。