# После получения GLOBAL_H и FLAG_CT:
AAD_PREFIX = b"user-aad-prefix:"
# Функция, которая считает GHASH для X = SECRET_VICTIM
def test_ghash_with_X(X_bytes):
return ghash(GLOBAL_H, AAD_PREFIX + X_bytes, FLAG_CT)
G0 = test_ghash_with_X(b"\x00" * 16)
G1 = test_ghash_with_X(b"\x00" * 15 + b"\x01")
G2 = test_ghash_with_X(b"\x00" * 15 + b"\x02")
G3 = test_ghash_with_X(b"\x00" * 15 + b"\x03")
print(f"G0 = {G0.hex()}")
print(f"G1 = {G1.hex()}")
print(f"G2 = {G2.hex()}")
print(f"G3 = {G3.hex()}")
d1 = int.from_bytes(bytes(a^b for a,b in zip(G1, G0)), "big")
d2 = int.from_bytes(bytes(a^b for a,b in zip(G2, G0)), "big")
d3 = int.from_bytes(bytes(a^b for a,b in zip(G3, G0)), "big")
print(f"G1^G0 = {d1:032x} (ожидается 1 * H^k)")
print(f"G2^G0 = {d2:032x} (ожидается 2 * H^k)")
print(f"G3^G0 = {d3:032x} (ожидается 3 * H^k)")
# Проверим: d2 == gf128_mul(2, d1)? d3 == gf128_mul(3, d1)?
print(f"d2 == 2*d1: {d2 == gf128_mul(2, d1)}")
print(f"d3 == 3*d1: {d3 == gf128_mul(3, d1)}")
# Найдём k: d1 == H^k?
H = int.from_bytes(GLOBAL_H, "big")
for k in range(1, 20):
H_k = 1
for _ in range(k):
H_k = gf128_mul(H_k, H)
if H_k == d1:
print(f"*** d1 == H^{k} ***")
break
else:
print(f"d1 != H^k ни для k=1..19")