'Multiplication over GF(256) in SAGE

I am trying to reproduce the multiplication over GF(256) of this question. Specifically, I am trying d4*02 in sage. According to the authors, this multiplication is 𝟷𝟶𝟷𝟷𝟶𝟶𝟷𝟷. In Sage I tried

 k.<a> = FiniteField(256, impl='givaro', repr='int')
 print(k((a**2+a**4+a**6+a**7)*(a))) # a**2+a**4+a**6+a**7 is d4 and a is 2
 181

But 181 is not equal to 𝟷𝟶𝟷𝟷𝟶𝟶𝟷𝟷. What I am doing wrong? Could you help me, please?



Solution 1:[1]

You need to give your finite field constructor the correct modulus for Rijndael.

# Rijndael finite field
k.<a> = GF(2^8, modulus=x^8+x^4+x^3+x+1)

r = (a^7 + a^6 + a^4 + a^2) * a
v = r.integer_representation()
print(r, v, hex(v))

Output

a^7 + a^5 + a^4 + a + 1 179 0xb3

It's usually more convenient to specify field elements using integers. Eg,

# Rijndael finite field
k.<a> = GF(2^8, modulus=x^8+x^4+x^3+x+1)

kint = k._cache.fetch_int
p, q = [kint(u) for u in (0xd4, 0x02)]
r = p * q 
v = r.integer_representation()
print(r, v, hex(v))

Alternatively, you can use a list and a dict to convert integers to and from field elements. The following code does the second multiplication from the linked question.

# Rijndael finite field
k.<a> = GF(2^8, modulus=x^8+x^4+x^3+x+1)

i2f = sorted(k)
f2i = {v: i for i, v in enumerate(i2f)}

p, q = [i2f[u] for u in (0xbf, 0x03)]
print(p)
print(q)

r = p * q 
v = f2i[r]
print(r, v, hex(v))

Output

a^7 + a^5 + a^4 + a^3 + a^2 + a + 1
a + 1
a^7 + a^6 + a^4 + a^3 + a 218 0xda

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 PM 2Ring