暗号・ハッシュ実験室

← トップへ
CRYPTOGRAPHY IN YOUR BROWSER

似た文字列でも、役割はまったく違う

ハッシュは指紋、HMACは秘密鍵付きの改ざん検知、暗号化は元に戻せる秘密化です。入力はサーバーへ送信しません。

● ブラウザ内だけで処理
ハッシュ一方向。内容が同じか確かめる
HMAC送信者と内容が正しいか確かめる
AES-GCM内容を隠し、改ざんも検知する

このページで使うアルゴリズム

SHA-2

入力を一定長の「指紋」へ変換する一方向ハッシュ関数群。SHA-256は256bit、SHA-384は384bit、SHA-512は512bitを出力します。

用途:データ照合・署名処理の部品。暗号化ではないため復号鍵はありません。
HMAC-SHA-256

SHA-256へ秘密鍵を安全な形で組み合わせたメッセージ認証コードです。鍵を知らなければ正しい値を作れません。

用途:APIリクエスト、Webhook、Cookieなどの送信者確認と改ざん検知。
PBKDF2 + AES-256-GCM

PBKDF2がパスワードを25万回処理して256bit鍵を作り、AES-GCMが暗号化と改ざん検知を同時に行います。

Saltは鍵の使い回しを防ぎ、IVは暗号結果を毎回変えます。どちらも秘密ではありません。

1. SHA-2ハッシュ

入力全体を固定長の値へ圧縮します。1文字違うだけで結果が大きく変わり、結果から元の文章を現実的に復元できないよう設計されています。

できること:手元の内容が、信頼できる相手から受け取ったハッシュと一致するか確認する。
できないこと:誰が作った値か証明する。攻撃者は文章を書き換えた後、新しいハッシュも計算できるためです。
未計算

2. HMACで送信者と改ざんを確認

送信側と受信側だけが同じ秘密鍵を持ち、「文章+秘密鍵」から認証コードを作ります。文章・鍵のどちらが変わっても検証に失敗します。

HMACの意義:普通のハッシュは誰でも再計算できますが、HMACは秘密鍵を知らない攻撃者には正しい認証コードを作れません。内容そのものは隠さず、「鍵を持つ相手が作った」「途中で変わっていない」を確認します。
未計算
作成後、文章や秘密鍵を変えて検証してみてください。

3. パスワードで暗号化・復号

AESは同じ鍵で暗号化・復号する共通鍵暗号です。この実験ではAES-256-GCMを使い、内容を読めなくするだけでなく、暗号データの改ざんも認証タグで検知します。入力したパスワードをそのまま鍵にはせず、PBKDF2-SHA-256で25万回処理して鍵を作ります。

毎回結果が違う理由:ランダムなSaltとIVを毎回生成するためです。JSON内のSalt・IV・反復回数は復号に必要なので公開して構いません。秘密にする必要があるのはパスワードです。
復号結果

アルゴリズムをもう少し詳しく

実験ボタンの裏側で何が行われているかを説明します。項目をクリックすると開きます。

SHA-256はどうやってハッシュを作るのか

具体的な値を全部見る

まず文字列を置き、その文字列から作られる値を順番に表示します。既定値 abc はSHA-256の標準的な確認例です。

UTF-8バイト--
元の長さ--
パディング後--
処理ブロック数--
先頭に追加するbit1(最初の追加byteは 80)
末尾64bitの元データ長--

パディング後の全バイト

--

最終SHA-256

--

全体の流れ

  1. 文字をバイト列にする:このページでは文章をUTF-8へ変換します。同じ見た目でも文字コードやUnicode正規化が違えば別のバイト列になり、別のハッシュになります。
  2. パディングする:末尾へ1bit、その後へ0bitを加え、長さが「448 mod 512」になるまで埋めます。最後に元データのbit長を64bit整数で付け、全体を512bitの倍数にします。
  3. 512bitずつ分割する:各ブロックを16個の32bit語 W[0]~W[15]として読み、回転・シフト・加算でW[16]~W[63]まで拡張します。
  4. 内部状態を64回混ぜる:a~hという8個の32bit値を64ラウンド更新します。初期値と定数は素数の平方根・立方根の小数部から決めた公開値で、秘密鍵ではありません。
  5. 状態へ足し戻す:64ラウンド後のa~hを処理前の状態へmod 2³²で加えます。次のブロックはこの結果から始めます。
  6. 256bitを出力する:全ブロック処理後の8個の32bit値をつなぎ、通常は64桁の16進数で表示します。

メッセージスケジュール

16語のブロックを64語へ展開し、入力の影響を全ラウンドへ広げます。ROTRは右回転、SHRは右シフトです。

W[t] = σ1(W[t−2]) + W[t−7] + σ0(W[t−15]) + W[t−16] (mod 2³²)
σ0(x) = ROTR⁷(x) XOR ROTR¹⁸(x) XOR SHR³(x)
σ1(x) = ROTR¹⁷(x) XOR ROTR¹⁹(x) XOR SHR¹⁰(x)

1ラウンドの中心

T1 = h + Σ1(e) + Ch(e,f,g) + K[t] + W[t]
T2 = Σ0(a) + Maj(a,b,c)
新しい a = T1 + T2 / 新しい e = d + T1
Ch(Choose)eの各bitを条件に、fかgのbitを選びます。Maj(Majority)a・b・cの各bitについて多数決を取ります。Σ0・Σ1異なる位置へのbit回転をXORし、局所的な差を全体へ拡散します。K[t]各ラウンド固有の公開定数。同じ状態の繰り返しを避けます。

なぜ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段階でハッシュします。

HMAC(K, m) = H((K′ XOR opad) || H((K′ XOR ipad) || m))

ipadopad は規格で決められた別々の定数です。この構造は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を生成します。

注意点

MD5やSHA-1は新しい安全用途には向きません。パスワード保存には単純なSHA-256ではなく、Argon2・scrypt・bcrypt・PBKDF2など専用方式とソルトを使います。このAES実験は学習用です。重要データには十分長いパスワードと実績ある暗号ソフトを使ってください。