import gmpy2 from gmpy2 import mpz from xor import xor_custom def xtime(a): """ Mnoży element w F_{2^8} przez (02)_H. Args: a (mpz): Element w F_{2^8}. Returns: mpz: Wynik mnożenia w F_{2^8}. """ if not isinstance(a, mpz): raise TypeError("Argument musi być typu mpz.") # Sprawdzenie, czy najwyższy bit jest ustawiony high_bit_set = (a >> 7) & 1 # Przesunięcie w lewo o jeden bit result = (a << 1) & 0xFF if high_bit_set: # XOR z 0x1B, jeśli najwyższy bit był ustawiony result = xor_custom(gmpy2.mpz(result), gmpy2.mpz(0x1B)) return result if __name__ == "__main__": # Przykład użycia xy_H = gmpy2.mpz(0x57) # Przykładowy element wynik = xtime(xy_H) print(f"xtime({hex(int(xy_H))}) = {hex(int(wynik))}")