Aplicație distribuită de comunicare criptată între stații, realizată în Python. Proiectul permite transmiterea de mesaje și fișiere criptate într-o topologie P2P mesh, folosind socket-uri TCP, Diffie-Hellman pentru negocierea cheii și Blowfish-CBC pentru criptarea datelor.
- Comunicare directă între stații prin socket TCP
- Topologie P2P mesh cu 2-5 stații
- Fiecare nod are rol dublu: server TCP și client TCP
- Negociere de cheie folosind Diffie-Hellman
- Criptare simetrică folosind Blowfish implementat manual
- Mod de operare Blowfish-CBC cu IV random de 8 bytes
- Padding PKCS#7 pentru blocuri de 8 bytes
- Trimitere mesaje criptate către un peer
- Trimitere mesaje criptate către toți peerii conectați
- Trimitere fișiere criptate către un peer
- Trimitere fișiere criptate către toți peerii conectați
- Împărțirea fișierelor în chunks de 4096 bytes
- Reconstruirea fișierului la recepție
- Interfață grafică realizată cu Tkinter
- Teste pentru Blowfish și Blowfish-CBC
Proiectul folosește o arhitectură P2P descentralizată de tip mesh. Nu există un server central care rutează toate mesajele. Fiecare stație rulează propria componentă de server, pentru a primi conexiuni, și propria componentă de client, pentru a se conecta la celelalte stații.
Exemplu de topologie mesh cu 4 stații:
+-----------+---------+-----------+
| Laptop A |---------| Laptop B |
| port 5555 | | port 5556 |
+-----------+---------+-----------+
| \ / |
| \ / |
| \ / |
| \ / |
+-----------+---------+-----------+
| Laptop C |---------| Laptop D |
| port 5557 | | port 5558 |
+-----------+---------+-----------+
Pentru 4 stații, un mesh complet are 6 conexiuni logice:
Laptop A <-> Laptop B
Laptop A <-> Laptop C
Laptop A <-> Laptop D
Laptop B <-> Laptop C
Laptop B <-> Laptop D
Laptop C <-> Laptop D
Fiecare conexiune directă negociază propria cheie Diffie-Hellman și folosește propria cheie simetrică Blowfish.
1. Se pornește nodul local pe un port TCP.
2. Nodul se conectează la unul sau mai mulți peers.
3. Pentru fiecare conexiune se execută Diffie-Hellman.
4. Secretul comun este folosit pentru cheia Blowfish.
5. Mesajele și fișierele sunt criptate cu Blowfish-CBC.
6. Datele sunt trimise prin protocolul propriu peste TCP.
7. Receptorul decriptează mesajele sau reconstruiește fișierele.
Algoritmul simetric folosit este Blowfish, implementat manual, fără biblioteci externe de criptografie.
Blowfish lucrează pe blocuri de 64 de biți, adică 8 bytes. Pentru mesaje și fișiere de dimensiune variabilă, proiectul folosește modul CBC:
plaintext -> padding PKCS#7 -> IV random -> Blowfish-CBC -> IV + ciphertext
La decriptare:
IV + ciphertext -> Blowfish-CBC decrypt -> eliminare padding -> plaintext
Pentru fiecare mesaj sau chunk de fișier se generează un IV random de 8 bytes. IV-ul este atașat la începutul datelor criptate și este folosit la decriptare.
TCP este orientat pe flux de bytes, deci nu păstrează automat granițele mesajelor. Din acest motiv, proiectul folosește un protocol propriu de framing.
Formatul general al unui pachet este:
[4 bytes header_len][header_json][4 bytes payload_len][payload]
Header-ul conține informații precum tipul pachetului, iar payload-ul conține datele efective.
Tipuri de pachete folosite:
MESSAGE- mesaj text criptatFILE_START- începutul transferului de fișierFILE_CHUNK- chunk criptat din fișierFILE_END- finalul transferului de fișier
Fișierele sunt citite în chunks de 4096 bytes. Fiecare chunk este criptat și trimis separat.
Formula pentru numărul de pachete:
numar_pachete = ceil(dimensiune_fisier / 4096)
Exemplu:
Fisier: test.txt
Dimensiune: 7263 bytes
Chunk size: 4096 bytes
Numar pachete = ceil(7263 / 4096) = 2
La recepție, fiecare chunk este decriptat și scris secvențial în fișierul reconstruit.
Encrypted-P2P-File-Transfer/
├── blowfish.py # Implementare Blowfish + Blowfish-CBC
├── client.py # Conectare la peers si trimitere mesaje
├── constants.py # Constante Blowfish
├── diffie_hellman.py # Implementare Diffie-Hellman
├── gui.py # Interfata grafica Tkinter
├── main.py # Punct alternativ de pornire
├── node_a.py # Test/demo consola pentru nod A
├── node_b.py # Test/demo consola pentru nod B
├── p2p_utils.py # Transfer fisiere pe chunks
├── protocol.py # Protocol de framing peste TCP
├── server.py # Server TCP pentru receptie
├── test_cbc.py # Test simplu pentru Blowfish-CBC
├── test.txt # Fisier de test
└── tests/
└── test_blowfish.py # Teste unitare Blowfish
git clone https://github.com/AndreeaStati/Encrypted-P2P-File-Transfer.git
cd Encrypted-P2P-File-Transferpython3 gui.pyPentru un demo local cu două stații, deschide două terminale și rulează în fiecare:
python3 gui.pyConfigurare exemplu:
Stația 1:
Nume: Laptop A
Port local: 5555
Peer name: Laptop B
Peer IP: 127.0.0.1
Peer port: 5556
Stația 2:
Nume: Laptop B
Port local: 5556
Peer name: Laptop A
Peer IP: 127.0.0.1
Peer port: 5555
Pași:
- Apasă
Pornește nodpe fiecare stație. - Apasă
Conecteazăcătre peer. - Trimite mesaje sau fișiere criptate.
Pentru test local, se pot porni 4 instanțe ale aplicației:
Laptop A - port 5555
Laptop B - port 5556
Laptop C - port 5557
Laptop D - port 5558
Toate folosesc IP-ul:
127.0.0.1
Fiecare stație se poate conecta la celelalte stații prin introducerea numelui, IP-ului și portului peer-ului.
Exemplu pentru Laptop A:
Laptop B - 127.0.0.1 - 5556
Laptop C - 127.0.0.1 - 5557
Laptop D - 127.0.0.1 - 5558
După conectare, se poate folosi:
Trimitepentru mesaj către peer-ul selectatTrimite către toțipentru mesaj către toți peerii conectațiTrimite fișierpentru fișier către peer-ul selectatTrimite fișier către toțipentru fișier către toți peerii conectați
python3 test_cbc.pyRezultat așteptat:
Test CBC reusit.
python3 -m unittest discover -s tests -vDupă transfer, se poate verifica dacă fișierul primit este identic cu cel original:
sha256sum test.txt primit_test.txtDacă hash-urile sunt identice, fișierul a fost transmis, decriptat și reconstruit corect.
- Proiectul este realizat pentru scop educațional.
- Nu folosește biblioteci externe de criptografie.
- Blowfish este implementat manual.
- Comunicarea dintre stații se face prin socket TCP.
- În modul local, toate stațiile pot rula pe același laptop, folosind porturi diferite.
- Într-o rețea LAN, fiecare stație folosește IP-ul real al celorlalte stații.
- Autentificare cu username și parolă pentru fiecare peer
- Evitarea conexiunilor duplicate între aceleași două stații
- Salvarea fișierelor primite în directoare separate pentru fiecare nod
- Trimiterea payload-ului binar direct, fără conversie hex în JSON
- Adăugarea unui mecanism HMAC pentru verificarea integrității mesajelor
- Descoperirea automată a stațiilor din rețea
- Suport pentru configurare din fișier
- Python 3
- Socket TCP
- Threading
- Tkinter
- Diffie-Hellman
- Blowfish-CBC
- JSON
- Base64