kryptografia/3/xtime.py
2024-11-18 00:14:03 +01:00

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