Metod för att expandera nyckel till runda nycklar i AES
AES använder ett nyckelschema för att expandera en kort nyckel till ett antal separata runda nycklar. De tre AES-varianterna har olika antal omgångar. Varje variant kräver en separat 128-bitars rund nyckel för varje runda plus en till. Nyckelschemat producerar de nödvändiga runda nycklarna från den initiala nyckeln.
Runda konstanter
Värden på rc i i hexadecimal
i
1
2
3
4
5
6
7
8
9
10
rc i
01
02
04
08
10
20
40
80
IB
36
Den runda konstanten rcon i för omgång i av nyckelexpansionen är 32-bitarsordet:
r c o
n
i
=
[
r
c
i
00
16
00
16
00
16
]
{\displaystyle rcon_{i}={\begin{bmatrix}rc_{i}&00_{16}&00_{16}&00_{16}\end{ bmatrix}}}
där rc i är ett åttabitars värde definierat som:
r
c
i
=
{
1
om
i = 1
2 ⋅ r
c
i − 1
om
i > 1
och
r
c
i − 1
<
80
16
( 2 ⋅ r
c
i − 1
) ⊕
11B
16
om
i > 1
och
r
c
i − 1
≥
80
16
{\displaystyle rc_{i}={\begin{cases}1&{\text{if }}i=1\\2\cdot rc_{i-1}&{\text{if }}i >1{\text{ och }}rc_{i-1}<80_{16}\\(2\cdot rc_{i-1})\oplus {\text{11B}}_{16}&{\text {if }}i>1{\text{ och }}rc_{i-1}\geq 80_{16}\end{cases}}}
där
⊕
{\displaystyle \oplus }
är den bitvisa XOR- operatorn och konstanter som 00 16 och 11B 16 ges i hexadecimal . Motsvarande:
r
c
i
=
x
i − 1
{\displaystyle rc_{i}=x^{i-1}}
där bitarna av rc i behandlas som koefficienterna för ett element i det finita fältet
G F
( 2 ) [ x ]
/
(
x
8
+
x
4
+
x
3
+ x + 1 )
{\displaystyle {\rm {{GF }(2)[x]/(x^{8}+x^{4}+x^{3}+x+1)}}} , så att t.ex.
r
c
10
=
36
16
=
00110110
2
{
\displaystyle rc_{10}=36_{16}=00110110_{2}}
representerar polynomet
x
5
+
x
4
+
x
2
+ x
{\displaystyle x^{5}+x^{4}+x^{2}+x }
.
AES använder upp till rcon 10 för AES-128 (eftersom 11 runda nycklar behövs), upp till rcon 8 för AES-192 och upp till rcon 7 för AES-256.
Nyckelschemat
AES-nyckelschema för en 128-bitars nyckel.
Definiera:
N som längden på nyckeln i 32-bitars ord: 4 ord för AES-128, 6 ord för AES-192 och 8 ord för AES-256
K 0 , K1 nyckeln , ... KN - 1 som 32-bitars ord i den ursprungliga
R som antalet runda nycklar som behövs: 11 runda nycklar för AES-128, 13 nycklar för AES-192 och 15 nycklar för AES-256
W 0 , W 1 , ... W 4 R -1 som 32-bitarsorden i den utökade nyckeln
Definiera även RotWord som ett vänstercirkulärt skift på en byte :
RotWord (
[
b
0
b
1
b
2
b
3
]
) =
[
b
1
b
2
b
3
b
0
]
{\displaystyle \operatorname {RotWord} ({\begin{bmatrix}b_{0}&b_{1}&b_{2} &b_{3}\end{bmatrix}})={\begin{bmatrix}b_{1}&b_{2}&b_{3}&b_{0}\end{bmatrix}}}
och SubWord som en tillämpning av AES S-box på var och en av ordets fyra byte:
SubWord (
[
b
0
b
1
b
2
b
3
]
) =
[
S (
b
0
)
S (
b
1
)
S (
b
2
)
S (
b
3
)
]
{\displaystyle \operatorname {SubWord} ({\ start{bmatrix}b_{0}&b_{1}&b_{2}&b_{3}\end{bmatrix}})={\begin{bmatrix}\operatörsnamn {S} (b_{0})&\operatörsnamn {S } (b_{1})&\operatörsnamn {S} (b_{2})&\operatörsnamn {S} (b_{3})\end{bmatrix}}}
Sedan för
0
i = … 4 R − 1
{\displaystyle i=0\ldots 4R-1}
:
Wi
=
{
K
)
om
i < N
−
(
Wi
n
− N
⊕ SubWord ( RotWord (
Wi
− 1
)
⊕ r c o
i
mod
/ N
om
i ≥ N
och
i ≡
0
N
i
N )
W
_ _ _
⊕ Underord (
Wi
i
− 1
)
om
i ≥ N
,
N > 6
, och
≡ 4 (
mod N ) W
i
− N ⊕
W
i
− 1 annars
.
i
{\displaystyle W_{i}={\begin{cases}K_{i}&{\text{if }}i<N\\W_{iN}\oplus \operatorname {SubWord} (\operatörsnamn {RotWord} (W_ {i-1}))\oplus rcon_{i/N}&{\text{if }}i\geq N{\text{ och }}i\equiv 0{\pmod {N}}\\W_{iN }\oplus \operatörsnamn {SubWord} (W_{i-1})&{\text{if }}i\geq N{\text{, }}N>6{\text{ och }}i\equiv 4 {\pmod {N}}\\W_{iN}\oplus W_{i-1}&{\text{annars.}}\\\end{cases}}}
Anteckningar
externa länkar