SHA-2(シャーツー)は、Secure Hash Algorithmシリーズの暗号学的ハッシュ関数で、SHA-1の改良版である。アメリカ国家安全保障局によって設計され、2001年にアメリカ国立標準技術研究所によって連邦情報処理標準 PUB 180-4として標準化された。

## 概要

SHA-2には、前身のSHA-1から多くの改良が加えられている。それ以前のハッシュ関数は、ハッシュ長が固定で、強度もそれによって決まっていた。しかし、SHA-2はSHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256の6つのバリエーションを持ち、ハッシュ長は224、256、384、512ビットのいずれかである。

SHA-256とSHA-512は、それぞれ32ビット、64ビットのワード長から計算されるハッシュ関数である。シフト量と追加定数が異なるが、構造自体は本質的に同一であり、ラウンド数のみが異なる。SHA-224とSHA-384は、それぞれSHA-256とSHA-512を単純に切り詰めたバージョンであり、初期値のみが異なる。SHA-512/224とSHA-512/256は、SHA-256ではなくSHA-512を切り詰めたバージョンである。SHA-2シリーズは   によってカバーされているが、アメリカ合衆国は、この特許をロイヤリティフリーで開放している。

2004年にMD5とSHA-0の強衝突耐性が突破され、翌2005年にはSHA-1の突破方法が発表された。以降も攻撃法の研究が進む、といった事態が起きたため、急遽NIST主導で新たな構造を持つアルゴリズムのSHA-3の公募が2007年から5年かけて進められた。公募後、3年の検証を経て、2015年8月にSHA-2の次のスタンダードとしてSHA-3が制定された。SHA-2にはSHA-1と類似する点もあるものの、後述するように当時憂慮されたような事態にはなっていない(2015年6月現在)。

2014年1月現在、SHA-1に有効な攻撃をSHA-2に拡張することは達成されていない。原像攻撃ではSHA-256にて52ラウンドまで、SHA-512にて57ラウンドまで、衝突攻撃ではSHA-256の46ラウンドまでが最良の攻撃法である。

SHA-2は、日本のCRYPTRECおよびヨーロッパのNESSIEにおいて、推奨暗号として採用されている。

## ハッシュ関数の標準化

FIPS PUB 180-2において、3つのハッシュ関数がSHAシリーズに追加された。これらは出力されるハッシュ長のビット数からそれぞれSHA-256、SHA-384、SHA-512と呼ばれ、SHA-2と総称される。

アルゴリズムは2001年のFIPS PUB 180-2の草稿にて発表され、レビューやコメントが寄せられた。2002年8月、FIPS PUB 180-2は新たな標準 "Secure Hash Standard" として認定され、1995年に制定されたFIPS PUB 180-1を置き換えた。FIPS PUB 180-2には、180-1で規定されたSHA-1も含まれている。

2004年2月、FIPS PUB 180-2のChange Noticeとして、鍵を2つ用いるトリプルDESの鍵長に合うように定義されたSHA-224が追加された。2008年10月、FIPS PUB 180-3が制定されたが、これはSHA-224をChange Noticeから標準自体に取り込むほかには本質的な変化はなかった。この更新は、ハッシュ関数のセキュリティ情報の更新と、これらSHA-2をSpecial Publications 800-107および800-57において使用することを推奨するためのものであった。詳細なテストデータとハッシュの例が標準から除去され、別文書とされた。

2011年1月、NISTはSP800-131Aを発表した。これは、連邦政府組織におけるセキュリティ強度の下限について、それまでの80ビット(SHA-1によって得られる強度)の使用を2013年末までに限定し、それ以降は112ビット(SHA-224によって得られる強度)を下限とするものである。

2012年3月、FIPS PUB 180-4が制定され、SHA-512を切り詰めたバージョンとしてSHA-512/224とSHA-512/256が追加された。また、入力データのパディングをハッシュ計算の前に行なうこととしていた制限が撤廃され、リアルタイムでの音声や映像などにおけるハッシュ計算をコンテンツ生成と同時に行うことが可能となった。最終ブロックのパディングのみは、引き続きハッシュ出力の前に行なうこととされている。

2012年7月、NISTは暗号鍵管理に関するガイドラインであるSP800-57を改訂した。これは、2007年版において112ビット未満の電子署名の生成を2010年末までとしていたものを2013年までに変更するものである。2012年8月にはSP800-107にも同様の変更がなされた。

NISTは2012年に、かねてからコンペティションを進行させていたSHA-3の選出を行った。コンペティションの趣旨により(詳細はSHA-3の記事などを参照)SHA-3はSHA-2(およびそれ以前の関数)とは類似しないものになっている。

## 用途

SHA-2ハッシュ関数は、TLS/SSL、OpenPGP、SSH、S/MIME、IPsec、Bitcoinといった広く使われているアプリケーションやプロトコルで利用されている。SHA-256は、Debian GNU/Linuxのソフトウェアパッケージの認証や、DKIMにおけるメッセージ署名標準として利用されている。SHA-512は、ルワンダ国際戦犯法廷におけるビデオアーカイブの認証に用いられている。SHA-256およびSHA-512は、DNSSECでの利用が提唱されている。UnixやLinuxのベンダーでは、パスワードの安全なハッシュ法としてSHA-256やSHA-512への移行を始めている。

SHA-1とSHA-2は、アメリカ合衆国において機密情報を扱う際に法律によって要求されるハッシュアルゴリズムの一つである。FIPS 180-1では、SHA-1を私的にあるいは商業で用いることも推奨している。SHA-1は合衆国政府での利用はほぼ終了しており、NISTでは「連邦組織は、電子署名、タイムスタンプ、衝突への耐性を必要とするアプリケーションでのSHA-1の利用を可及的速やかに中止すべきである。2010以降はSHA-2を利用すべきである」としている。

SHA-2はセキュリティ的にSHA-1より優れているものの、SHA-1ほど広くは用いられていない。その理由として、Microsoft Windows XPのSP2以前がSHA-2をサポートしていないことや、SHA-1において実際の衝突が発見されていなかったために緊迫感に欠けたことが挙げられる。ただし後者については、2017年に2月23日にGoogleとオランダの研究機関CWI Instituteが共同で2つの異なるファイルから同じSHA-1ハッシュ値を生成する衝突に成功した。

また、Windows XPのサポート終了などの背景から、公的機関でのSHA-1の使用を原則的に終了する動きがあり、民間のウェブサイトでもSHA-2へ移行するケースが出始めた(詳細はSHA-1#概要を参照)。

## 攻撃と認証

ハッシュ長が L ビットであるハッシュ関数において、与えられた特定のハッシュに対応する元のメッセージを見つけることは、総当たり攻撃では 2 の試行で可能である。これは原像攻撃と呼ばれる。一方、同じハッシュを与える2つの異なるメッセージを見つけることは衝突攻撃と呼ばれ、およそ 2 の試行で可能である。

SHA-3選定におけるハッシュ関数の解析への興味の増加によって、SHA-2への新しい攻撃が報告されている。最良の攻撃法を下のテーブルに示す。現時点では衝突攻撃のみが現実的な可能性を有しているが、フルバージョンのSHA-2に対する攻撃は成功していない。
Fast Software Encryption 2012において、ソニーの研究者によって、SHA-256で52ラウンドまで、SHA-512で57ラウンドまでbiclique疑似原像攻撃に基づく疑似衝突攻撃が可能であることが報告された。

| 発表 | 発表年 | 攻撃法 | 攻撃 | 対象 | ラウンド数 | 試行 |
| --- | --- | --- | --- | --- | --- | --- |
| New Collision attacks Against Up To 24-step SHA-2 | 2008 | Deterministic | 衝突 | SHA-256 | 24/64 | 2 |
| SHA-512 | 24/80 | 2 |
| Preimages for step-reduced SHA-2 | 2009 | 中間一致 | 原像 | SHA-256 | 42/64 | 2 |
| 43/64 | 2 |
| SHA-512 | 42/80 | 2 |
| 46/80 | 2 |
| Advanced meet-in-the-middle preimage attacks | 2010 | 中間一致 | 原像 | SHA-256 | 42/64 | 2 |
| SHA-512 | 42/80 | 2 |
| Higher-Order Differential Attack on Reduced SHA-256 | 2011 | 差分解読 | 疑似衝突 | SHA-256 | 46/64 | 2 |
| 46/64 | 2 |
| Bicliques for Preimages: Attacks on Skein-512 and the SHA-2 family | 2011 | Biclique | 原像 | SHA-256 | 45/64 | 2 |
| SHA-512 | 50/80 | 2 |
| 疑似原像 | SHA-256 | 52/64 | 2 |
| SHA-512 | 57/80 | 2 |

### 公的認証

FIPSに認定されたすべての関数の実装は、NISTとCommunications Security Establishment Canada (CSEC)によるCryptographic Module Validation Programの認定を申請することが可能である。2013年現在、SHA-256については1300以上、SHA-512については900以上の実装が認定されている。

## ハッシュ値の例

空の入力に対するハッシュ値:

入力メッセージのわずかな違いも、出力されるハッシュ値に大きな変化を及ぼす。例えば、メッセージの最後にピリオドを加えた場合:

## 疑似コード

SHA-256アルゴリズムの疑似コードは以下の通りである。

`ch` および `maj` の計算は、SHA-1と同様の手法により最適化できる。

SHA-224は本質的にSHA-256と同じであるが、以下の点が異なる。

- 初期値 `h0` から `h7` が異なる
- `h7` を除去することで出力が得られる

SHA-512の構造は本質的にSHA-256と同じであるが、以下の点が異なる。

- メッセージが512ビットごとではなく1024ビットごとのチャンクに分けられる
- 初期値とラウンド定数が64ビットに拡張されている
- ラウンド数が64から80に変更されている
- メッセージ配列wは64個の32ビットワードではなく、80個の64ビットワードを持つ
- メッセージ配列wを拡張するためのループは16~63ではなく16~79
- ラウンド定数が最初の80個の素数 2..409 に基づいている
- 演算に用いられるワード長が64ビットである
- 末尾に追加されるメッセージ長が128ビットのビッグエンディアンである
- シフトとローテートの数が異なる

SHA-384は本質的にSHA-512と同じであるが、以下の点が異なる。

- 初期値 `h0` から `h7` が異なる
- `h6` および `h7` を除去することで出力が得られる

SHA-512/tは本質的にSHA-512と同じであるが、以下の点が異なる。

- 初期値 `h0` から `h7` は SHA-512/t IV generation function によって与えられる
- `h0` から `h7` の t ビット目までで切り詰めることで出力が得られる
- t が384となることは認められていない(SHA-384を使うべきである)
- t が224および256であるものが認定されている

## SHAシリーズの比較

- 表
- 話
- 編
- 歴

暗号学的ハッシュ関数の比較

| アルゴリズムとバリエーション | | 出力長 (bits) | 内部状態長 (bits) | ブロック長 (bits) | 最大メッセージ長 (bits) | ラウンド数 | ビット演算 | セキュリティ強度 (bits) | パフォーマンスの例 (MiB/s) |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| MD5 | | 128 | 128 (4 × 32) | 512 | 2 − 1 | 64 | And, Xor, Rot, Add (mod 2), Or | <64(強衝突) | 335 |
| SHA-0 | | 160 | 160 (5 × 32) | 512 | 2 − 1 | 80 | And, Xor, Rot, Add (mod 2), Or | <80(強衝突) | - |
| SHA-1 | | 160 | 160 (5 × 32) | 512 | 2 − 1 | 80 | <63  (衝突発見) | 192 |
| SHA-2 | SHA-224   SHA-256 | 224   256 | 256 (8 × 32) | 512 | 2 − 1 | 64 | And, Xor, Rot, Add (mod 2), Or, Shr | 112 128 | 139 |
| SHA-384   SHA-512   SHA-512/224   SHA-512/256 | 384   512   224   256 | 512 (8 × 64) | 1024 | 2 − 1 | 80 | And, Xor, Rot, Add (mod 2), Or, Shr | 192 256 112 128 | 154 |
| SHA-3 | SHA3-224   SHA3-256   SHA3-384   SHA3-512 | 224   256   384   512 | 1600 (5 × 5 × 64) | 1152   1088   832   576 | 制限なし | 24 | And, Xor, Rot, Not | 112 128 192 256 | - |
| SHAKE128   SHAKE256 | d(可変長)   d(可変長) | 1344   1088 | d/2と128のいずれか小さい方   d/2と256のいずれか小さい方 | - |

| CPUアーキテクチャ | クロック周波数 | アルゴリズム | ワード長 (bits) | Cycles/Byte x86 | MiB/s x86 | Cycles/Byte x86-64 | MiB/s x86-64 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Intel Ivy Bridge | 3.5 GHz | SHA-256 | 32-bit | 16.80 | 199 | 13.05 | 256 |
| SHA-512 | 64-bit | 43.66 | 76 | 8.48 | 394 |
| AMD Piledriver | 3.8 GHz | SHA-256 | 32-bit | 22.87 | 158 | 18.47 | 196 |
| SHA-512 | 64-bit | 88.36 | 41 | 12.43 | 292 |

'x86' と表記されたパフォーマンス値は64ビットのプロセッサで32ビットのコードを実行したもの、'x86-64' と表記されたパフォーマンス値は64ビットのプロセッサで64ビットのコードを実行したものである。SHA-256は32ビット計算向けに設計されているが、64ビットプロセッサ向けの最適化の恩恵を受けている。SHA-512の32ビット環境での実装は、64ビット環境でのものと比較すると有意に遅くなっている。これら2つのアルゴリズムの変種(SHA-256ではSHA-224、SHA-512ではSHA-384、SHA-512/224、SHA-512/256)のパフォーマンスは、これらと同等である。MD5およびSHA-1の最適な実装の実効速度は4.5 - 6 Cycles/Byteである。このテストはイリノイ大学シカゴ校のhydra8システム(クロック周波数3.5 GHzのIntel Xeon E3-1275 V2)およびhydra9システム(クロック周波数3.8 GHzのAMD A10-5800K)によるものである。

## 実装ライブラリ

SHA-2をサポートしているライブラリは以下の通り。

- Botan
- Bouncy Castle
- cryptlib
- Crypto++
- Libgcrypt
- Mbed TLS
- libsodium
- Nettle
- LibreSSL
- OpenSSL
- GnuTLS
- wolfSSL