Recentemente mi sono interessato alla crittografia e ai metodi dietro di loro. Quindi per un progetto divertente / scolastico sto costruendo un programma in python per crittografare i dati tra due client (chat e file).
Non sono proprio sicuro di come renderlo veramente sicuro contro gli attacchi sia passivi che attivi. In questo momento la mia idea è di usare un server per stabilire un handshake tra i client nel modo seguente:
- Una volta avviato, il client si connette al server per comunicarne la presenza.
- Client bob consente al server di sapere che desidera connettersi al client Alice
- Il server invia un messaggio al client Alice che bob vuole impostare una connessione sicura
- Alice dice al server che accetta la connessione
- Il server genera un numero casuale e lo crittografa utilizzando la chiave pubblica del client Il client ha una chiave RSA privata codificata (non cambia per connessione / client)
- Server invia il numero casuale sia ad Alice che a Bob
- Alice e Bob decodificano il numero casuale e lo cancellano, entrambi lo rimandano al server
- Il server controlla se entrambi gli hash sono uguali (nessuno è temperato con)
- Il server invia un OK o un errore ad entrambe le parti
- Alice e bob cancellano il numero un numero di volte uguale al numero casuale (quindi se il server invia 1234 lo cancellano 1234 volte.
- Alice e Bob impostano una chiave comune per questa connessione utilizzando lo scambio di chiavi Diffie-Hellman e crittografano lo scambio con AES.
- Una volta decisa una chiave comune, utilizzare questa chiave o un hash di questa chiave per la crittografia AES (questa chiave cambia per connessione e tutti i dati vengono inviati su questo canale)
L'unico problema che vedo con questo protocollo se gli avversari possono decodificare il mio codice per ottenere la chiave privata e possono usare attacchi attivi sia con Alice che con la connessione di Bob OPPURE se il server è mai compromesso.
Userò py2exe per compilare il codice, in questo modo dovrebbe essere difficile ottenere la chiave ma non sono sicuro di quanto sarebbe difficile.
Ci scusiamo per la lunga domanda, ma sembra davvero un'idea orribile per codificare la chiave nel client, ma non sono sicuro di dove andare da qui.
Pensieri su questa idea / miglioramenti / Come posso fare meglio?
Ci scusiamo per qualsiasi refuso, l'inglese non è la mia prima lingua.