web-dev-qa-db-ja.com

既知の平文でSHA-1のブロックハッシュを元に戻しますか?

SHA1に供給されたデータストリーム内のブロックの平文がわかっている場合、そのブロックのハッシュを元に戻すことはできますか? (私が想定しているように)それが不可能な場合、状態を簡単に取得するための攻撃は可能ですか?

私が理解しようとしている例:次のデータは既知です:

  • サフィックス1
  • SHA1(secret + suffix1)の結果
  • シークレットの長さ、たまたまちょうど512ビット(つまり、完全なSHAブロック))

今私が理解したいのはSHA1(secret + suffix2)(別の既知のサフィックス)です

(+は文字列連結を意味します)

(suffix1は既知ですが、操作できない長さ拡張攻撃は(おそらく(?))不可能です)

これは可能ですか?これを行うことに関する研究はありますか、それともまったく不可能であることは明らかですか?可能であれば:これはSHA-2ファミリーにも適用されますか?

ありがとうございました!

2
Patrick Huy

secretfromSHA-1(secret || suffix1)suffixの既知の値について) )はプリイメージ攻撃を構成します。現在SHA-1で運よりも速いプリイメージ攻撃は知られていません(「運」は平均的な努力で機能します2160SHA-1の場合、つまり完全に実行不可能です)。 secret値は取得できません。

ただし、目標がSHA-1(secret || suffix2)を計算することである場合、suffix2length extension attack と呼ばれます。つまり、suffix2suffix1で始まり、その後にの長さに依存するいくつかのパディングビットが続く必要があります。秘密|| suffix1;これらのビット(選択しません)の後に、必要なデータを配置できます。その意味で、suffix2は攻撃者によって部分的に制御されています。

長さ拡張攻撃は、SHA-1(secret || data)が貧弱であることを示すのに十分です [〜#〜] mac [〜#〜] 、および [〜#〜] hmac [〜#〜] を代わりに使用する必要があります(これはすべて、SHA-2関数でも同様に当てはまります)。

suffix2に制約を課したくない場合、これは困難になります。 secretの影響は、2番目のブロックの開始時に未知の160ビット状態に要約されます。今朝、これを数学的に計算する時間はありませんが、SHA-1(secret || suffix1)の出力からその状態値を見つけることは、 [〜#〜] shacal [〜#〜] ブロック暗号でsuffix1をキーとして使用して置換のサイクルを探索するのと同じです(suffix1+パディングは1つのブロックに収まります)。 SHACALは「良い」ブロック暗号であると想定されているため、この置換は、サイズ2のスペースの可能な置換のセットからランダムに選択されたかのように動作する必要があります。160は、サイクルの長さが平均して2に近いことを意味します80。これは、実際にはコストが高すぎることを意味します。

達成しようとしていることを実行できることは、SHA-1の特性を「良いハッシュ関数」(衝突、前画像、2番目の前画像への耐性)と矛盾しないことに注意してください。気にしないという意味ではありませんが、ハッシュ関数とランダムオラクルがまったく同じではない理由が明らかになります。

4
Tom Leek