arrow-left

All pages
gitbookPowered by GitBook
1 of 1

Loading...

Rijndael Finite Field

circle-info

A first time reader might skip this section and go directly to the description of the round transformations, then come back later (it is mostly useful to understand the construction of the operation MC and SB).

Each byte in AES is viewed as an element of a binary finite field of 256 elements, where it can always be represented as a polynomial of degree at most 7 with coefficients inF2\mathbf{F}_2F2​. The construction of the finite field is made as the quotient ringF2[x]/f(x)\mathbf{F}_2[x]/f(x)F2​[x]/f(x), wherefffis an irreducible polynomial of degree 8 inF2[x]\mathbf F_2[x]F2​[x]so the ring becomes a field.

In AES, the choice foris

We can check with SageMath that it is irreducible:

hashtag
Matching Bytes as Finite Field Elements

A byte is composed of 8 bits and is matched to a polynomial as

For instance, take the byte 3a whose binary decomposition is and becomes the polynomial

hashtag
Polynomial Reduction

Polynomials of degree 8 or more can always be reduced, using the fact that in the finite field, we have , so we have the relation

Why not ? In fact, that's also true, but the coefficient are in so the additive inverse of is itself.

In SageMath, this reduction can be produced in one of the following methods.

Method 1: Remainder of an Euclidean division by

Method 2: Image in the quotient ring

Method 3: Using the Finite Field class of SageMath directly.

On this page we use this last method. Also, this helper converts an element of the finite field to the hexadecimal representation of a byte, and could be useful in the examples:

hashtag
Addition

The addition of two polynomials is done by adding the coefficients corresponding of each monomial:

And as the addition of the coefficients is in, it corresponds to the bitwise xor operation on the byte.

hashtag
Multiplication

Multiplication of two polynomials is more complex (one example would be the , more efficient than the naive algorithm). For an implementation of AES, it is possible to only use the multiplication by , whose byte representation is 02.

Letan element and we consider the multiplication by:

All coefficients are shifted to a monomial one degree higher. Then, there are two cases:

  • Ifis, then we have a polynomial of degree at most 7 and we are done;

  • Ifis, we can replacebyduring the reduction phase:

This can be used to implement a very efficient multiplication bywith the byte representation:

  1. A bitwise shiftleft operation: (b << 1) & 0xff;

  2. Followed by a conditional addition with 1b if the top bit of is .

Here an example in SageMath (we use the finite field construction of method 3):

fff
f(x)=x8+x4+x3+x+1.f(x) = x^8 + x^4 + x^3 + x + 1.f(x)=x8+x4+x3+x+1.
bbb
(b7,…,b0)2(b_7, \ldots, b_0)_2(b7​,…,b0​)2​
b7x7+b7x6+β‹―+b1x+b0.b_7x^7 + b_7 x^6 + \cdots + b_1 x + b_0.b7​x7+b7​x6+β‹―+b1​x+b0​.
(0,0,1,1,1,0,1,0)2(0, 0, 1, 1, 1, 0, 1, 0)_2(0,0,1,1,1,0,1,0)2​
0β‹…x7+0β‹…x6+1β‹…x5+1β‹…x4+1β‹…x3+0β‹…x2+1β‹…x+0=x5+x4+x3+x.0\cdot x^7 + 0\cdot x^6 + 1\cdot x^5 + 1\cdot x^4 + 1\cdot x^3 + 0\cdot x^2 + 1\cdot x + 0 = x^5 + x^4 + x^3 + x.0β‹…x7+0β‹…x6+1β‹…x5+1β‹…x4+1β‹…x3+0β‹…x2+1β‹…x+0=x5+x4+x3+x.
f(x)=0f(x) = 0f(x)=0
x8=x4+x3+x+1x^8 = x^4 + x^3 + x + 1x8=x4+x3+x+1
x8=βˆ’x4βˆ’x3βˆ’xβˆ’1x^8 = - x^4 - x^3 - x - 1x8=βˆ’x4βˆ’x3βˆ’xβˆ’1
F2\mathbf F_2F2​
βˆ’1-1βˆ’1
111
fff
F2[x]/f(x)\mathbf{F}_2[x]/f(x)F2​[x]/f(x)
βˆ‘i=07aixi+βˆ‘i=07bixi=βˆ‘i=07(ai+bi)xi.\sum_{i=0}^7 a_ix^i + \sum_{i=0}^7 b_ix^i = \sum_{i=0}^7(a_i + b_i)x^i.i=0βˆ‘7​ai​xi+i=0βˆ‘7​bi​xi=i=0βˆ‘7​(ai​+bi​)xi.
F2\mathbf{F}_2F2​
xxx
b7x7+β‹―+b1x+b0b_7x^7 + \cdots + b_1x + b_0b7​x7+β‹―+b1​x+b0​
xxx
xΓ—(b7x7+β‹―+b1x+b0)=b7x8+b6x7+β‹―b1x2+b0x.x\times (b_7x^7 + \cdots + b_1x + b_0) = b_7x^8 + b_6x^7 + \cdots b_1 x^2 + b_0x.xΓ—(b7​x7+β‹―+b1​x+b0​)=b7​x8+b6​x7+β‹―b1​x2+b0​x.
b7b_7b7​
000
b7b_7b7​
111
x8x^8x8
x4+x3+x+1x^4 + x^3 + x + 1x4+x3+x+1
xΓ—(x7+b6x6+β‹―+b1x+b0)=x8+b6x7+β‹―b1x2+b0x=(x4+x3+x+1)+b6x7+β‹―+b1x2+b0x\begin{align*} x\times (x^7 + b_6x^6 + \cdots + b_1x + b_0) & = x^8 + b_6x^7 + \cdots b_1 x^2 + b_0x \\ & = (x^4 + x^3 + x + 1) + b_6x^7 + \cdots + b_1x^2 + b_0x \end{align*}xΓ—(x7+b6​x6+β‹―+b1​x+b0​)​=x8+b6​x7+β‹―b1​x2+b0​x=(x4+x3+x+1)+b6​x7+β‹―+b1​x2+b0​x​
xxx
bbb
111
Karatsuba algorithmarrow-up-right
F2 = GF(2)
K.<x> = F2[]
f = x^8 + x^4 + x^3 + x + 1
f.is_irreducible()
# True
(x^8 + x^6 + x^4 + 1) % f
# x^6 + x^3 + x
R = K.quotient(f)
R(x^8 + x^6 + x^4 + 1)
# xbar^6 + xbar^3 + xbar
F.<x> = GF(2^8, modulus=x^8 + x^4 + x^3 + x + 1)
x^8 + x^6 + x^4 + 1
# x^6 + x^3 + x
def F_to_hex(a):
    return ZZ(a.integer_representation()).hex()

b = x^4 + x^3 + x + 1
F_to_hex(b)
# '1b'
b = x^7 + x^5 + x^4 + x^2 + 1
F_to_hex(b)
# 'b5'
(2*0xb5 & 0xff) ^^ 0x1b).hex() == F_to_hex(x*b)    # the xor in Sage is "^^"
# True