暗号化
データを第三者が読めない形式に変換する技術。復号鍵を持つ者だけが元のデータを復元できる。
暗号化とは、平文 (プレーンテキスト) を暗号文に変換し、正当な復号鍵を持つ者だけが元のデータを読めるようにする技術です。インターネット上の通信傍受、データベースへの不正アクセス、デバイスの盗難など、さまざまな脅威からデータを保護するために不可欠な技術であり、現代の情報セキュリティの根幹を成しています。
暗号化方式は大きく 2 つに分類されます。共通鍵暗号 (対称鍵暗号) は暗号化と復号に同じ鍵を使う方式で、AES (Advanced Encryption Standard) が代表格です。処理速度が速く大量データの暗号化に適していますが、鍵の安全な受け渡しが課題となります。公開鍵暗号 (非対称鍵暗号) は暗号化用の公開鍵と復号用の秘密鍵のペアを使う方式で、RSA や楕円曲線暗号 (ECC) が代表的です。鍵配送問題を解決しますが、処理速度は共通鍵暗号より遅くなります。
実際の通信では、両方式を組み合わせたハイブリッド暗号が使われます。HTTPS 通信の TLS プロトコルでは、まず公開鍵暗号で共通鍵を安全に交換し、その後の通信は高速な共通鍵暗号で行います。AES-256 は 2026 年時点で最も広く使われている共通鍵暗号の一つで、256 ビットの鍵長を持ち、総当たり攻撃に対して事実上解読不可能とされています。
暗号化とハッシュ化は混同されやすい概念です。暗号化は復号鍵があれば元のデータに戻せる「可逆変換」ですが、ハッシュ化は元のデータに戻せない「不可逆変換」です。パスワードの保存にはハッシュ化 (bcrypt、Argon2 など) を使い、通信データの保護には暗号化を使うのが正しい使い分けです。暗号化でパスワードを保存すると、鍵が漏洩した場合に全パスワードが復元されるリスクがあります。文字数の観点では、bcrypt が入力を 72 バイトで打ち切る仕様が落とし穴になります。UTF-8 の日本語は 1 文字 3 バイトになるため、日本語のパスフレーズは 24 文字を超えた部分がハッシュに反映されません。長いパスフレーズを許可する設計では、Argon2 のように入力長の制約が緩いアルゴリズムを選ぶか、あらかじめ SHA-256 などで固定長に畳んでから渡す必要があります。
用途を限定した方式として、エンドツーエンド暗号化 (E2EE) があります。送信者と受信者の間でのみ復号が可能で、サービス提供者でさえ内容を読めない仕組みです。Signal や WhatsApp などのメッセージングアプリで採用されています。また、量子コンピュータの発展に備えた耐量子暗号 (ポスト量子暗号) の標準化も進んでおり、NIST は 2024 年 8 月に FIPS 203 (ML-KEM)・FIPS 204 (ML-DSA)・FIPS 205 (SLH-DSA) の 3 件を公開しました。既存の RSA や楕円曲線暗号を置き換えていく前提の規格であり、鍵や署名のサイズが従来より大きくなる点が移行時の設計上の論点になります。
文字数の観点では、暗号化されたデータは元のデータよりも長くなることが一般的です。AES はブロック長が 16 バイトなので、CBC モードのパディングで 1〜16 バイト増え、さらに初期化ベクトル (IV) 16 バイトを暗号文の先頭に付ける実装が一般的です。Base64 エンコードを併用すると、そこから約 33% 増加します。たとえば ASCII の 100 文字 (100 バイト) を AES-256-CBC で暗号化すると暗号文は 112 バイトになり、Base64 で 152 文字、IV を含めると 172 文字です。同じ 100 文字でも日本語なら UTF-8 で 300 バイトあるため、暗号文 304 バイト・Base64 で 408 文字、IV を含めて 428 文字まで膨らみます。AES-GCM のような認証付き暗号ではさらに認証タグ 16 バイトが加わります。
したがって、API のリクエストサイズ制限やデータベースのカラムサイズは「文字数」ではなく平文のバイト数から逆算する必要があります。目安として、必要な桁数は「平文バイト数を 16 の倍数に切り上げ、IV とタグの分を足し、4 / 3 倍して 4 の倍数に切り上げる」形で求められます。日本語を扱うカラムでは、平文の文字数に対して 4 倍強の余裕を見ておくと破綻しにくくなります。