The S-box maps an 8-bit input, , to an 8-bit output, . Both the input and output are interpreted as polynomials over
GF(2). First, the input is mapped to its
multiplicative inverse in ,
Rijndael's finite field. Zero, as the identity, is mapped to itself. This transformation is known as the
Nyberg S-box after its inventor
Kaisa Nyberg. The multiplicative inverse is then transformed using the following
affine transformation: : \begin{bmatrix}s_0\\s_1\\s_2\\s_3\\s_4\\s_5\\s_6\\s_7\end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \\ 1 & 1 & 0 & 0 & 0 & 1 & 1 & 1 \\ 1 & 1 & 1 & 0 & 0 & 0 & 1 & 1 \\ 1 & 1 & 1 & 1 & 0 & 0 & 0 & 1 \\ 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ 0 & 1 & 1 & 1 & 1 & 1 & 0 & 0 \\ 0 & 0 & 1 & 1 & 1 & 1 & 1 & 0 \\ 0 & 0 & 0 & 1 & 1 & 1 & 1 & 1 \end{bmatrix}\begin{bmatrix} b_0\\ b_1\\ b_2\\ b_3\\ b_4\\ b_5\\ b_6\\ b_7 \end{bmatrix} + \begin{bmatrix} 1 \\ 1\\ 0\\ 0\\ 0\\ 1\\ 1\\ 0 \end{bmatrix} where is the S-box output and is the multiplicative inverse as a vector. This affine transformation is the sum of multiple rotations of the byte as a vector, where addition is the XOR operation: : s = b \oplus (b \lll 1) \oplus (b \lll 2) \oplus (b \lll 3) \oplus (b \lll 4) \oplus 63_{16} where represents the multiplicative inverse, \oplus is the
bitwise XOR operator, \lll is a left bitwise
circular shift, and the constant is given in
hexadecimal. An equivalent formulation of the affine transformation is : s_i = b_i \oplus b_{(i + 4)\operatorname{mod}8} \oplus b_{(i + 5)\operatorname{mod}8} \oplus b_{(i + 6)\operatorname{mod}8} \oplus b_{(i + 7)\operatorname{mod}8} \oplus c_i where , , and are 8 bit arrays, is 01100011, and subscripts indicate a reference to the indexed bit. Another equivalent is: : s = \left(b \times 31_{10} \mod{257_{10}}\right) \oplus 99_{10} where \times is polynomial multiplication of b and 31_{10} taken as bit arrays. == Inverse S-box ==