web-dev-qa-db-ja.com

セキュアハッシュにSHA-xの代わりにAESが使用されないのはなぜですか?

私の知る限り、AESは非常に安全であると信じられています。 (私はどこかでそれが今後20年間で確かに壊れないであろうことを読んだことがあるが、著者が真剣であったかどうかはまだわからない。)

DESはまだ古い暗号にとってそれほど悪くはなく、3DESはまだ使用されています(多分それほどではないかもしれませんが、少なくともFirefoxのabout:configに3DESが表示されます)。

(良い)ブロック暗号は暗号コミュニティから信頼されているようです。

OTOH、暗号化ハッシュ関数に関する多くの問題が発見されました。

非クリプトスペシャリストの観点から:ハッシュ関数と対称暗号は本当に同じものです:「ランダム」関数(入力と出力が異なります)。

では、ハッシュにAESだけを使用しないのはなぜですか?これは、ハッシュに対してAESの強力な安全性を確保するために行うべき明らかなことのようです。おまけとして、AESのハードウェア実装は役に立ちますか?

ハッシュ関数と対称暗号の実際の違いについて簡単な説明はありますか?

46
curiousguy

ブロック暗号には鍵があります。鍵の機密性は、暗号セキュリティが構築するものです。一方、ハッシュ関数にはキーがまったくなく、ハッシュ関数のセキュリティを構築する「秘密データ」はありません。

ブロック暗号は reversible です。キーがわかっている場合は、暗号化されたものを復号化できます。技術的には、所定の鍵の場合、ブロック暗号は可能なブロック値のスペースの順列です。ハッシュ関数は元に戻せないことを意図しており、決して順列ではありません。

ブロック暗号は、入力と出力の両方について、固定サイズのブロック(AESの場合は128ビットブロック)で動作します。ハッシュ関数には固定サイズの出力がありますが、任意の大きな入力を受け入れる必要があります。

したがって、ブロック暗号とハッシュ関数は実際には別の動物です。それらを区別しようとするよりも、それらの共通点を確認する方が簡単です。つまり、ブロック暗号を設計する方法を知っている人は、ハッシュ関数の設計もかなり得意です。多くの線形代数とブール関数、本当に)。

より正式な定義に行きましょう:

ブロック暗号は、キーによって選択された順列のファミリーです。スペース [〜#〜] b [〜#〜] n -bitブロックの一部の固定値 n ; [〜#〜] b [〜#〜] のサイズは 2になります。キーはスペース [〜#〜] k [〜#〜] からの値であり、通常は m ビット( m は、必ずしも n )と同じではありません。キー k は、 2の順列を選択します [〜#〜] b [〜#〜] の可能な順列。

ブロック暗号は、 2の間で一様かつランダムに選択された順列と計算上区別できない限り、安全であると見なされます。可能な順列。これをモデル化するために、攻撃者に2つのブラックボックスへのアクセス権が与えられている状況を想像してください。1つは攻撃者が知らないキーでブロック暗号を実装し、もう1つは真にランダムな置換です。攻撃者の目標は、どちらがどちらであるかを知ることです。彼は、各ボックスで任意のデータを暗号化または復号化できます。考えられる攻撃は、可能なすべてのキーを試すことです( 2があります)メートルそのようなキー)1つだけが見つかり、ボックスの1つと同じ値になります。これには平均コストがあります 2m-1暗号の呼び出し。 secure block cipherは、この一般的な攻撃が最良の攻撃であるような暗号です。

AESは、128ビットブロック( n = 128)および128ビット、192ビット、256ビットキーで定義されています。

ハッシュ関数は、任意の長さのビットシーケンスを入力として受け取り、固定長の値を出力する単一の完全に定義された計算可能な関数です r (たとえば、 r = SHA-256の256ビット)。キーも関数群もありません。誰でも計算できるユニークな関数だけです。

ハッシュ関数 h は、次の場合に安全であると見なされます。

  • プリイメージを見つけることは計算上実行不可能です。 r -bit値 x を指定すると、を見つけることはできませんm h(m)= x となります。
  • m を指定すると、 m 'と区別して見つけることはできません。 m h(m)= h(m ')など。
  • 衝突を見つけることは計算上実行不可能です。 m m 'を見つけることは不可能であり、 h(m)= h(m ')

プリイメージ、2番目のプリイメージ、または衝突をそれぞれ一般的な攻撃で見つけることができる一般的な攻撃があります 2r 2r、および 2r/2。したがって、実際のセキュリティに到達できるのは、 r 2r/2は非常に大きなコストです。実際には、これは r = 128(MD5などの128ビットのハッシュ関数)では不十分であることを意味します。

非公式な方法では、ハッシュ関数が同じように見える可能性があるハッシュ関数が、同じ入力を受け入れる可能性のある関数の中からランダムかつ均一に選択されているとよいでしょう。しかし、これは一意の関数について話しているため、不適切に定義されたプロパティです(確率は常に平均と繰り返しの経験について暗黙のうちにあります。単一の関数で確率を実際に持つことはできません)。また、ランダム関数であることは、衝突やプリイメージに耐性があることとまったく同じではありません。これは ランダムOracleモデル に関する議論です。


それにもかかわらず、ブロック暗号からハッシュ関数を構築することは可能です。これが Merkle-Damgård の構成です。これには、ブロック暗号の key として入力メッセージを使用する必要があります。そのため、ブロック暗号は本来の目的で使用されていません。 AESの場合、これは期待外れです。

  • その結果、128ビット出力のハッシュ関数が生成されますが、2011年に利用可能なテクノロジーに対するセキュリティには小さすぎます。
  • ハッシュ関数のセキュリティは、ブロック暗号に 関連キー攻撃 がないことに依存します。関連キー攻撃は、暗号化に使用する場合、ブロック暗号では実際には重要ではありません。したがって、AESはそのような攻撃に対抗するように設計されておらず、実際、AES has a いくつかの弱点 その点で-暗号化の心配はありませんが、 Merkle-Damgård構造でAESを使用する場合は、大きな心配事になります。
  • 性能は良くありません。

Whirlpool ハッシュ関数は、AESからのブロック暗号 inspired に基づいて構築された設計であり、実際のものではありません。そのブロック暗号は大幅に改善された(そしてより重い)鍵スケジュールを持っています。これは関連鍵攻撃に抵抗し、ハッシュ関数のコアとして使用できるようにします。また、そのブロック暗号は、128ビットブロックではなく、512ビットブロックで機能します。ワールプールは安全だと信じられています。ワールプールは非常に遅いことが知られており、誰も使用しません。

最近のいくつかのハッシュ関数の設計では、AESの parts を再利用しようとしています-正確には、 AES-NI に適切にマッピングされる内部演算を使用しています=最近のIntelおよびAMDプロセッサーに搭載されている命令。たとえば [〜#〜] echo [〜#〜] および SHAvite- ;を参照してください。これら2つの機能はどちらも SHA-3競争 の一部としてかなりの露出を受けており、「かなり安全」であると考えられています。最近のIntelおよびAMDプロセッサは非常に高速です。他のより弱いアーキテクチャでは、ハッシュ関数のパフォーマンスが実際に重要になる可能性があり、これらの関数は非常に遅いです。

ブロック暗号からハッシュ関数を作成できる他の構造があります。 Skein で使用されるもの;ただし、AESが定義されているブロックよりも大きなブロックが必要になる傾向もあります。

要約:ブロック暗号とハッシュ関数がまったく異なるだけではありません。しかし、AESからハッシュ関数を構築するという考えは、妥当性に疑問があることがわかります。簡単ではなく、限られたAESブロックサイズが主な障害です。

70
Thomas Pornin

基本的な答えは、それらは異なるタイプのアルゴリズムであるということです。 AESは対称鍵アルゴリズムです。 RSA(公開鍵アルゴリズム)やSHA-256(ハッシュアルゴリズム)と同じ役割では使用できません。それらは、非常に異なる特性と弱点で設計された異なるシステムです。

それでも、私は立ち止まり、このアイデアについて真剣に説明しましたが、「これがこの方法だ」と言うだけでなく、それについて説明しました。結局のところ、普遍的な意味でのハッシュは、固定サイズまたは縮小サイズのデータ​​の繰り返し可能な表現です。 AESは、CBCモードを介してそれを提供できます。しかし、安全なハッシュには、単純な削減よりも多くの特性があります。

安全なハッシュアルゴリズムは一方向のシステムです。 AESは同じ方法で暗号化と復号化を行い(対称暗号)、特定の鍵で何が起こるかをブロックごとに1-1にマッピングできます。データがチェーン化されて損失が生じない限り、AESの「ハッシュ」をソースデータに簡単に復号化できます。

SHAプロセスを別の入力データを試す以外に合理的に逆転させることはできません。SHA-xを使用して何かを暗号化できないため、AESを使用して何かをハッシュします。

11
Jeff Ferland

ハッシュ関数と対称暗号の実際の違いについて簡単な説明はありますか?

  • 暗号は可逆的ですが、ハッシュ関数はそうではありません
  • 暗号の出力の長さは、入力の長さに依存します。ハッシュ関数は、入力に関係なく同じ長さの出力を生成します
  • 暗号化ハッシュ関数の任意の場所で1ビットを変更すると、ハッシュ出力にカスケード(劇的)な変化が生じます。原則として、これは暗号には当てはまりません。
  • 暗号には鍵が必要ですが、ハッシュには必要ありません

2つのデザインと目的は根本的に異なり、互換性はありません。

9
tylerl

次のようにFeistel関数Fを定義すると、Merkle-Damgard-constructionを使用して基本的に任意のブロック暗号をハッシュ関数に変換でき、Feistelネットワークを使用して任意のハッシュ関数を基本的にブロック暗号に変換できます。

F(half_block, round_key) = hash(concatenate(half_block, round_key))

ただし、Fはすでに計算に費用がかかるため(SHA-512の場合は80の内部「ラウンド」を使用した反復アルゴリズムであり)、Feistel構造の場合、F自体が複数回反復されるため、非常に非効率的です(計算に時間がかかります)。 80ラウンドのラウンド関数Fを備えた20ステージのFeistelネットワークがあり、ブロックごとに1600 SHA-2「ラウンド」を実行するとします。また、ブロックサイズがかなり大きくなります(ハッシュ関数の出力のサイズの2倍)。 g。ハッシュ関数としてSHA-512を使用する場合は、1024ビットのブロック暗号。

しかし実際には、必ずしも「安全」ではありません。それは、すぐに利用できる「ブロック暗号」(むしろ疑似ランダム順列-ビット/バイトの順列のような順列ではなく、「すべての可能な入力ブロック」と「すべての可能な出力ブロック」の間の単射マッピングの意味での順列)がはるかに多いことです。効率的で、より広く使用されているため、優れた疑似ランダム順列であるという特性についてより徹底的に分析されます。無駄にする計算能力がある場合は、ブロック暗号としてFeistelネットワークでSHA-512を使用してください。おそらく、「ラウンドキー」を導出するための適切なキースケジュールを追加することを条件として、AESよりも安全性は低くありませんが、ブロックの処理にはlotsのCPUサイクルが必要です。

3
no.human.being

M.アベルは正しいです。ハッシュとして使用されるAESの別の例は、AES-CBCまたはAES-PCBCです。

https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Propagating_Cipher_Block_Chaining_.28PCBC.29

CBCまたはPCBC、さらにはCFBがエラーの有無にかかわらず「ファイル」で実行される場合、最終的なブロックは異なります。

非効率的ですが、実行できます。論理は「あなたが持っているすべてがハンマーである場合、すべてが釘のように見えます。」 AESについても同様です。ハッシュするためのより良い方法があるかもしれませんが、あなたが持っているものがすべてAESなら。 。 。

0
aesuser