Come cifrare le comunicazioni di Whatsapp

Ultimo aggiornamento: 22-02-2016

Nelle ultime settimane, anche grazie alle chiacchiere con diverse persone, mi è balenata per la testa l’idea di fare un programma di messaggistica per cellulari con comunicazioni criptate che sfruttasse la crifratura a-simmetrica.

La cifratura a-simmetrica utilizza due chiavi:

  • Una chiave che si usa per cifrare i messaggi: la do alla persona con cui sto comunicando (chiave pubblica in gergo)
  • Una chiave per decifrare i messaggi che arrivano e che la tengo io da parte al sicuro (chiave privata)

Però  di app per comunicare sui cellulari con comunicazione cifrata già c’è ne sono: Telegram per esempio (che usa Diffie-Hellman per creare la key, da usare poi in AES per cifrare i messagi) e poi il monopolio è in mano a Whatsapp, che  trasmette i messaggi in chiaro… quindi perchè non cifrare le comunicazioni di  whatsapp? =)

A questo punto ho pensato ad un protocollo, il più facile possibile, giusto per fare un Proof-Of-Concept (una prova, insomma):

  1. Ogni volta che si avvia uno scambio di messagi viene generata una coppia di chiavi RSA diversa, sfruttando una lista di numeri primi.
  2. La comunicazione viene criptata con RSA solo quando i due utenti si scambiano la chiave pubblica, se ciò non avviene la comunicazione rimane in chiaro.
  3. I messaggi cifrati vengono trasmessi codificati in base64, in modo da sfruttare il canale in chiaro messo a disposizione da whatsapp.

epwA livello di sicurezza questo protocollo è vulnerabile al man in the middle per non parlare degli attacchi applicabili a RSA; per questo suggerisco dei possibili miglioramenti al protocollo oltre a quelli a RSA presenti qui (tipo schema PKCS#1):

  • Usare le curve ellettiche invece di RSA: cifratura a-simmetrica più difficile da rompere di RSA e che utilizza chiavi più corte (in bit).
  • Sfruttare un’ infrastruttura a chiave pubblica: in modo da poter evitare attacchi man in the middle (si intende lo scambio della chiave pubblica degli utenti con quello di un attaccante).

Dalla teoria alla pratica: cercando per la rete, ho visto che ci sono già diverse librerie, fortunatamente, da utilizzare per comunicare col protocollo di whataspp, tra cui yowsup : una bella libreria scritta in python e che funziona: provare per credere!
E’ raccomandato fare un pò di pratica con lo script prima di procedere!
(Anche se a volte, nei test, è capitato che i messaggi non arrivassero subito o che non li ricevesse proprio: o riavviavo il programma o mettevo il cellulare in ascolto)

Analizzando il sorgente ho notato che basta modificare il file di esempio CmdClient.py per poter effetture una comunicazione cifrata.

Per usare RSA ho creato una classe ad hoc di poche righe, giusto per non richiedere la dipendenza di altre librerie. Se poi le volete usare, ci sono: PyCrypto, python-rsa (secondo me fatta meglio) e altre, basta cercare su un motore di ricerca.

Lo script: Scaricate il progetto da github e quindi avviate con :

./yowsup-cli --interactive 39Numero --wait --autoack --keepalive --config file_config

NB: il 39 davanti a Numero è il prefisso dell’Italia.

Ecco un mio scambio di messaggi tra il yowsup modificato ed un client whatsapp normale.
Da cellulare ho simulato il protocollo in modo da farvi vedere cosa vedessi io e cosa vedesse una persona con un client senza il supporto della cifratura:

peppe@peppe-System-Product-Name:~/yowsup-master/src$ ./yowsup-cli ...
Authed XXXXX
Starting Interactive chat with NUM2
My Rsa Info => n:34673017, e:43313, d:13140173
Enter Message or command: (/available, /crypt, /lastseen, /close, /unavailable)
ciao
[22-08-2014 10:31] MYNUM: ciao
/crypt
<<Request sent>>
<<Communication is crypted now!>>
ciao
[22-08-2014 10:32] MYNUM: ciao
[email protected] [22-08-2014 10:32]:ciao
/close
peppe@peppe-System-Product-Name:~/yowsup-master/src$ 

Ed ecco quel che vede una persona con un client che non supporta la cifratura (il programma ufficiale di whatsapp per l’appunto):protocollo_in_chiaroNell’immagine si può vedere come io abbia simulato il protocollo: alla fine, dal cellulare, mi rimando il  messaggio cifrato che gli ho inviato, che il mio client modificato decifra correttamente:

[email protected] [22-08-2014 10:32]:ciao

Fine!

Un grande grazie va al mio amico Stefano (aka  Antelox) per il testing e la pazienza 🙂
Se volete un’ alternativa a whatsapp: 5 Best WhatsApp alternatives with end-to-end Encryption: io suggerirei surespot perchè sfrutta i concetti di sicurezza espressi prima.

UPDATE 04/01/2015: dalle nuove rivelazioni di Snowden, si è visto che la cifratura OTR è una di quelle più rognose da intercettare, in più  yowsup ha integrato la proprietà di forward secrecy prima di whatsapp stesso.