GCM【Galois/Counter Mode】AES-GCM
GCMとは?

ブロック暗号は固定長のデータを一定の手順で暗号化する手法で、長いデータ全体を暗号化するには一定の長さに区切って繰り返し暗号化処理を適用必要がある。このとき、どのような手順で繰り返しを行うかを定めた規則を「暗号利用モード」という。
GCMはモードの一つで、暗号化に「CTRモード」(カウンターモード)を採用している。CTRモードでは、連番のカウンタ値を暗号化してから元データとXOR演算することで暗号文を生成する。ブロックを順番に処理する必要がなく並列処理が可能なため、大量データを扱う通信でも高速に動作する。
GCMでは暗号化と並行して、「ガロア体」(有限体)と呼ばれる数学的構造を使った計算で「認証タグ」を生成する。受信側は届いたデータから同じ手順でタグを計算し、送られてきた値と照合する。内容が一文字でも改竄されていればタグが一致しなくなるため、不正を即座に検出できる。
このように、暗号化と認証を一体で行う方式を「認証付き暗号」(AEAD:Authenticated Encryption with Associated Data)と呼ぶ。従来は暗号化と認証を別々のアルゴリズムで組み合わせる必要があり、処理順序を誤ると脆弱性につながる場合もあったが、GCMはその問題を構造的に回避している。
GCMを使う際は、「nonce」(ナンス)と呼ばれる使い捨ての初期値を通信ごとに用意する必要がある。同じ鍵とnonceの組み合わせを再利用すると暗号文の構造が露わになり、最悪の場合は鍵の復元も可能になる。乱数や通信ごとのカウンタでnonceを管理するのが一般的な対策である。認証タグは128ビットが標準で、短くするほど偽造への耐性が下がるため、みだりに縮小すべきではないとされる。なお、現在の主要なCPUにはガロア体演算を高速化する専用命令が実装されており、サーバからスマートフォンまで幅広い環境で効率よく処理できる。