暗号リバスソリューションの例によるKDFの概要





かつて、明るいインターネットの暗い隅々を散策して、ソフトウェアとハ​​ードウェアの両方のセキュリティシステムに焦点を当てた要件と責任の印象的なリストを持つソフトウェア開発者としての仕事に出会いました。



要件の長いリストに加えて、期待のさらに素晴らしいリストが添付されました:深刻な数学的能力、暗号化の経験、分析など。 しかし、パズルテストの解決も提案されました。暗号化されたメッセージは、解読する必要がありました。



このトピックは私にとってまったく新しいものであり、要件に近づいていませんが、単純な関心のために、暗号化されたメッセージを解こうとすることにしました。 ハッカーがどのように働くように誘われているかをご覧ください。



メッセージはbase64でエンコードされました。

KDF関数は、32バイトの出力を持つ一般的なハッシュアルゴリズムの入力としてこの文のみを使用します。

暗号化アルゴリズムは、連結キーとinitベクトルをKDF出力として持つAES CBCです。

暗号化された質問は次のとおりです。次に、エンコードされたメッセージのテキストが16進文字列として来ました。



Kdf



私が最初に目を引いたのは、未知のKDF関数です。



キー派生関数は、情報保護タスクのために他の秘密値から秘密鍵を取得する機能です。



KDFの最も一般的なタスクはパスワードハッシュです。 侵害されたハッシュのハッキングを複雑にする必要がある場合。

更新( frolに感謝):

KDFのタスクは、元に戻すのが難しい(ハッシュ関数のタスク)だけでなく、シーケンスのランダム性の要件も満たす出力を生成することです(この要件は、KDFが初期化パラメーターに使用される暗号化アルゴリズムに由来します)。 したがって、はい、最も一般的なKDFタスクはパスワードを「ハッシュ」することですが、データベースに保存することではありませんが(これは可能ですが)、暗号化への入力としてこれらの「パスワード」をさらに使用します。



しかし、塩を含む通常のsha-2は、パスワードのハッシュ化、保存、保護に適していませんか?



KDFは、通常の暗号化ハッシュ関数よりも秘密鍵(パスワードなど)の保護を強化します。 これは、 キーストレッチと異なる擬似ランダムハッシュ関数(擬似ランダムハッシュ関数)を使用する機能が原因で判明しました。



パスワードハッシュがmd5、sha256などの通常の暗号化関数によって取得された場合、辞書攻撃または完全な列挙は、同じハッシュ関数に基づいていくつかのキー取得関数(KDF)が使用された場合よりも桁違いに速くなります汎用。



重要なことは、キーストレッチング、つまり反復ハッシュを使用すると、ハッシュ選択の複雑さ、使用メモリ、およびプロセッサ時間を制御できることです。 最終的には、ハッキングの複数の複雑さをもたらします。



正当なユーザーが計算を1回だけ実行する必要がある場合(たとえば、パスワードハッシュを取得して保存された値と比較する場合)、攻撃者はそのような計算を何十億も行う必要があります。



KDFビュー



そして、最初の手がかりに戻って、KDFを見つけました。

KDF関数は、32バイトの出力を持つ一般的なハッシュアルゴリズムの入力としてこの文のみを使用します。



KDFは通常、汎用の暗号化ハッシュ関数を疑似ランダムとして使用するため、この文を受け取り、32バイトを返す汎用関数を使用するKDFがあることは明らかです。



自然界にはどのようなKDFがありますか?

以下にサンプルリストを示します。

KDF1、KDF2、KDF3、KDF4、MGF1、PBKDF-Schneier、PBKDF1、PBKDF2、bcrypt、scrypt、HKDF。



あまりにも多くの場合、明らかに間違ったものを除外する必要があります。

各関数の説明を確認した後、リストから、時代遅れで実装を見つけるのが難しいもの、または擬似ランダム関数に関する情報がないものを削除しました。



最も最新で関連性の高いものが残っていました:PBKDF2、bcrypt、scrypt、HKDF。



最も有望な挑戦者はPBKDF2であるように思われました 。 しかし、入力は、ハッシュ関数に加えて、ソルト、反復回数、出力バイト数も受け取ります。



さらに、 bcryptに必要な入力にはソルトが必要であり、反復回数でさえ実装に依存することが判明しました。 私たちはメッセージから塩について何も知らないので、bcryptは応募者を残します。



次にscryptが登場します-HMAC_SHA256を擬似ランダム関数として使用する最も暗号化された最新のKDF(出力は32バイトになるため、これは私たちに適しています)が、ソルト、反復回数または計算の複雑さ、ブロックサイズ、並列化係数も必要です。



同じHMACベースの抽出および拡張キー派生関数またはHKDFのままです。



キー検索



復号化の2番目の段階は、復号化の方法を理解することです。

ツールチップによると: 暗号化アルゴリズムはAES CBCであり、連結キーと初期ベクトルはKDF出力として使用されます。



暗号化アルゴリズムですべてが明らかになりました-これはCBC暗号化モードのAESです。



暗号化を解除するには、キーに加えて初期化ベクトルを知っておく必要があります。そのため、使用するAESのバージョンは、128、192、または256ビットのブロックサイズです。



キーと初期化ベクトル(おそらく)がKDFの出力であるというヒントが与えられました。

未知のパラメーターの数をすでに感じていますか?



PBKDF2やscryptなどの関数はほぼ任意のバイト数を返すことができ、HKDFは擬似ランダム関数に応じて戻るため、ここからダンスが始まります。



また、PBKDF2およびscryptの計算複雑度パラメーターも不明であり、塩も不明です。 また、AESキーのサイズと初期化ベクトルのサイズは明確ではありません。



幸いなことに、このベクトルのサイズはブロックのサイズと一致する必要があることがわかりました。 たとえば、rijndael-128(rijndaelはAESの別名)の場合-ブロックサイズは128ビットまたは16バイトです。 したがって、この実施形態では、初期化ベクトルのサイズは正確に16バイトでなければならない。



また、キーは32バイトを超えることはできません。



解読



これで、復号化自体に進むことができます。

そして、0〜32バイトがキーであるKDFの結果を取得する必要があることは明らかです。AESバリアントに応じて、初期化ベクトルは16、24または32バイトです。



32バイトのキーと32バイトの初期化ベクトルを収容するには、KDF操作の結果のサイズが64バイトを超えないようにする必要があります。



基本的なパラメーター、空の塩、単純な係数(1)を確認した後、結果を取得できませんでした。

だから私はパニックを始めなければなりませんでした。



パニック



PBKDF2については、暗号化の反復が1つのパラメーターだけが検査されましたが、空のソルトを使用しました(このソルトの取得元が明確ではなかったため)。

ブロックサイズ、並列化係数、複雑さの3つのパラメーターが一度にスキャンされ、暗号化されました。



キーと初期化ベクトルも選択されたという事実にもかかわらず、結果は現れませんでした。



ハッシュベースのメッセージ認証コード( HMAC )ハッシュオプションだけを見始めましたが、これはKDFではなく擬似ランダム関数として使用されると常に言われていました。

しかし、HMACですべてのオプションを試したが、結果は得られなかった。



最後の光



scryptの研究の1つで、キー取得関数として特別に設計されていない汎用ハッシュ関数をKDFとして使用できることを発見しましたが、これはもちろん悪い習慣です。



そのようなパズルには難しい答えはないことを理解し、最も適切で最も簡単なオプションを見つけなければなりません。 したがって、KDFを使用せずに32バイトすべての汎用ハッシュ関数を実行し、結果からキーと初期化ベクトルを取得しようとすることにしました。



また、rijndael-128(16バイトのベクトルとブロックのサイズ)、sha256ハッシュ関数、32バイトを16バイトのキーで除算した結果、残りの16バイトを初期化ベクトルで除算すると、元のメッセージを解読することが判明しました。 特定の住所に手紙を送ることを単に提案しました。



私は片手で印刷し、もう片方の手で涙を拭き取ります。 すべてが最初に見られたよりもずっとシンプルであることが判明しました。



All Articles