AES
-Advanced Encryption Standard-
2021/06/25発表
@S0R4Suk7
輪講資料
1
0.使用書籍、論文
2
使用書籍、論文
【主題本】
暗号技術のすべて
【副読】
NIST FIPS197 AES
https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf
※追記
(注意)
高専4年の学生である私がゼミの輪講資料として作成したものです。
一部端折ったり説明不足である点があります。
また間違っている点があるかもしれませんので、信用しすぎないでください。
3
1.AESとは
4
AESとは
Advanced Encryption Standard(高度暗号化標準)の略
1997年にアメリカ国立標準技術研究所(NIST)の主導で公募が
行なわれ、いくつか候補があった中でRijndaelという暗号方式
がAESとして選出された。
「AES」というワード自体はRijndael以外の候補となった暗号
も含むが、一般的にはRijndaelのことを指す。
5
何に使われているのか
Wi-Fi,STL/TTL,ファイルの圧縮などの暗号化に使われている。
特にWi-Fiは一般的なワードとして世間に浸透しているが、そ
の暗号化方式や安全性については理解していない人が多い
AESとは何か?
を調べると、Wi-FiのWPA2に採用されていると出てくる
WPA2とは?
6
Wi-Fiの暗号化
Windowsでネットワークの設定
をみると「セキュリティの種類」
が表示されている
セキュリティの種類には3種ある
・WPA2-PSK
・WPA-PSK
・WEP
※パーソナルはPSKを使うやり方を表している
※エンタープライズというものもあるが今回は省略
7
Wi-Fiの暗号化
認証プロトコル 暗号化プロトコル 暗号化アルゴリズム
WPA2-PSK
CCMP AES
TKIP RC4
WPA-PSK
CCMP AES
TKIP RC4
WEP WEP RC4
8
Wi-Fiの暗号化
認証プロトコル 暗号化プロトコル 暗号化アルゴリズム
WPA2-PSK
CCMP AES
TKIP RC4
WPA-PSK
CCMP AES
TKIP RC4
WEP WEP RC4
現状多くのWi-Fiルータで使われているのはWPA2-PSK
WPA2に対応してない機器ではWPAが使われている
WEPは古くてしょぼいので使われない
※数年前から新しいWPA3も出ているが、ややこしくなるので省略
9
AESの分類について
間違ってはいけないのはAESが
暗号化アルゴリズムであること
暗号化のやり方の一つという認識はちょっと違う
○暗号化方式 AES、DES、RC4
×暗号化の規格 WPA2、WPA
暗号化のプロトコルと暗号化のアルゴリズムはだいたい同じという認識でOK
10
他の暗号化アルゴリズムとの比較
・AES
通信データを区切り、置き換え・並び替えのセットを複数回繰り返すアルゴリズム
セキュリティが最も強固
・DES/3DES
一定量のデータをブロック単位で暗号化するアルゴリズム
ブロック長が56bitと短く傍受されやすい
・RC4
ブロック長を自由に設定できるアルゴリズム
ストリーム暗号。現在は数時間程度で破られてしまう
11
2.暗号化処理
12
改めてAESとは
・暗号化の方式の一つ
・ブロック長が128ビットのブロック暗号
・鍵長は128、192、256ビットに対応している
・SPN構造を採用している
・1ラウンドで4つの処理を行う
13
改めてAESとは 復習1
・ブロック長が128ビットのブロック暗号
ブロック暗号
一定の大きさの平文(データを一定の長さごとに区切って) を
処理する暗号
AESは128ビットごとに区切って暗号化していく。
14
改めてAESとは 復習2
・鍵長は128、192、256ビットに対応している
鍵長によって処理を実行する回数(ラウンド数)が違う
暗号化は4Wordごとに行う(後述)。
そのためKeyの数は鍵長を32bitで割った値となる
鍵長によってラウンド数が変わる
鍵長 Key(Nk) Round(Nr)
AES-128 4 10
AES-192 6 12
AES-256 8 14
15
改めてAESとは 復習3
・SPN構造を採用している
SPN構造
・換字処理と転置処理を繰り返し適用する構造
・全ビットにサブ鍵を作用可能
・ラウンド数が小さい
・暗号化と復号が同じアルゴリズムにならない
16
改めてAESとは
・1ラウンドで4つの暗号化のための処理を行う
暗号化処理の流れ
1.SubBytes(換字処理)
2.ShiftRows(転置処理)
3.MixCulmns(演算による線形変換)
4.AddRoundKey(サブ鍵との排他的論理和)
それぞれ処理自体は単純。
17
AESの処理手順 大まかな流れ
最初にAddRoundKeyを行う
その後以下を(Nr-1)回繰り返す
・SubBytes
・ShiftRows
・MixColumns
・AddRoundKey
最後に以下を実行する
(MixColumnsは実行しないことに注意)
・SubBytes
・ShiftRows
・AddRoundKey
AESの暗号化手順
(ACRi)
18
AESの処理手順 はじめに
ここから先は原理的(数学的に)に成り立ちを考えたい…だが、高専4年の時点では数学的に考える上
で必要な基礎知識が全く足りていない(習っていない数学的知識が多分に含まれている。)
→今回の輪講ではAESでの「サブ鍵作成アルゴリズム」、「暗号化、復号アルゴリズム」
について”理解できた気になる”ことを目標にして発表を行いたい。
文字で表していると大変なので、NISTに従い以下の定義に従って書いていく。
暗号対象のデータ
input in0,in1,in2...in15
暗号化されたデータ
output out0,out1,out2...out15
処理中のデータ
state s0,0/s1,0/s2,0/.../s0,1/s1,1/.../s3,3
鍵(key)
key k0,k1,k2...k(4Nk-1)
19
AESの処理手順 はじめに
AESでは1ブロック(128bit)を4×4の正方行列とみる。
処理中の正方行列をStateと呼ぶ
1要素1byte(8bit)、1列が1Word(4byte=32bit)
→処理を列または行ごとに行うからKeyの数は鍵長を1Wordで割った値になる
以降の処理はこの正方行列が頻出するので頭の片隅に入れておいてください
NIST FIPS197より
20
AddRoundKey
AddRoundKey
Word(列)ごとにround keyとstateのXORをとる
round keyは鍵生成アルゴリズムによって暗号鍵から生成する
鍵生成アルゴリズム→KeyExpansion(最後に説明)
21
SubBytes
SubBytes
128bitの入力データを8bitごとに
区切り、各ブロックごとに換字変換
を行う関数。
置換表(S-box)に沿って変換を行う。
S-boxの計算方法は後々。
例題
入力データaが以下のとき、結果は?
(1)a=0011 0001b
22
SubBytes
SubBytes
128bitの入力データを8bitごとに
区切り、各ブロックごとに換字変換
を行う関数。
例題
平文aが以下のとき、結果は?
(1)a=0011 0001b
x=0011=0x3
y=0001=0x1
A.0xC7=1100 0111b
23
SubBytes 補足
S-boxの算出方法
24
入力ビット
アフィン変換の式
アフィン変換の式
出力 出力
ShiftRows
ShiftRows
右図のようにデータを入れ替える
r行目に対してr-1の左ローテート
を行う
例題
|1|2|3|4|
|5|6|7|8|
|9|A|B|C|
|D|E|F|0|
をShiftRowsにかけるとどうなる?
25
ShiftRows
ShiftRows
右図のようにデータを入れ替える
r行目に対してr-1の左ローテート
を行う
例題
|1|2|3|4|→ |1|2|3|4|
|5|6|7|8|→ |6|7|8|5|
|9|A|B|C|→ |B|C|9|A|
|D|E|F|0|→ |E|F|0|D|
26
MixColumns
MixColumns
線形処理を行っていく関数。
以下の行列計算を行う
ここで、通常の行列計算とは少し計算の方法が異なることに注意する
通常はS0,i
′
= 𝑥・ 𝑆0,𝑖 + 𝑥 + 1 ・ 𝑆1,𝑖 + 𝑆2,𝑖 + 𝑆3,𝑖
だが、MixColumnsでは
+をXOR、・を次の既約多項式を法とする多項式の積とする
𝑥8 + 𝑥4 + 𝑥3 + 𝑥 + 1 →2ページ先で解説
27
MixColumns
1ページ前で説明したことを元にMixColumnsの列変換式は以下の形。
変換式は上の通り(x)、({02}・x)、({03}・x)の3種類。
(x)はそのままの値、({02}・x)は2倍なので1ビットシフト、
({03}・x)は2倍+1倍と考え、1ビットシフトしたうえで加算をする。
ここで、足したりシフトすると8ビットで表せなくなることがある(桁あふれ)
ここでさっきの既約多項式の話が出てくる。
28
MixColumns
桁あふれが起きたとき、数学の表現で「既約多項式を使用して剰余を
取る」という計算を行う。(暗号技術のすべてP.178 ステップ2)
既約多項式:𝑥8 + 𝑥4 + 𝑥3 + 𝑥 + 1
また、ここでは2進数8ビットを多項式として表して考える
例:11011011→𝑥7 + 𝑥6 + 𝑥4 + 𝑥3 + 𝑥 + 1
これを1ビット左シフトすると、8次を超えるので剰余を取る
→なお、剰余を取る方法は割り算だけではない。
XORは、(a+b)mod2の計算結果、つまり剰余とも表せる。
既約多項式 のうちx8 は桁あふれでなくなるので、 𝑥4 以下のみ考えると、
0x1BでXORを取ればよい。
29
MixColumns 補足① 群・環・体
30
MixColumns 補足② 既約多項式
既約多項式
【定義】
Aを単位的可環とする。
定数でないA上の多項式𝑓(𝑥)が定数とf(x)の定数倍を除くA上の全ての多項式で割り
切れないとき、f(x)をA上既約と呼ぶ。
【定理】
体K上の定数でないすべての多項式𝑓(𝑥)は、K上の既約多項式𝑓1 𝑥 , … , 𝑓𝑟(𝑥)の積に、
𝑓 𝑥 = 𝑓1 𝑥 … 𝑓𝑟 𝑥 …と分解することができる。
この表示は、𝑓1 𝑥 , … , 𝑓𝑟(𝑥)の順序と定数倍の違いを除いてただ1通りである。
参考: https://wkmath.org/irred-poly-f.html
31
3.暗号化実例
32
NISTのFIPS197に実例が公開されているのでこの1ラウンド分の処理をみてみる
原理を知る前に実例をみてみる
33
入力と暗号鍵をまずは4×4の正方行列に成形していく
入力はState、暗号鍵はRoundKeyとなる
これに対してそれぞれ先ほど説明した暗号化処理を行っていく
実例 正方行列化
32 88 31 e0
43 5a 31 37
f6 30 98 07
a8 8d a2 34
2b 28 ab 09
7e ae f7 cf
15 d2 15 4f
16 a6 88 3c
State RoundKey
34
Stateを入力として、RoundKeyとのXORを取る
0x32→00110010 0x43→01000011
0x2b→00101011 0x7e→01111110
XOR →???????? XOR →????????
実例 AddRoundKey
32 88 31 e0
43 5a 31 37
f6 30 98 07
a8 8d a2 34
2b 28 ab 09
7e ae f7 cf
15 d2 15 4f
16 a6 88 3c
State RoundKey
35
+
Stateを入力として、RoundKeyとのXORを取る
0x32→00110010 0x43→01000011
0x2b→00101011 0x7e→01111110
XOR →00011001→0x19 XOR →00111101→0x3d
実例 AddRoundKey
32 88 31 e0
43 5a 31 37
f6 30 98 07
a8 8d a2 34
2b 28 ab 09
7e ae f7 cf
15 d2 15 4f
16 a6 88 3c
State RoundKey
19 a0 9a e9
3d f4 c6 f8
e3 e2 8d 48
be 2b 2a 08
State'
36
+ =
Stateを入力として、S-boxの表を参照しながら換字を行っていく
0x19→0xd4 0x3d→0x27 0xe3→0x11 0xbe→0xae...
実例 SubBytes
State
19 a0 9a e9
3d f4 c6 f8
e3 e2 8d 48
be 2b 2a 08
37
Stateを入力として、S-boxの表を参照しながら換字を行っていく
実例 SubBytes
State
S-box
19 a0 9a e9
3d f4 c6 f8
e3 e2 8d 48
be 2b 2a 08
State'
d4 e0 b8 1e
27 bf b4 41
11 98 52 52
ae f1 e5 30
38
Stateを入力として、r行目-1回左ローテートを行う
実例 ShiftRows
State State'
d4 e0 b8 1e
27 bf b4 41
11 98 52 52
ae f1 e5 30
d4 e0 b8 1e
27 bf b4 41
11 98 52 52
ae f1 e5 30
1byte
2byte
3byte
0byte
ローテート量
39
Stateを入力として、r行目-1回左ローテートを行う
実例 ShiftRows
State
ShiftRows
d4 e0 b8 1e
bf b4 41 27
52 52 11 98
30 ae f1 e5
State'
d4 e0 b8 1e
27 bf b4 41
11 98 52 52
ae f1 e5 30
40
Stateを入力として、GF(28)との行列の積をとる
ここで、Stateの各要素も多項式として表してみる(左1列だけで一旦考える)
0xd4=11010100=??????
実例 MixColumns
State
d4 e0 b8 1e
bf b4 41 27
52 52 11 98
30 ae f1 e5
x x+1 1 1
1 x x+1 1
1 1 x x+1
x+1 1 1 x
GF(𝟐𝟖
)
×
41
Stateを入力として、GF(28)との行列の積をとる
ここで、Stateの各要素も多項式として表してみる(左1列だけで一旦考える)
0xd4=11010100=𝑥7 + 𝑥6 + 𝑥4 + 𝑥2
実例 MixColumns
x x+1 1 1
1 x x+1 1
1 1 x x+1
x+1 1 1 x
GF(𝟐𝟖)
×
42
State(左)
𝑥7 + 𝑥6 + 𝑥4 + 𝑥2
𝑥7
+ 𝑥5
+ 𝑥4
+ 𝑥3
+ 𝑥2
+ 𝑥 + 1
𝑥6 + 𝑥4 + 𝑥3 + 𝑥2 + 1
𝑥5
+ 𝑥4
MixColumnsでは+をXOR、・を次の既約多項式を法とする多項式の積とすること
を念頭に置き、行列の計算を行う。
多項式でXORの計算
係数付き多項式の計算は剰余の計算なので+も-も関係ない。→偶数個は0になる
実例 MixColumns
43
𝑥8 + 𝑥7 + 𝑥5 + 𝑥3
⊕𝑥8 + 𝑥6 + 𝑥5 + 𝑥4 + 𝑥3 + 𝑥2 + 𝑥
⊕ 𝑥7
+𝑥5
+ 𝑥4
+ 𝑥3
+ 𝑥2
+ 𝑥 + 1
⊕ 𝑥6
+ 𝑥4
+ 𝑥3
+ 𝑥2
+ 1
⊕ 𝑥5 + 𝑥4
=𝑥2
110101000
⊕101111110
⊕010111111
⊕001011101
⊕000110000
=000000100
=0x04
係数付き多項式 2進数
実例 MixColumns
State
d4 e0 b8 1e
bf b4 41 27
52 52 11 98
30 ae f1 e5
x x+1 1 1
1 x x+1 1
1 1 x x+1
x+1 1 1 x
GF(2)
×
04 e0 48 28
66 cb f8 06
81 19 d3 26
e5 9a 7a 4c
=
State'
行列の積の計算を行った結果
44
AddRoundKeyをする前に、RoundKey'をRoundKeyから生成する
色んなサイトなどでAESの解説を見たが、ここについて書かれていることは少ない
NISTのFIPS197をみると、RoundKeyが変わっているのが分かるはず
この変化するRoundKeyが、サブ鍵と呼ばれるもの
ラウンドごとに計算し直している。
計算方法は「暗号技術のすべて」168ページに書いてある
(またはFIPS197 KeyExpansion)
AddRoundKey…の前に 復習4
45
KeyExpansion
KeyExpansion
Key(1つ前のRoundKey)からRoundKeyを作成する関数
AES-128のRoundKey作成手順は右下の通り
SubWord処理や
RotWord処理
を使いRoundKeyを作成する
(似た処理を暗号化で使っている。後述)
「暗号技術のすべて」は
日本語で手順が書いてあり
わかりづらいのでNISTの
FIPS197でコードを見る。
AES-128のRoundKey作成手順(Qiita:AESを理解する)
46
KeyExpansion
47
KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)
begin
word temp
i = 0
while (i < Nk)
w[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[4*i+3])
i = i + 1
end while
i = Nk
while (i < Nb * (Nr+1))
temp = w[i-1]
if (i mod Nk = 0)
temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
else if (Nk > 6 and i mod Nk = 4)
temp = SubWord(temp)
end if
w[i] = w[i-Nk] xor temp
i = i + 1
end while
end
FIPS197に書いてある
疑似コード
C言語とアセンブラが
混ざったような形を
しているが、今回は
大まかな流れを掴み
たいだけなので特に
別言語に変換はしない
実例 KeyExpansion
48
逐次コードを参照しながらFIPS197に書いてあるAES-128のサブ鍵作成例を
読んで理解していく。w[i]={4byte}={32bit}
AES-128はその名の通り鍵長が128bitである
→つまり、ラウンドごとの鍵はw[i]4つ分
w[0]={2b7e1516}
w[1]={28aed2a6}
w[2]={abf71588}
w[3]={09cf4f3c}
---ここまでで1セット---
w[4]={???}←ここから計算による鍵の作成を行っていく
i = 0
while (i < Nk)
w[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[4*i+3])
i = i + 1
end while
w[0]~w[3]までの疑似プログラム
最初のRoundKeyはCipher Keyとして自分で任意に決めた鍵の値 (初期値)w[0]~w[3]
実例 KeyExpansion
まずw[4]を作ることを考える
tempにはひとつ前の鍵要素を
入れる
w[3]は{09cf4f3c}
RotWord
1byte分左ローテートをする
09cf4f3cは、
|09|cf|4f|3c|
と考えると
AES-128のRoundKey作成例
49
while (i < Nb * (Nr+1))
temp = w[i-1]
if (i mod Nk = 0)
temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
実例 KeyExpansion
RotWord
1byte分左ローテートをする
09cf4f3cは、
|09|cf|4f|3c|
と考えると、
|cf|4f|3c|09|
となる。
AES-128のRoundKey作成例
50
while (i < Nb * (Nr+1))
temp = w[i-1]
if (i mod Nk = 0)
temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
実例 KeyExpansion
SubWord
SubWordはS-boxの表に
基づいた換字を行う
「暗号技術のすべて」p.174
を参照しながらSubBytesと
同じように処理をすると、
|cf|4f|3c|09|
から
|8a|84|eb|01|
AES-128のRoundKey作成例
51
while (i < Nb * (Nr+1))
temp = w[i-1]
if (i mod Nk = 0)
temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
実例 KeyExpansion
RotWord,SubWord処理をしたら
RconとXORする、とある
Rcon
RconはRoundConstantの略で、
ラウンドコンスタント定数と訳す
定数と書いてあるが、コードを
見るとわかるように計算している
Rcon[変数iをKey数Nkで割った値]
これを使ってtempとXORを行う AES-128のRoundKey作成例
52
while (i < Nb * (Nr+1))
temp = w[i-1]
if (i mod Nk = 0)
temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
実例 KeyExpansion
Rcon
XORをやっていく
temp={8a84eb01}
Rcon={01000000}
0はXORしても変わらないから、
aと1だけを考える
0xa=1010
0x1=0001
xor=1011=b
よって、temp={8b84eb01} AES-128のRoundKey作成例
53
while (i < Nb * (Nr+1))
temp = w[i-1]
if (i mod Nk = 0)
temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
実例 KeyExpansion
長々とやってきたKeyExpantionの最後の処理
を考える
今回はw[4]を作ることを考えている。また鍵数Nk=4より、
w[0] ={2b7e1516}
={00101011011111100001010100010110}
temp ={8b84eb01}
={10001011100001001110101100000001}
XOR ={10100000111110101111111000010111}
={a0fafe17}
作成例のサブ鍵例と一致→
これを繰り返すことで各ラウンドのカギを作っている
(なおi%4=!0(左から2列目以降)のときはRotWord/SubWord/Rconは実行しない)
54
w[i] = w[i-Nk] xor temp
Stateを入力として、RoundKeyとのXORを取る
0x04→00000100 0x66→01100110
0xa0→10100000 0xfa →11111010
XOR →???????? XOR →????????
実例 AddRoundKey
a0 88 23 2a
fa 54 a3 6c
fe 2c 39 76
17 b1 39 05
State RoundKey
55
04 e0 48 28
66 cb f8 06
81 19 d3 26
e5 9a 7a 4c
+
Stateを入力として、RoundKeyとのXORを取る
0x04→00000100 0x66→01100110
0xa0→10100000 0xfa →11111010
XOR →10100100→0xa4 XOR →10011100→0x9c
実例 AddRoundKey
a0 88 23 2a
fa 54 a3 6c
fe 2c 39 76
17 b1 39 05
State RoundKey
56
04 e0 48 28
66 cb f8 06
81 19 d3 26
e5 9a 7a 4c
a4 68 6b 02
9c 9f 5b 6a
7f 35 ea 50
f2 2b 43 49
State'
+ =
平文(Input)と暗号鍵(Cipher Key)を使って
・AddRoundKey(暗号鍵との排他的論理和)
・SubBytes(換字処理)
・ShiftRows(転置処理)
・MixColumns(演算による線形変換)
・KeyExpansion(暗号鍵からのサブ鍵の作成)
・AddRoundKey(サブ鍵との排他的論理和)
の暗号化処理を一通り実行することが出来た。
→復号をしてみる
実例 おわり
57
ここまでやってみた
4.復号処理
58
AESは色々な処理を組み合わせたSPN構造だが、復号の手順も意外と単純
暗号化処理の手順を逆にしていくことで復号ができる
?なぜ復号化ができるのか
SubBytes:S-boxを見ると、要素が同じセルがない
→間違った復号をすることがなく、また1:1の処理である
ShiftRows:左ローテートしただけなので右ローテートするだけ
MixColumns:乗法的逆元(※)をとった多項式をかければよい
AddRoundKey:XORをかけているだけなので、XORをかけ直せば元の列に戻る
※乗法的逆元とは、ある数xに対してかけると1になるもののことをいう。
※係数付き多項式は有限体ではないので必ず逆元が存在するとは限らないが、AESで使われている係数付き多
項式は逆元が存在するよう作られている(後期で使う教科書である「情報の論理数学入門」などで群論を学ばな
いと理解できないので割愛)。
AESの復号
59
復号処理
・1ラウンドで4つの処理を行う、暗号化の逆の手順
復号処理の流れ
1.InvAddRoundKey
2.InvMixColumns
3.InvShiftRows
4.InvSubBytes
なお、InvはInverse(逆)の略
InvAddRoundKeyは処理がXORを取っているだけで暗号化と一緒なので説明省略
60
InvSubBytes
SubBytesとの違い
S-boxのテーブルが異なる
→算出に用いる計算式が逆元(逆行列)
を取るようになっている
61
InvShiftRows
ShiftRowsとの違い
ShiftRowsは左ローテート、InvShitRowsでは右ローテートを行う。
62
ShiftRows InvShiftRows
InvMixColumns
MixColumnsとの違い
簡単にするとMixColumnsは
列単位で以下の計算をしていた
右の行列は ↑こいつ の逆行列を計算すると
出るので興味ある人はやってみてください
InvMixColumnsは列単位で
以下の計算をする
ちなみにこれが成り立つのは行列の掛け算は積に
逆行列をかけたら元の行列に戻ることを思い出し
てもらえれば分かると思います。
63
5.復号実例
64
暗号化で示した実例が元に戻ることを確かめてみる(ダイジェスト)
元の平文 :3243f6a8885a308d313198a2e0370734
RoundKey :a0fafe1788542cb123a339392a6c7605
State :a49c7ff3689f352b6b5bea43026a5049
実例 正方行列化
a0 88 23 2a
fa 54 a3 6c
fe 2c 39 76
17 b1 39 05
a4 68 6b 02
9c 9f 5b 6a
7f 35 ea 50
f3 2b 43 49
State' RoundKey
65
Stateを入力として、RoundKeyとのXORを取る
0xa4→10100100 0x9c→10011100
0xa0→10100000 0xfa→ 11111010
XOR →00000100→0x04 XOR →01100110→0x66
実例 AddRoundKey
State' RoundKey
66
+
a0 88 23 2a
fa 54 a3 6c
fe 2c 39 76
17 b1 39 05
a4 68 6b 02
9c 9f 5b 6a
7f 35 ea 50
f3 2b 43 49
04 e0 48 28
66 cb f8 06
81 19 d3 26
e5 9a 7a 4c
=
State
それぞれ多項式に直して席の掛け算を行う。
過程は大変なので書かないがやり方は一緒。
実例 InvMixColumns
GF 𝟐𝟖 −𝟏
×
67
State'
=
04 e0 48 28
66 cb f8 06
81 19 d3 26
e5 9a 7a 4c
d4 e0 b8 1e
bf b4 41 27
52 52 11 98
30 ae f1 e5
State
State'を入力として、r行目-1回右ローテートを行う
実例 InvShiftRows
State' State
d4 e0 b8 1e
27 bf b4 41
11 98 52 52
ae f1 e5 30
1byte
2byte
3byte
0byte
ローテート量
68
d4 e0 b8 1e
bf b4 41 27
52 52 11 98
30 ae f1 e5
State'を入力として、S-boxの表を参照しながら換字を行っていく
0xd4→0x19 0x27→0x3d 0x11→0xe3 0xae→0xbe...
実例 InvSubBytes
State'
69
d4 e0 b8 1e
27 bf b4 41
11 98 52 52
ae f1 e5 30
State'を入力として、S-boxの表を参照しながら換字を行っていく
実例 InvSubBytes
State
S-box
70
State'
19 a0 9a e9
3d f4 c6 f8
e3 e2 8d 48
be 2b 2a 08
d4 e0 b8 1e
27 bf b4 41
11 98 52 52
ae f1 e5 30
State'を入力として、RoundKeyとのXORを取る
0x19→00011001 0x3d→00111101
0x2b→00101011 0x7e→01111110
XOR →00110010→0x32 XOR →01000011→0x43
実例 AddRoundKey
19 a0 9a e9
3d f4 c6 f8
e3 e2 8d 48
be 2b 2a 08
2b 28 ab 09
7e ae f7 cf
15 d2 15 4f
16 a6 88 3c
State' RoundKey
71
+
32 88 31 e0
43 5a 31 37
f6 30 98 07
a8 8d a2 34
State
=
無事復元が完了した。
これでAESの暗号化及び復号の流れを一通り確認することが出来た。
実例 おわり
72
32 88 31 e0
43 5a 31 37
f6 30 98 07
a8 8d a2 34
State
一致
6.安全性
73
ここまで暗号化及び復号を試行してみた。
だが、動作原理も暗号処理手順も復号処理手順も明らかになっているAESは、安全
性という面について心配になるかもしれない。
ここからはAESが高い安全性を持っている言われる理由についてである。
なお、暗号方式の安全性強度の評価は
「どれくらいの時間をかけたら暗号が解けるのか?」という値を用いる。
【参考】
・暗号技術のすべて
・兵庫県立大学大学院応用情報科学研究科 五十部 孝典
暗号技術に基づくサイバーセキュリティ
安全性
74
まず、前提としてAESはブロック暗号であり、SPN構造である。
ブロック暗号では攻撃者がブロック暗号にブルートフォース攻撃を行うとすると、
秘密鍵の長さをkとすると探索すべき秘密鍵の総数は2𝑘である。
膨大な数である上、AESでは鍵をラウンドごとに変えている。
現実問題として、全探索は難しいことが分かる。
また、ブロック長が128ビットのとき、誕生日攻撃で必要になる容量は
𝟐𝟔𝟒 = 𝟐𝟔𝟖𝟒𝟑𝟓𝟒𝟓𝟔𝑻𝑩である。
必要容量より、誕生日攻撃のリスクは抑えることができているとわかる。
安全性 ブロック暗号的観点
75
では、非線形変換処理部において効率がいい攻撃方法である差分解読法と線形解読
法ではどうだろうか?
差分解読法
AESのS-boxは一定の入力に対する差分になるべく偏りが出ないように設計されて
いる。
どういうことか?
差分解読法は、2つ以上の平文を暗号化した際にどれだけの変化が起きるか、つま
り差分をしようして統計的パターンを発見しようとする方法である。
S-boxはその差があまり出ないように設計されている、ということである。
具体的な確率を計算すると8ラウンド目を超えた時点で全探索より効率が悪くなる
(らしい)。
安全性 差分解読法と線形解読法
76
では、非線形変換処理部において効率がいい攻撃方法である差分解読法と線形解読
法ではどうだろうか?
線形解読法
S-boxは非線形な処理を行う換字表である。
つまり、通常線形な関係式は導出できない。
ちなみに
S-boxへの入力がランダムであると仮定した時、その入出力の間の線形関係式が成
立する確率を計算することはできるらしい。(参照:https://trap.jp/post/641/)
計算すると、成立確率は8ラウンド目を超えた時点で全探索より低くなってしまう
(らしい)。
安全性 差分解読法と線形解読法
77
これまでAESの安全性について書いてきた。
8ラウンド目までは全探索より効率がいい手法があるが、AESは鍵長が最低の128
ビットの時点で10ラウンド、192ビットでは12、256では14ラウンドある。
それにより、安全性が確保されていることがおおよそ理解できたと思う。
しかし、現在は高い安全性があり実装も比較的容易であることから多くのサービス
やシステムに組み込まれているAESだが、これまでの暗号の効率的な解読手法が生
み出されている歴史から予測を立てると、2030年にはAES-128が破られると考え
られている。
しばらくはAESを使っていても問題ないが、私たちが現役の年齢であるうちに破ら
れるということである。長期にわたって使われるようなサービスを開発する際には
AESでは力不足であるかもしれない。
今後も暗号については勉強する必要があることがわかった。
安全性 将来性
78
【質問】
・10ページ
暗号化アルゴリズムの方法といってはいけない理由?
【先生のコメント】(補足説明)
・アフィン変換
幾何学
線形→直線
直線ってことは方程式が出る
係数は変換そのもの
行列だけで積を変えるのは線形変換ということ
原点(0)は動かしちゃだめだけど向きを変えるとき、これも線形変換である
---ここまでは線形変換---
平行移動だけならベクトルの概念でいける
でもこれをやると原点(0)から動かしているということで、線形ではなくな
る
スライドのアフィン変換の右側に出てくる一列→ベクトル【平行移動】
---これはアフィン変換---
アフィン変換=線形変換+平行移動(非線形)
・GF
GF(2^8)[x]/既約多項式
既約多項式はx^8を含む式であること
の結果は必ずx^7以下になる。
マックス8項になる。→桁あふれが発生しない
→係数が0または1となる
1ビット分のデータだからGF(2)になる
既約多項式の割り算が発生するが、割り算は時間が掛かるので出来るだけし
たくない
既約多項式で割り切れたら0なので(剰余の世界だから)、
既約多項式=0 より、
x^8
=x^4+x^3+x+1
=0x1BでXOR
発表後のコメント
79

AESについて 輪講資料