AES
(Advanced Electronic Signature は AdES)
高度暗号化規格 Advanced Encryption Standard
NIST FIPS PUB 197 (2023年更新あり)
DOI https://doi.org/10.6028/NIST.FIPS.197-upd1
https://csrc.nist.gov/News/2023/nist-updates-fips-197-advanced-encryption-standard
ISO/IEC 18033-3 ブロック暗号
NISTのDESの後継としてRijndaelというものが採用された共通鍵暗号規格。ブロック暗号。
基本は 128bit, 192bit, 256bitの鍵長、128bit の暗号化。暗号利用モードと組み合わせて使用する。
ガロア体などを使う。
2023年5月 update 1が出てる? 表記などの変更のみでアルゴリズムに変更はない。
関連?
RFC 3394 AES Key Wrap Algorithm
RFC 3962 Advanced Encryption Standard (AES) Encryption for Kerberos 5
RFC 5288 AES Galois Counter Mode (GCM) Cipher Suites for TLS
RFC 5649 Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm
ラウンド鍵(RoundKey)の生成と4つの処理の組み合わせ
SubBytes
ShiftRows
MixColumns
AddRoundKey
復号
AddRoundKey
InvMixColumns
InvShiftRows
InvSubBytes
暗号化、復号共に順序を変えたり変換表をつかう事で高速化も可能。CPUでもAES-NIなど対応コードなどを持つものがある。
とりあえず原理的なところ?
RoundKey
RoundKey を先に作るとよいかもしれない
鍵の長さにあわせてRoundKeyの作り方が少しだけ違う。RoundKeyの数も違ってくる。
AES-128 で 10 Round
AES-192 で 12 Round
AES-256 で 14 Round
のRoundKeyを作ることになる
1つは128bit
データ
16byte (128bit)単位に分割して4x4バイトで並べる(ふりをする)
図的には横ではなく縦に並べる
table:block1
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
SubBytes
S-Box という変換表を使って1バイトを別の1バイトに置き換える
1 から 16 まで同じことをする
S-Boxの作り方はガロア体など難しいので省略しておく ほとんどの解説ではごまかしているよ
ShiftRows
移動する
table:前
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
table:後
1 5 9 13
6 10 14 2
11 15 3 7
16 4 8 12
2行目を左シフト
3行目を 2バイトシフト (左x2)
4行目を右シフト (左x3)
のように移動する
最終的に
table: 列
1 6 11 16 5 10 15 4 9 14 3 8 13 2 7 12
の順になる
MixColumns
ガロア体か何かを使った掛け算
列ごとに行う
ここは計算することもできるが、計算結果をあらかじめ作っておいて変換表を使うと高速
AddRoundKey
あらかじめ計算したRoundKey と XOR
ひとまずここまでで1セット。これをRoundKeyの長さにあわせて何回か繰り返す
table:Round
AES-128 10回
AES-192 12回
AES-256 14回
暗号化はこれくらい。複合は逆の処理が同じような感じであるだけ
高速化
SubBytes と ShiftRows は相互に関係ないことをしているので順番の入れ換えができます
SubBytes と MixColumns の変換表を合体、1回で両方の結果が出るものを作ります
Sub+Mixに渡すパラメータでShiftRowsの並び替えをしながらにすれば1つにごろっと固まります
最後にAddRoundKeyとあわせて1ループの完成
1バイト単位の処理より64bitのAddRoundKey処理のほうが速いので全体的にlong型2つに入れて作り直すと高速です