32 lines
829 B
Python
32 lines
829 B
Python
|
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))}")
|