Cipher
暗号化
AES 暗号化の実装を行います。
SubBytes
SubBytes 処理は、状態行列 state の各ブロックに対して、非線形変換である S-box を適用する処理です。
ShiftRows
ShiftRows 処理は、状態行列 state の各行に対して、シフト操作を行う処理です。
1 行目はシフトなし、2 行目は左に 1 シフト、3 行目は左に 2 シフト、4 行目は左に 3 シフトされます。
MixColumns
MixColumns 処理は、状態行列 state の各列に対して、行列演算を行う処理です。
の計算方法は、以下の通りです。
- を 左に 1 シフト
- 最上位ビットが 1 である場合、
0x1B
で XOR
を計算するために を左に 1 シフトする理由
AES では、各バイトは有限体 の要素として扱われます。この有限体は、以下の形で多項式として表現することができます。
有限体 で を計算するということは、バイト に相当する多項式を 1 次多項式 で乗算することを意味します。以下のように多項式全体を 1 次上にシフトすることと同じです。
この左シフト操作は、多項式の係数に を掛けることに相当します。
左シフト後に最上位ビットが 1 である場合、固定値0x1B
を XOR することで剰余を取ります。以下の 関数で実装されています。
x << 1
は左シフト操作です。((x >> 7) & 1)
は、最上位ビットをチェックします。((x >> 7) & 1) * 0x1b
は、最上位ビットが 1 であった場合に の項を除去するために0x1B
を XOR します。
固定値 0x1B
が使用される理由
0x1B
が使用される理由は以下の通りです。
既約多項式 は、AES で使用される有限体 を定義するためのものです。この多項式を 2 進数で表すと、各ビットが多項式の係数に対応します。
左から右に向かって、、、、、、、、、 の係数を表しています。
AES では、乗算結果が 8 ビットを超える場合、すなわち多項式の次数が 8 以上になる場合に、この多項式 での剰余を取ります。
100011011
をそのまま 16 進数に変換した 0x11B
を使用しても動作しますが、ここではuint8_t
を使用しており 9 ビット目以降は無視されるため、 00011011
を 16 進数で表した 0x1B
で XOR を行っています。
以下の式の一行目の行列計算を例にして、mix_columns
関数の動作を説明します。
-
の展開
この部分を元の式に代入します。
-
全体の式の展開
これが、以下のコードに対応します。
AddRoundKey
AddRoundKey 処理は、状態行列 state とラウンド鍵 round_key の XOR 演算を行う処理です。