import gmpy2 from gmpy2 import mpz from xor import xor_custom from xtime import xtime def iloczyn(a, b): """ Mnoży dwa elementy w F_{2^8} za pomocą algorytmu "Russian peasant". Args: a (mpz): Pierwszy element w F_{2^8}. b (mpz): Drugi element w F_{2^8}. Returns: mpz: Wynik mnożenia w F_{2^8}. """ if not isinstance(a, mpz) or not isinstance(b, mpz): raise TypeError("Oba argumenty muszą być typu mpz.") result = gmpy2.mpz(0) while b > 0: if b & 1: result = xor_custom(result, a) a = xtime(a) b = b >> 1 return result if __name__ == "__main__": # Przykład użycia xy_H = gmpy2.mpz(0x57) # Przykładowy element uw_H = gmpy2.mpz(0x83) # Przykładowy element wynik = iloczyn(xy_H, uw_H) print(f"iloczyn({hex(int(xy_H))}, {hex(int(uw_H))}) = {hex(int(wynik))}")