AES 共通鍵暗号方式の仕組み
皆さん、こんにちは。技術開発グループのn-ozawanです。
気が付けば8月も半ばになりました。あともう少しで夏が終わりますね。
昨今のIT基盤を支える暗号技術、皆さんどれだけ理解されていますか?システム利用者は暗号化を意識する必要はなく、また、システム開発者も既に用意されたAPIを利用することで、ロジックを知らなくてもデータを簡単に暗号化してくれるので、あまり強く意識したことはないかと思います。今日は暗号化技術の1つ、共通鍵暗号方式のお話です。
目次
共通鍵暗号方式
共通鍵暗号方式とは、平文から暗号文への暗号化と、暗号文から平文への復号化を同じ鍵で行う方式です。平文とは、暗号化する前の生のデータのことを言います。暗号文とは暗号化されたデータです。
共通鍵暗号方式の目的は平文を攻撃者に知られないようにすることです。攻撃者に平文を知られるということは、それは情報漏洩を意味します。共通鍵暗号方式で平文を暗号化すれば、攻撃者は共通鍵がないと暗号文から平文へ復号化することが出来ず、平文の内容を見ることが出来ません。
ブロック暗号とストリーム暗号
共通鍵暗号方式の暗号は大きく2つに分類されます。1つは、平文を固定長のブロックに分割して暗号化してく「ブロック暗号」と、平文を1bitないしは1byte単位で暗号化していく「ストリーム暗号」です。
SSL/TLS通信で利用されている、共通鍵暗号方式であるAESはブロック暗号に分類されます。
AES (Advanced Encryption Standard)
2023年現在、共通鍵暗号方式と言えばAESではないでしょうか。SSL/TLSでも採用されている共通鍵暗号方式で、多くの場面で利用されています。
AES以前は、DESと呼ばれる共通鍵暗号方式が多く利用されていました。しかし、コンピュータの演算能力向上による強度低下などにより、NIST(アメリカ国立標準技術研究所)が新しい共通鍵暗号方式を公募し、2000年ごろにAESが採用されました。採用されてから20年以上も利用されているってすごいですね。
AESはブロック暗号方式であり、そのブロック長は128bit (16byte) になります。鍵の長さは128bit、198bit、256bitから選ぶことが出来ます。
鍵長 (bit) | ブロック長 (bit) | ラウンド数 (回) | |
AES-128 | 128 | 128 | 10 |
AES-198 | 192 | 128 | 12 |
AES-256 | 256 | 128 | 14 |
処理の流れ
AESは128bit (16byte) を暗号化します。その暗号化処理では、SubBytes、ShiftRows、MixColumns、AddRoundKeyの4つを行います。下図の背景色が黄色で囲っている処理は、ラウンド数-1回分、繰り返し処理することになります。
SubBytes
SubBytesでは、byte単位に決められた値に変換します。例えば、そのbyteが0x3dの場合、0x27に変換します。
ShiftRows
ShiftRowsでは、SubBytesの出力結果をbyte単位で混ぜます。4 x 4の2次元配列に格納し、2行目以降を決められたbyte数分、左にシフトします。
MixColumns
MixColumnsでは、ShiftRowsの出力結果から、列ごとに計算を行います。
AddRoundKey
AddRoundKeyでは、MixColumnsの出力結果に対してラウンド鍵をXOR演算します。ラウンド鍵とは、共通鍵に対して拡張ルーチンにより導出されたラウンド毎の鍵です。ラウンド鍵はラウンド毎に異なります。
おわりに
今回は「暗号処理って何やってんの?」という疑問から、共通鍵暗号方式であるAESの暗号化について紹介しました。なお、AESの復号化については基本的に同じ流れではありますが、計算する値などが異なりますのでご注意ください。AESの仕様についてはこちらで詳しく公開されていますので、興味ある方はご確認ください。今のところ、AESはどんな攻撃にも耐えており、昨今の暗号技術を支えるアルゴリズムの1つとなっています。
ではまた。