AES
(Advanced Electronic Signature は AdES) Advanced Encryption Standard
NIST FIPS PUB 197 (2023年更新あり) ISO/IEC 18033-3 ブロック暗号
基本は 128bit, 192bit, 256bitの鍵長、128bit の暗号化。暗号利用モードと組み合わせて使用する。 2023年5月 update 1が出てる? 表記などの変更のみでアルゴリズムに変更はない。
関連?
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つの処理の組み合わせ
復号
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つに入れて作り直すと高速です