web-dev-qa-db-ja.com

OpenSSL3DES暗号化パラメーター

TripleDESモードでCBCアルゴリズムを使用してテキストを暗号化したい場合、2つの選択肢があります。

1-オンラインツール、Like this

2-OpenSSLツール。

オンラインツールに、テキスト、KEY、およびIVを入力します。

OpenSSLで、次のコマンドを入力します。

OpenSSL> des-ede3-cbc -in MyText.txt -K <KEY> -iv <IV>


しかし、以下のコマンドを使用するとどうなりますか?

OpenSSL> des-ede3-cbc -in Mytext.txt

最初の質問:知りたいのですが、KEYは次の2行に入力したパスワードで構成されていますか?どのアルゴリズムに基づいてキーを作成しますか?

誰かがパスワードしか持っていない場合、彼らは私の暗号化されたテキストを解読できますか?

2番目の質問:Saltパラメーターとは!? -nosaltを使用する暗号化コマンドと使用しない暗号化コマンドの違いは何ですか?

3番目の質問:-base64を使用する場合、出力はbase64形式ですか?このパラメーターを使用しない場合、出力の形式は何ですか?


更新:4番目の質問:暗号化されたテキストを復号化するには何が必要ですか?パスワードのみ? IVとKEYの両方?またはそれらのすべて?

5番目の質問:

Opensslコマンドラインでパスワードとして「1」を入力します。次に、 this オンラインツールを使用して、「1」のMD5ハッシュを作成します。次の図に示すように、3DES KEYの最初の2つのバイは、入力したパスワードのMD5ハッシュと同じです。キーの最後のバイトを知りたいですか?どのように作成しますか?

そして、誰かがパスワードしか持っていない場合、どうすれば私の暗号化されたテキストを解読できますか?

enter image description here

3
Abraham
  1. キーとIVは、OpenSSLチームが誇りに思っていないOpenSSL固有のアルゴリズムを使用して、指定したパスワードから取得されます。下位互換性のためにそれを維持しますが、PKCSのPBKDF2などのより優れたパスワードベースの鍵導出関数を使用することをお勧めします。

OpenSSLの特注の鍵導出アルゴリズムは、関数 EVP_BytesToKey(3) にあります。

キー:

-Kキー実際に使用するキー:これは、16進数のみで構成される文字列として表す必要があります。

IV:

暗号化では、初期化ベクトル(IV)または開始変数(SV)[1]は、暗号化プリミティブへの固定サイズの入力であり、通常はランダムまたは疑似ランダムである必要があります。

したがって、IVはファイルの暗号化に使用される追加の入力です。それはnotキーです(私はそれが単なる用語だと思います)。

2ソルトは、指定したキーへの追加(プレフィックス)です。 ( Wikipedia を参照してください。キーでRainbowテーブルまたは事前計算されたハッシュテーブルを使用することはできません。ソルトは通常、暗号化されずに保存されます。

3出力はバイナリであり、印刷できない文字が含まれている可能性があります。ターミナルエミュレータは、これらのバイト値をデフォルトの文字エンコーディングと書体で印刷可能な文字としてレンダリングしようとしますが、おそらく「ガベージテキスト」のように見え、コピー/貼り付け、FTP、または電子メールに対して安全ではありません。

4暗号化されたテキストを復号化するには、キーとIVが必要です。それらの一方または両方がなく、欠落しているものがパスワードから派生したものである場合、パスワードを持っている場合は、欠落しているキーまたはIV、あるいはその両方をパスワードから再導出できます。あなたはすでにそれを持っているので、あなたは塩を必要としません。暗号化されたテキストの先頭に付加されます。ソルトは実際には秘密ではありません。事前に計算されたハッシュテーブルとレインボーテーブルをホイルする方法にすぎません。

5 EVP_BytesToKey(3) で定義されているように、「1」のパスワードと--nosaltを使用すると、キーの最初の16バイトは次のようになります。

md5( D_0 || password || salt)

(このコンテキストでは、||は論理的なorではなく、連結を意味することに注意してください)

これは

md5 ( `null` || "1" || `null`)

これは

md5("1")

であることが判明

0xc4ca4238a0b923820dcc509a6f75849b

この値は、マニュアルページでD_1と呼ばれる値です。

キーとIVの残りの必要なバイトは、次のように生成されます。

md5( D_1 || password || salt)

これは

md5( 0xC4CA4238A0B923820DCC509A6F75849B || "1" || `null` )

これは

md5( 0xC4CA4238A0B923820DCC509A6F75849B31 )

(ASCII "1"は、D_1値の最後に連結された0x31になることに注意してください)

これは次のようになります。

0x7976c7161415c830816dd4068a1d9a52

これは、そのマニュアルページでD_2と呼ばれているものです。

キーは、すでに証明されているD_1よりも8バイト多いだけなので、D_2の最初の8バイトを取り、次のようになります。

Key: C4CA4238A0B923820DCC509A6F75849B7976c7161415c830

IVは8バイトしか必要とせず、D_2からの未使用バイトが8つあるため、それらはIVになります。

IV: 816dd4068a1d9a52

キーの最初の16バイトであるD_1を生成するコマンドラインを次に示します(パスワード「1」と--nosaltの例を指定)。

echo -n "1" | openssl md5

これは、D_2、キーの残りの8バイト、およびIVのすべての8バイトを生成するコマンドラインです(ここでも、入力例を前提としています)。

echo -n "$(echo -n "1" | openssl md5 -binary)1" | md5

これは、D_1の出力を取得し(ASCIIでエンコードされた16進数に変換するのではなく、必ずバイナリで保持するようにします)、それに「1」(0x31)を追加し、そのmd5を取得することで機能します。

2
mtak