Загрузка данных


# Тест: работает ли инверсия в GF(2^4) с GCM-представлением R = 0xC
def gf4_mul_gcm(x, y, R=0xC, MASK=0xF):
    z = 0
    v = x & MASK
    for i in range(4):
        if (y >> i) & 1:
            z ^= v
        msb = (v >> 3) & 1
        v = (v << 1) & MASK
        if msb:
            v ^= R
    return z & MASK

def gf4_inv_gcm(x):
    result = 1
    base = x
    exp = (1 << 4) - 2
    while exp:
        if exp & 1:
            result = gf4_mul_gcm(result, base)
        base = gf4_mul_gcm(base, base)
        exp >>= 1
    return result

print("=== GF(2^4) с GCM R=0xC ===")
for t in [1, 2, 3, 4, 5, 6, 7]:
    inv_t = gf4_inv_gcm(t)
    p = gf4_mul_gcm(t, inv_t)
    print(f"inv({t}) = {inv_t}, {t} * inv = {p} {'OK' if p == 1 else 'FAIL'}")

# Для сравнения: GF(2^4) с обычным R=0x3
print()
print("=== GF(2^4) с обычным R=0x3 ===")
def gf4_mul_std(x, y, R=0x3, MASK=0xF):
    z = 0
    v = x & MASK
    for i in range(4):
        if (y >> i) & 1:
            z ^= v
        msb = (v >> 3) & 1
        v = (v << 1) & MASK
        if msb:
            v ^= R
    return z & MASK

def gf4_inv_std(x):
    result = 1
    base = x
    exp = (1 << 4) - 2
    while exp:
        if exp & 1:
            result = gf4_mul_std(result, base)
        base = gf4_mul_std(base, base)
        exp >>= 1
    return result

for t in [1, 2, 3, 4, 5, 6, 7]:
    inv_t = gf4_inv_std(t)
    p = gf4_mul_std(t, inv_t)
    print(f"inv({t}) = {inv_t}, {t} * inv = {p} {'OK' if p == 1 else 'FAIL'}")