03

solve.sage

cl = bytes.fromhex("""
F3 BD 27 86 31 80 25 B9  61 6B A2 A9 B4 83 3E CA
49 23 96 70 ED 22 3C 17  10 70 5A BA 0C 6A 7C A5
8D 5B 99 D7 6B C2 02 7C  7F 0F 05 A5 64 4D 2A A4
62 0E 2A FF 56 83 28 97  5B 72 5B D7 EB 05 ED 6F
""")

log_list = bytes.fromhex("""
00 00 01 19 02 32 1A C6  03 DF 33 EE 1B 68 C7 4B
04 64 E0 0E 34 8D EF 81  1C C1 69 F8 C8 08 4C 71
05 8A 65 2F E1 24 0F 21  35 93 8E DA F0 12 82 45
1D B5 C2 7D 6A 27 F9 B9  C9 9A 09 78 4D E4 72 A6
06 BF 8B 62 66 DD 30 FD  E2 98 25 B3 10 91 22 88
36 D0 94 CE 8F 96 DB BD  F1 D2 13 5C 83 38 46 40
1E 42 B6 A3 C3 48 7E 6E  6B 3A 28 54 FA 85 BA 3D
CA 5E 9B 9F 0A 15 79 2B  4E D4 E5 AC 73 F3 A7 57
07 70 C0 F7 8C 80 63 0D  67 4A DE ED 31 C5 FE 18
E3 A5 99 77 26 B8 B4 7C  11 44 92 D9 23 20 89 2E
37 3F D1 5B 95 BC CF CD  90 87 97 B2 DC FC BE 61
F2 56 D3 AB 14 2A 5D 9E  84 3C 39 53 47 6D 41 A2
1F 2D 43 D8 B7 7B A4 76  C4 17 49 EC 7F 0C 6F F6
6C A1 3B 52 29 9D 55 AA  FB 60 86 B1 BB CC 3E 5A
CB 59 5F B0 9C A9 A0 51  0B F5 16 EB 7A 75 2C D7
4F AE D5 E9 E6 E7 AD E8  74 D6 F4 EA A8 50 58 AF
""")

exp_list = bytes.fromhex("""
01 02 04 08 10 20 40 80  1D 3A 74 E8 CD 87 13 26
4C 98 2D 5A B4 75 EA C9  8F 03 06 0C 18 30 60 C0
9D 27 4E 9C 25 4A 94 35  6A D4 B5 77 EE C1 9F 23
46 8C 05 0A 14 28 50 A0  5D BA 69 D2 B9 6F DE A1
5F BE 61 C2 99 2F 5E BC  65 CA 89 0F 1E 3C 78 F0
FD E7 D3 BB 6B D6 B1 7F  FE E1 DF A3 5B B6 71 E2
D9 AF 43 86 11 22 44 88  0D 1A 34 68 D0 BD 67 CE
81 1F 3E 7C F8 ED C7 93  3B 76 EC C5 97 33 66 CC
85 17 2E 5C B8 6D DA A9  4F 9E 21 42 84 15 2A 54
A8 4D 9A 29 52 A4 55 AA  49 92 39 72 E4 D5 B7 73
E6 D1 BF 63 C6 91 3F 7E  FC E5 D7 B3 7B F6 F1 FF
E3 DB AB 4B 96 31 62 C4  95 37 6E DC A5 57 AE 41
82 19 32 64 C8 8D 07 0E  1C 38 70 E0 DD A7 53 A6
51 A2 59 B2 79 F2 F9 EF  C3 9B 2B 56 AC 45 8A 09
12 24 48 90 3D 7A F4 F5  F7 F3 FB EB CB 8B 0B 16
2C 58 B0 7D FA E9 CF 83  1B 36 6C D8 AD 47 8E 01
""")

def gf_add(a: int, b: int):
    return a ^^ b

def gf_mul(a: int, b: int):
    return exp_list[(log_list[a] + log_list[b]) % 0xFF]

def gf_pow(a: int, b: int):
    return exp_list[(b * log_list[a]) % 0xFF]

F = GF(2)['x']
p = x^8 + x^4 + x^3 + x^2 + 1
FF.<a> = GF(2^8, modulus=p)

for i in range(0, len(cl), 16):
    
    cd = cl[i:i+16]
    m = []
    v = []
    for j in range(16):

        s = 0
        for k in range(16):
            s = gf_add(s, gf_mul(gf_pow(gf_pow(2, j), k), cd[15 - k]))
        v.append(-FF.fetch_int(s))
        
        Row = []
        for k in range(8):
            Row.append(FF.fetch_int(gf_pow(gf_pow(2, j), 23 - k)))
        m.append(Row)
    
    m = matrix(m)
    v = vector(v)

    sol = m.solve_right(v)
    for i in range(8):
        print(chr(sol[i].integer_representation()), end='')