暗号・ハッシュ実験室
← トップへ似た文字列でも、役割はまったく違う
ハッシュは指紋、HMACは秘密鍵付きの改ざん検知、暗号化は元に戻せる秘密化です。入力はサーバーへ送信しません。
● ブラウザ内だけで処理このページで使うアルゴリズム
入力を一定長の「指紋」へ変換する一方向ハッシュ関数群。SHA-256は256bit、SHA-384は384bit、SHA-512は512bitを出力します。
用途:データ照合・署名処理の部品。暗号化ではないため復号鍵はありません。SHA-256へ秘密鍵を安全な形で組み合わせたメッセージ認証コードです。鍵を知らなければ正しい値を作れません。
用途:APIリクエスト、Webhook、Cookieなどの送信者確認と改ざん検知。PBKDF2がパスワードを25万回処理して256bit鍵を作り、AES-GCMが暗号化と改ざん検知を同時に行います。
Saltは鍵の使い回しを防ぎ、IVは暗号結果を毎回変えます。どちらも秘密ではありません。1. SHA-2ハッシュ
入力全体を固定長の値へ圧縮します。1文字違うだけで結果が大きく変わり、結果から元の文章を現実的に復元できないよう設計されています。
できないこと:誰が作った値か証明する。攻撃者は文章を書き換えた後、新しいハッシュも計算できるためです。
2. HMACで送信者と改ざんを確認
送信側と受信側だけが同じ秘密鍵を持ち、「文章+秘密鍵」から認証コードを作ります。文章・鍵のどちらが変わっても検証に失敗します。
3. パスワードで暗号化・復号
AESは同じ鍵で暗号化・復号する共通鍵暗号です。この実験ではAES-256-GCMを使い、内容を読めなくするだけでなく、暗号データの改ざんも認証タグで検知します。入力したパスワードをそのまま鍵にはせず、PBKDF2-SHA-256で25万回処理して鍵を作ります。
アルゴリズムをもう少し詳しく
実験ボタンの裏側で何が行われているかを説明します。項目をクリックすると開きます。
SHA-256はどうやってハッシュを作るのか
具体的な値を全部見る
まず文字列を置き、その文字列から作られる値を順番に表示します。既定値 abc はSHA-256の標準的な確認例です。
パディング後の全バイト
最終SHA-256
全体の流れ
- 文字をバイト列にする:このページでは文章をUTF-8へ変換します。同じ見た目でも文字コードやUnicode正規化が違えば別のバイト列になり、別のハッシュになります。
- パディングする:末尾へ1bit、その後へ0bitを加え、長さが「448 mod 512」になるまで埋めます。最後に元データのbit長を64bit整数で付け、全体を512bitの倍数にします。
- 512bitずつ分割する:各ブロックを16個の32bit語 W[0]~W[15]として読み、回転・シフト・加算でW[16]~W[63]まで拡張します。
- 内部状態を64回混ぜる:a~hという8個の32bit値を64ラウンド更新します。初期値と定数は素数の平方根・立方根の小数部から決めた公開値で、秘密鍵ではありません。
- 状態へ足し戻す:64ラウンド後のa~hを処理前の状態へmod 2³²で加えます。次のブロックはこの結果から始めます。
- 256bitを出力する:全ブロック処理後の8個の32bit値をつなぎ、通常は64桁の16進数で表示します。
メッセージスケジュール
16語のブロックを64語へ展開し、入力の影響を全ラウンドへ広げます。ROTRは右回転、SHRは右シフトです。
σ0(x) = ROTR⁷(x) XOR ROTR¹⁸(x) XOR SHR³(x)
σ1(x) = ROTR¹⁷(x) XOR ROTR¹⁹(x) XOR SHR¹⁰(x)
1ラウンドの中心
T2 = Σ0(a) + Maj(a,b,c)
新しい a = T1 + T2 / 新しい e = d + T1
なぜ1文字で全体が変わるのか
入力の1bit差が、語の展開、加算の桁上がり、Choose・Majorityを通じて広がるためです。理想的には出力bitの約半分が変わります。これを雪崩効果と呼びます。ただしハッシュは暗号化ではなく、短く推測可能な入力は候補を総当たりして特定できます。
SHA-384・SHA-512はSHA-256と何が違うのか
3方式はすべてSHA-2ファミリーです。SHA-384/512は64bit語、1024bitブロック、80ラウンドを使い、SHA-256は32bit語、512bitブロック、64ラウンドを使います。
- SHA-256:256bit出力。広く使われ、32bit環境でも扱いやすい方式です。
- SHA-512:512bit出力。64bit CPUではSHA-256より速い場合もあります。
- SHA-384:SHA-512系の処理と専用の初期値を使い、最終状態の先頭384bitを出力します。SHA-512の表示を単純に切っただけではありません。
出力が長いほど衝突に対する余裕は増えますが、どれも「パスワードを1回だけハッシュして保存する」用途には速すぎます。
HMAC-SHA-256は何を加えているのか
単純な SHA-256(鍵 || 文章) ではなく、鍵をブロック長へ整形し、内側と外側の2段階でハッシュします。
ipad と opad は規格で決められた別々の定数です。この構造はSHA-256の長さ拡張攻撃などを避けます。秘密鍵を知らない相手は文章を書き換えて正しいHMACも作り直せません。HMACは文章を暗号化しないため、内容自体は読めます。
PBKDF2とAES-256-GCMは何をしているのか
PBKDF2-SHA-256
パスワードを直接AES鍵にせず、ランダムなSaltとHMAC-SHA-256を使って繰り返し処理します。このページは25万回です。各段の出力をXORして鍵材料を作るため、攻撃者も候補ごとに同じ回数の計算が必要です。Saltは同じパスワードから同じ鍵ができるのを防ぎますが、秘密ではありません。
AES-256
128bitのブロックへ、SubBytes(置換)、ShiftRows(並べ替え)、MixColumns(列の混合)、AddRoundKey(ラウンド鍵とのXOR)を繰り返す共通鍵暗号です。256bit鍵では14ラウンド行います。
GCM
カウンターモードで暗号文を作り、同時にGHASHという有限体上の演算で認証タグを作ります。暗号文・IV・認証タグのどれかが変われば復号に失敗します。同じ鍵でIVを再利用すると安全性が大きく壊れるため、このページは毎回96bitのランダムIVを生成します。