cwiczenia 3
This commit is contained in:
parent
b973310a9a
commit
328cac2313
BIN
3/__pycache__/iloczyn.cpython-310.pyc
Normal file
BIN
3/__pycache__/iloczyn.cpython-310.pyc
Normal file
Binary file not shown.
BIN
3/__pycache__/xor.cpython-310.pyc
Normal file
BIN
3/__pycache__/xor.cpython-310.pyc
Normal file
Binary file not shown.
BIN
3/__pycache__/xtime.cpython-310.pyc
Normal file
BIN
3/__pycache__/xtime.cpython-310.pyc
Normal file
Binary file not shown.
33
3/iloczyn.py
Normal file
33
3/iloczyn.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
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))}")
|
60
3/odwrotnosc.py
Normal file
60
3/odwrotnosc.py
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
import gmpy2
|
||||||
|
from gmpy2 import mpz
|
||||||
|
from xor import xor_custom
|
||||||
|
from iloczyn import iloczyn
|
||||||
|
|
||||||
|
def odwrotnosc(a):
|
||||||
|
"""
|
||||||
|
Znajduje odwrotność elementu w F_{2^8} za pomocą rozszerzonego algorytmu Euklidesa.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
a (mpz): Element w F_{2^8}.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
mpz: Odwrotność elementu w F_{2^8}.
|
||||||
|
"""
|
||||||
|
if not isinstance(a, mpz):
|
||||||
|
raise TypeError("Argument musi być typu mpz.")
|
||||||
|
|
||||||
|
if a == 0:
|
||||||
|
raise ValueError("Element 0 nie ma odwrotności w F_{2^8}.")
|
||||||
|
|
||||||
|
# Definicja polinomu niezupełnego (AES)
|
||||||
|
irreducible = gmpy2.mpz(0x11B)
|
||||||
|
|
||||||
|
# Rozszerzony algorytm Euklidesa
|
||||||
|
r0, r1 = irreducible, a
|
||||||
|
s0, s1 = gmpy2.mpz(0), gmpy2.mpz(1)
|
||||||
|
|
||||||
|
while r1 != 0:
|
||||||
|
deg_r0 = r0.bit_length() - 1
|
||||||
|
deg_r1 = r1.bit_length() - 1
|
||||||
|
if deg_r0 < deg_r1:
|
||||||
|
# Swap r0 and r1
|
||||||
|
r0, r1 = r1, r0
|
||||||
|
s0, s1 = s1, s0
|
||||||
|
deg_r0, deg_r1 = deg_r1, deg_r0
|
||||||
|
shift = deg_r0 - deg_r1
|
||||||
|
# r0 = r0 XOR (r1 << shift)
|
||||||
|
r0_shifted = r1 << shift
|
||||||
|
r0 = xor_custom(r0, r0_shifted)
|
||||||
|
# s0 = s0 XOR (s1 << shift)
|
||||||
|
s0_shifted = s1 << shift
|
||||||
|
s0 = xor_custom(s0, s0_shifted)
|
||||||
|
|
||||||
|
if r0 != 1:
|
||||||
|
raise ValueError(f"Element {hex(int(a))} nie ma odwrotności w F_{2^8}.")
|
||||||
|
|
||||||
|
return s0 & gmpy2.mpz(0xFF)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Przykład użycia
|
||||||
|
xy_H = gmpy2.mpz(0x57) # Przykładowy element
|
||||||
|
try:
|
||||||
|
wynik = odwrotnosc(xy_H)
|
||||||
|
print(f"Odwrotność({hex(int(xy_H))}) = {hex(int(wynik))}")
|
||||||
|
# Sprawdzenie: iloczyn powinien być 0x01
|
||||||
|
ilocz = iloczyn(xy_H, wynik)
|
||||||
|
print(f"Sprawdzenie: iloczyn({hex(int(xy_H))}, {hex(int(wynik))}) = {hex(int(ilocz))}")
|
||||||
|
except ValueError as e:
|
||||||
|
print(e)
|
23
3/suma.py
Normal file
23
3/suma.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import gmpy2
|
||||||
|
from gmpy2 import mpz
|
||||||
|
from xor import xor_custom
|
||||||
|
|
||||||
|
def suma(a, b):
|
||||||
|
"""
|
||||||
|
Dodaje dwa elementy w F_{2^8} za pomocą operacji XOR.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
a (mpz): Pierwszy element w F_{2^8}.
|
||||||
|
b (mpz): Drugi element w F_{2^8}.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
mpz: Wynik dodawania w F_{2^8}.
|
||||||
|
"""
|
||||||
|
return xor_custom(a, b)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Przykład użycia
|
||||||
|
xy_H = gmpy2.mpz(0x57) # Przykładowy element
|
||||||
|
uw_H = gmpy2.mpz(0x83) # Przykładowy element
|
||||||
|
wynik = suma(xy_H, uw_H)
|
||||||
|
print(f"Suma({hex(int(xy_H))}, {hex(int(uw_H))}) = {hex(int(wynik))}")
|
31
3/xor.py
Normal file
31
3/xor.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import gmpy2
|
||||||
|
from gmpy2 import mpz
|
||||||
|
|
||||||
|
def xor_custom(a, b):
|
||||||
|
"""
|
||||||
|
Wykonuje operację bitowego XOR na dwóch liczbach typu mpz reprezentujących bajty.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
a (mpz): Pierwszy bajt (0-255) jako mpz.
|
||||||
|
b (mpz): Drugi bajt (0-255) jako mpz.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
mpz: Wynik operacji XOR (0-255) jako mpz.
|
||||||
|
"""
|
||||||
|
if not isinstance(a, mpz) or not isinstance(b, mpz):
|
||||||
|
raise TypeError("Oba argumenty muszą być typu mpz.")
|
||||||
|
|
||||||
|
result = mpz(0)
|
||||||
|
for i in range(8):
|
||||||
|
bit_a = (a >> i) & 1 # Pobiera i-ty bit z a
|
||||||
|
bit_b = (b >> i) & 1 # Pobiera i-ty bit z b
|
||||||
|
bit_result = bit_a ^ bit_b # XOR bitów
|
||||||
|
result |= (bit_result << i) # Ustawia wynikowy bit w odpowiedniej pozycji
|
||||||
|
return result
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Przykład użycia
|
||||||
|
a = gmpy2.mpz(0x57)
|
||||||
|
b = gmpy2.mpz(0x83)
|
||||||
|
wynik = xor_custom(a, b)
|
||||||
|
print(f"xor_custom({hex(int(a))}, {hex(int(b))}) = {hex(int(wynik))}")
|
31
3/xtime.py
Normal file
31
3/xtime.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
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))}")
|
BIN
miniprojekt_nr3.pdf
Normal file
BIN
miniprojekt_nr3.pdf
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user