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))}")
|