CZEŚĆ STWORZYŁEM NIKOMU NIE POTRZEBNY SYMULATOR KOMUNIKATORA Z SZYFROWANIEM PLIKÓW, WERSJA EDUKACYJNA MAM RÓWNIEŻ WERSJE EXE,(WINDOWS TRAKTUJE GO JAK WIRUSA HE HE
)
Kod w Pythonie
import tkinter as tk
from tkinter import messagebox, filedialog
import base64
import math
import random
import hashlib
import json
import os
from sympy import primerange, isprime
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
# === Marta-Crypto AES ===
def tekst_na_sume_ascii(tekst):
return sum(ord(znak) for znak in tekst)
def znajdz_szyfr_marta(tekst):
suma_ascii = tekst_na_sume_ascii(tekst)
if suma_ascii <= 10:
return None
r = random.randint(1, 7)
s = int(math.log(suma_ascii) + r)
k = max(2, int(math.log(s)) if s > 0 else 2)
liczby_pierwsze = list(primerange(2, suma_ascii))
if len(liczby_pierwsze) < k:
return None
szyfr = random.choices(liczby_pierwsze, k=k)
aktualna_suma = sum(szyfr)
roznica = suma_ascii - aktualna_suma
if roznica != 0:
poprawiona = szyfr[-1] + roznica
if poprawiona > 1 and isprime(poprawiona):
szyfr[-1] = poprawiona
return szyfr
def generuj_klucz_aes(klucz_uzytkownika, szyfr_marta):
dane = klucz_uzytkownika + ''.join(str(p) for p in szyfr_marta)
return hashlib.sha256(dane.encode()).digest()
def szyfruj_aes(tekst, klucz_aes):
iv = os.urandom(16)
cipher = Cipher(algorithms.AES(klucz_aes), modes.CBC(iv), backend=default_backend())
encryptor = cipher.encryptor()
padder = padding.PKCS7(128).padder()
if isinstance(tekst, str):
tekst = tekst.encode()
padded_data = padder.update(tekst) + padder.finalize()
zaszyfrowane = encryptor.update(padded_data) + encryptor.finalize()
return base64.b64encode(iv + zaszyfrowane).decode()
def odszyfruj_aes(tekst_b64, klucz_aes):
dane = base64.b64decode(tekst_b64)
iv = dane[:16]
zaszyfrowane = dane[16:]
cipher = Cipher(algorithms.AES(klucz_aes), modes.CBC(iv), backend=default_backend())
decryptor = cipher.decryptor()
odszyfrowane_padded = decryptor.update(zaszyfrowane) + decryptor.finalize()
unpadder = padding.PKCS7(128).unpadder()
return unpadder.update(odszyfrowane_padded) + unpadder.finalize()
def zapisz_wiadomosc(nadawca, odbiorca, szyfr, zaszyfrowane_b64, hash_val):
dane = {
"nadawca": nadawca,
"odbiorca": odbiorca,
"szyfr": szyfr,
"zaszyfrowane": zaszyfrowane_b64,
"hash": hash_val
}
filepath = filedialog.asksaveasfilename(defaultextension=".json",
filetypes=[("Pliki JSON", "*.json")],
title="Zapisz wiadomość jako")
if filepath:
with open(filepath, "w", encoding="utf-8") as f:
json.dump(dane, f, indent=2)
return filepath
return None
def wczytaj_wiadomosc():
filepath = filedialog.askopenfilename(defaultextension=".json",
filetypes=[("Pliki JSON", "*.json")],
title="Wybierz plik z wiadomością")
if filepath:
try:
with open(filepath, "r", encoding="utf-8") as f:
return json.load(f)
except FileNotFoundError:
return None
return None
def szyfruj_plik():
klucz = entry_klucz.get()
if not klucz:
messagebox.showwarning("Błąd", "Podaj klucz przed szyfrowaniem pliku!")
return
filepath = filedialog.askopenfilename(
title="Wybierz plik do zaszyfrowania",
filetypes=[("Wszystkie pliki", "*.*")]
)
if not filepath:
return
with open(filepath, "rb") as f:
dane_bin = f.read()
# Generujemy szyfr Marta na podstawie nazwy pliku (lub możesz zmienić na dane_bin jeśli chcesz)
szyfr = znajdz_szyfr_marta(os.path.basename(filepath))
if not szyfr:
messagebox.showerror("Błąd", "Nie udało się wygenerować szyfru!")
return
klucz_aes = generuj_klucz_aes(klucz, szyfr)
iv = os.urandom(16)
cipher = Cipher(algorithms.AES(klucz_aes), modes.CBC(iv), backend=default_backend())
encryptor = cipher.encryptor()
padder = padding.PKCS7(128).padder()
padded = padder.update(dane_bin) + padder.finalize()
zaszyfrowane = encryptor.update(padded) + encryptor.finalize()
zaszyfrowane_b64 = base64.b64encode(iv + zaszyfrowane).decode()
hash_val = hashlib.sha256(dane_bin).hexdigest()
dane = {
"szyfr": szyfr,
"nazwa_pliku": os.path.basename(filepath),
"zaszyfrowane": zaszyfrowane_b64,
"hash": hash_val
}
savepath = filedialog.asksaveasfilename(
defaultextension=".json",
filetypes=[("Pliki JSON", "*.json")],
title="Zapisz zaszyfrowany plik jako"
)
if savepath:
with open(savepath, "w", encoding="utf-8") as f:
json.dump(dane, f, indent=2)
messagebox.showinfo("Sukces", f"Plik został zaszyfrowany i zapisany: {savepath}")
def odszyfruj_plik():
klucz = entry_klucz.get()
if not klucz:
messagebox.showwarning("Błąd", "Podaj klucz przed odszyfrowaniem pliku!")
return
filepath = filedialog.askopenfilename(
defaultextension=".json",
filetypes=[("Pliki JSON", "*.json")],
title="Wybierz zaszyfrowany plik do odszyfrowania"
)
if not filepath:
return
try:
with open(filepath, "r", encoding="utf-8") as f:
dane = json.load(f)
except Exception as e:
messagebox.showerror("Błąd", f"Nie udało się wczytać pliku:\n{e}")
return
szyfr = dane.get("szyfr")
zaszyfrowane_b64 = dane.get("zaszyfrowane")
nazwa_pliku = dane.get("nazwa_pliku", "plik_odszyfrowany")
_, ext = os.path.splitext(nazwa_pliku)
if ext == "":
ext = ".bin" # domyślne rozszerzenie, jeśli brak oryginalnego
if not szyfr or not zaszyfrowane_b64:
messagebox.showerror("Błąd", "Niepoprawny format pliku zaszyfrowanego!")
return
klucz_aes = generuj_klucz_aes(klucz, szyfr)
try:
odszyfrowane_bytes = odszyfruj_aes(zaszyfrowane_b64, klucz_aes)
except Exception as e:
messagebox.showerror("Błąd", f"Nieprawidłowy klucz lub uszkodzone dane:\n{e}")
return
hash_sprawdzenie = hashlib.sha256(odszyfrowane_bytes).hexdigest()
if hash_sprawdzenie != dane.get("hash"):
messagebox.showwarning("Uwaga", "Hash pliku nie zgadza się! Plik może być uszkodzony lub zły klucz.")
savepath = filedialog.asksaveasfilename(
initialfile="odszyfrowany" + ext,
title="Zapisz odszyfrowany plik jako",
filetypes=[("Wszystkie pliki", "*.*")]
)
if not savepath:
return
# Dopisz rozszerzenie, jeśli użytkownik go nie podał
if not os.path.splitext(savepath)[1]:
savepath += ext
try:
with open(savepath, "wb") as f:
f.write(odszyfrowane_bytes)
messagebox.showinfo("Sukces", f"Plik odszyfrowany i zapisany:\n{savepath}")
except Exception as e:
messagebox.showerror("Błąd", f"Nie udało się zapisać pliku:\n{e}")
# === GUI ===
root = tk.Tk()
root.title(" Marta-Crypto AES Komunikator")
tk.Label(root, text=" Nadawca").grid(row=0, column=0)
entry_nadawca = tk.Entry(root, width=40)
entry_nadawca.grid(row=0, column=1)
tk.Label(root, text=" Odbiorca").grid(row=1, column=0)
entry_odbiorca = tk.Entry(root, width=40)
entry_odbiorca.grid(row=1, column=1)
tk.Label(root, text=" Wiadomość").grid(row=2, column=0)
text_wiadomosc = tk.Text(root, height=10, width=60)
text_wiadomosc.grid(row=2, column=1)
tk.Label(root, text=" Klucz").grid(row=3, column=0)
entry_klucz = tk.Entry(root, show="*", width=40)
entry_klucz.grid(row=3, column=1)
def nadaj_wiadomosc():
nadawca = entry_nadawca.get()
odbiorca = entry_odbiorca.get()
wiadomosc = text_wiadomosc.get("1.0", tk.END).strip()
klucz = entry_klucz.get()
if not wiadomosc or not klucz:
messagebox.showwarning("Błąd", "Podaj wiadomość i klucz!")
return
szyfr = znajdz_szyfr_marta(wiadomosc)
if not szyfr:
messagebox.showerror("Błąd", "Nie udało się wygenerować szyfru!")
return
klucz_aes = generuj_klucz_aes(klucz, szyfr)
zaszyfrowane_b64 = szyfruj_aes(wiadomosc, klucz_aes)
hash_val = hashlib.sha256(wiadomosc.encode()).hexdigest()
filepath = zapisz_wiadomosc(nadawca, odbiorca, szyfr, zaszyfrowane_b64, hash_val)
if filepath:
messagebox.showinfo("Sukces", f"Wiadomość zaszyfrowana i zapisana do pliku:\n{filepath}")
def odbierz_wiadomosc():
klucz = entry_klucz.get()
dane = wczytaj_wiadomosc()
if not klucz or not dane:
messagebox.showwarning("Błąd", "Brak klucza lub wiadomości!")
return
klucz_aes = generuj_klucz_aes(klucz, dane["szyfr"])
try:
wiadomosc = odszyfruj_aes(dane["zaszyfrowane"], klucz_aes).decode()
except Exception:
messagebox.showerror("Błąd", "Nieprawidłowy klucz lub dane!")
return
hash_sprawdzenie = hashlib.sha256(wiadomosc.encode()).hexdigest()
zgodnosc = hash_sprawdzenie == dane["hash"]
messagebox.showinfo("Odszyfrowano",
f"Nadawca: {dane['nadawca']}\nOdbiorca: {dane['odbiorca']}\n\nTreść: {wiadomosc}\n\nHash zgodny: {zgodnosc}")
tk.Button(root, text=" Nadaj wiadomość", command=nadaj_wiadomosc, bg="lightgreen").grid(row=4, column=0, pady=10)
tk.Button(root, text=" Odbierz wiadomość", command=odbierz_wiadomosc, bg="lightblue").grid(row=4, column=1)
tk.Button(root, text=" Szyfruj plik", command=szyfruj_plik, bg="lightgray").grid(row=5, column=0, pady=10)
tk.Button(root, text=" Odszyfruj plik", command=odszyfruj_plik, bg="lightyellow").grid(row=5, column=1)
root.mainloop()
Tutaj jest wersja exe:
https://drive.google.com/drive/folders/1DIGX8wIGqpDm_UH0zIqCD_z8Kb1kHkWW?usp=sharing
Można tym programem szyfrować i odszyfrowywać pliki, tekstowe i inne również, oczywiście pewnie nie działa dobrze wszystko, ale dla zabawy może do czegoś komuś posłużyć. 