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オプションは、指定されたパスフレーズからキーを導出することを意味します。これは、キー派生関数 (KDF) を実装するEVP_BytesToKey関数を使用して内部的に行われます。

とにかく、簡単に言うと、RC4 の実装は同じキーを使用していません。オプションを使用-pして、OpenSSL が使用している実際のキーを出力します。

$ echo -ne "test" | openssl rc4 -k test -nosalt -e -nopad -p
key=098F6BCD4621D373CADE4E832627B4F6

-Kさらに、16 バイトのキーが想定されているため、 (大文字の K) オプションで短いキーを指定した場合でも、短いキーはゼロで埋められます。xxd「test」の ascii 16 進値を検索し、-pOpenSSL のキーを再度確認するために使用できます。

$ echo -ne "test" | xxd
0000000: 7465 7374                                test
$ echo -ne "test" | openssl rc4 -K 74657374 -nosalt -e -nopad -p
key=74657374000000000000000000000000

したがって、キーの長さを一致させ、オプションで 16 進数のキーを指定する必要があります-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   

キー「tests」を指定すると、Web 実装で同じ結果が得られることがわかります。

于 2012-02-17T20:30:41.723 に答える