web-dev-qa-db-ja.com

「SHA-2」と「SHA-256」の関係は何ですか

SHA-2とSHA-256の違いに戸惑い、それらが同じ意味で使用されているとよく聞きます(これは本当に間違っているようです)。 I think SHA-2はハッシュアルゴリズムの「ファミリ」であり、SHA-256はそのファミリの特定のアルゴリズムです。

あれは正しいですか?誰かが明確にしてもらえますか?

87
Mike B

ただウィキペディアを引用する: http://en.wikipedia.org/wiki/SHA-2

SHA-2ファミリーは、224、256、384、または512ビットのダイジェスト(ハッシュ値)を持つ6つのハッシュ関数で構成されています:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA -512/256。

つまり、SHA-2は一連のハッシュ関数であり、SHA-256が含まれています。

106
Steffen Ullrich

SHA-2ファミリーは、密接に関連する複数のハッシュ関数で構成されています。これは基本的に単一のアルゴリズムであり、いくつかのマイナーパラメータがバリアント間で異なります。

最初の仕様は、出力サイズが224、256、384、512ビットの4つのバリアントをカバーしていました。

バリアント間の最も重要な違いは、32ビットレジスタ用に設計されているものと64ビットレジスタ用に設計されているものがあります。パフォーマンスに関しては、これが重要な唯一の違いです。

32ビットCPUでは、SHA-224とSHA-256はSHA-2ファミリで唯一の32ビットバリアントであるため、他のバリアントよりもはるかに高速です。 32ビットCPUで64ビット演算を実行すると、複雑さが増すため、32ビットCPUで64ビットバリアントを実行すると遅くなります。

64ビットCPUでは、SHA-224およびSHA-256は他のバリアントよりも少し遅くなります。これは、一度に32ビットしか処理しないため、同じバイト数で処理するために、より多くの操作を実行する必要があるためです。 64ビットバリアントは32ビットバリアントよりもラウンド数が多いため、64ビットバリアントへの切り替えで速度が2倍になることはありません。

2つの32ビットバリアントの内部状態のサイズは256ビットで、4つの64ビットバリアントすべてのサイズは512ビットです。したがって、内部状態の可能なサイズの数は、最終出力の可能なサイズの数よりも少なくなります。大きな内部状態から小さな出力に移行することは、あなたの視点に応じて、良い場合も悪い場合もあります。

出力サイズを固定したままにしておくと、内部状態のサイズを大きくするとセキュリティが向上することが一般に予想されます。内部状態のサイズを固定し、出力のサイズを小さくすると、衝突が発生する可能性が高くなりますが、長さ拡張攻撃が容易になる場合があります。出力サイズを内部状態より大きくしても意味がありません。

64ビットバリアントは(64ビットCPUで)より高速であり、(内部状態が大きいため)より安全である可能性が高いため、64ビットワードを使用して出力が短い2つの新しいバリアントが導入されました。これらは、512/224および512/256として知られているものです。

内部状態よりもはるかに短い出力のバリアントが必要な理由は、通常、使用状況によってはそのような長い出力を使用することが非現実的であるか、特定の入力を取得するアルゴリズムのキーとして出力を使用する必要があるためですサイズ。

最終出力を希望する長さに単純に切り捨てることも可能です。たとえば、HMAC構成では、最終的なハッシュ出力を目的のMAC長に切り捨てることを指定します。 HMACがハッシュの1つの呼び出しの出力を別の呼び出しへの入力としてフィードするため、出力が短いハッシュを使用すると、HMACの内部状態が少なくなります。このため、HMAC-SHA-512を使用し、出力を384ビットに切り捨てるほうが、HMAC-SHA-384を使用するよりも少し安全です。

SHA-2の最終的な出力は、(拡張された入力の長さを処理した後の)内部状態であり、目的の出力ビット数に切り捨てられます。同じ入力でSHA-384とSHA-512が非常に異なって見える理由は、バリアントごとに異なるIVが指定されているためです。

31
kasperd