34 lines
899 B
Python
34 lines
899 B
Python
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))}")
|