feat: add cryptography fundamentals lab scripts

This commit is contained in:
Matias Tillerias
2026-09-28 19:56:21 -03:00
commit dbc5d68bc9
6 changed files with 1913 additions and 0 deletions

88
Lab2_Hashing.py Normal file
View File

@@ -0,0 +1,88 @@
import tkinter as tk
import hashlib
import difflib
class HashLab:
def __init__(self, root):
self.root = root
self.root.title("Lab 2: Efecto Avalancha (SHA-256)")
self.root.geometry("800x450")
# Inputs
tk.Label(root, text="Entrada A:").pack(anchor="w", padx=20)
self.input_a = tk.Entry(root, width=80, font=("Consolas", 10))
self.input_a.pack(padx=20, pady=5)
self.input_a.bind("<KeyRelease>", self.update)
tk.Label(root, text="Entrada B:").pack(anchor="w", padx=20)
self.input_b = tk.Entry(root, width=80, font=("Consolas", 10))
self.input_b.pack(padx=20, pady=5)
self.input_b.bind("<KeyRelease>", self.update)
# Diferencia Textual
self.lbl_text_diff = tk.Label(root, text="Diferencia de texto: 0.00%", font=("Arial", 10, "italic"), fg="#555")
self.lbl_text_diff.pack(pady=5)
# Visualización Hashes
tk.Label(root, text="Hash A (SHA-256):").pack(anchor="w", padx=20, pady=(20,0))
self.lbl_hash_a = tk.Label(root, text="", font=("Consolas", 9), fg="blue", wraplength=750)
self.lbl_hash_a.pack(padx=20)
tk.Label(root, text="Hash B (SHA-256):").pack(anchor="w", padx=20)
self.lbl_hash_b = tk.Label(root, text="", font=("Consolas", 9), fg="blue", wraplength=750)
self.lbl_hash_b.pack(padx=20)
# Estadísticas
self.lbl_stats = tk.Label(root, text="Diferencia de bits: 0 / 256 (0.00%)", font=("Arial", 12, "bold"))
self.lbl_stats.pack(pady=30)
# Canvas para bits
self.canvas_bits = tk.Canvas(root, width=768, height=20, bg="white")
self.canvas_bits.pack(pady=10)
def update(self, event=None):
text_str_a = self.input_a.get()
text_str_b = self.input_b.get()
# Calcular diferencia textual
matcher = difflib.SequenceMatcher(None, text_str_a, text_str_b)
ratio = matcher.ratio() # 1.0 es igual, 0.0 es diferente
diff_pct = (1.0 - ratio) * 100
self.lbl_text_diff.config(text=f"Diferencia de texto: {diff_pct:.2f}%")
text_a = text_str_a.encode()
text_b = text_str_b.encode()
hash_a_hex = hashlib.sha256(text_a).hexdigest()
hash_b_hex = hashlib.sha256(text_b).hexdigest()
self.lbl_hash_a.config(text=hash_a_hex)
self.lbl_hash_b.config(text=hash_b_hex)
# Convertir a binario
bin_a = bin(int(hash_a_hex, 16))[2:].zfill(256)
bin_b = bin(int(hash_b_hex, 16))[2:].zfill(256)
# Comparar bits
diffs = 0
self.canvas_bits.delete("all")
w = 3 # ancho por bit visual
for i in range(256):
color = "#eee" # igual
if bin_a[i] != bin_b[i]:
diffs += 1
color = "red" # Diferente
self.canvas_bits.create_rectangle(i*w, 0, (i*w)+w, 20, fill=color, outline="")
pct = (diffs / 256) * 100
self.lbl_stats.config(text=f"Diferencia de bits: {diffs} / 256 ({pct:.2f}%)")
# Color semántico
if diffs == 0: self.lbl_stats.config(fg="green")
elif pct < 40: self.lbl_stats.config(fg="orange") # Avalancha pobre (raro en sha256)
else: self.lbl_stats.config(fg="red") # gran avalancha del hash
if __name__ == "__main__":
root = tk.Tk()
app = HashLab(root)
root.mainloop()