# Тест: GF(2^128) с R = 0x87 << 120
R = 0x87 << 120
MASK = (1 << 128) - 1
def gf_mul(x, y):
z = 0
v = x & MASK
for i in range(128):
if (y >> i) & 1:
z ^= v
msb = (v >> 127) & 1
v = (v << 1) & MASK
if msb:
v ^= R
return z & MASK
def gf_inv(x):
result = 1
base = x
exp = (1 << 128) - 2
while exp:
if exp & 1:
result = gf_mul(result, base)
base = gf_mul(base, base)
exp >>= 1
return result
print("=== GF(2^128) с R = 0x87 << 120 ===")
for t in [1, 2, 3, 0x80, 0x123456789abcdef0123456789abcdef0]:
inv_t = gf_inv(t)
p = gf_mul(t, inv_t)
print(f"inv({t:032x}) * {t:032x} = {p:032x} {'OK' if p == 1 else 'FAIL'}")