martedì 8 marzo 2016

Basi Di Crittografia #1 - Cos'è La Crittografia?

Crittografia, l'arte di offuscare i messaggi. Fondamentale nel mondo dell'hacking. Ecco, quindi, che decido di scrivere una serie di articoli a riguardo per farti addentrare un questo intrigante mondo della crittografia. Sii assetato di conoscenza. Buona lettura.

Premessa​

Questa serie di guide non sono articoli a sè stanti. Essi sono in continua evoluzione e miglioramento. L'autore non è il maestro, il lettore non è l'alunno. Ognuno contribuisce ad arricchire questa serie (scrivendo idee e informazioni nei commenti) e chiunque può usufruire delle preziose informazioni che ne scaturiranno.

Questi sono i requisiti per comprendere questa serie di guide:
  • Cervello
  • Conoscenza delle basi di Matematica
  • Conoscenza minima del linguaggio di programmazione Python (ci saranno esempi pratici)

La Crittografia​

La crittografia (dall'unione di due parole greche: κρυπτóς (kryptós) che significa "nascosto", e γραφία (graphía) che significa "scrittura") è la branca della crittologia che tratta delle "scritture nascoste", ovvero dei metodi per rendere un messaggio "offuscato" in modo da non essere comprensibile/intelligibile a persone non autorizzate a leggerlo.

Fonte: Wikipedia
La crittografia è strettamente correlata con l'informatica e la matematica. Essa consiste nello studiare i vari metodi per rendere un messaggio decifrabile solo al destinatario.

Non va confusa con la crittanalisi che consiste nel decifrare i messaggi crittografati. Ci occuperemo anche di crittanalisi.

La scienza che comprende sia crittografia che crittanalisi è chiamata crittologia.

Esempio:
Ritorniamo indietro nel tempo, ai tempi della tua adolescenza (ad esempio 13-14 anni). Ipotizza che sei a scuola, in aula. Vuoi passare a un tuo amico del banco di fianco un "biglietto" su cui è scritta una frase che potete comprendere solo tra voi. Entrambi conoscete come scrivere messaggi in maniera "incomprensibile" per gli altri e comprensibile solo per voi.

Sul biglietto scrivi:

DPN'F' BOEBUB JFSJ MB QBSUJUB?

Passi il biglietto al tuo amico. Lui legge e capisce che la frase è:

COM'E' ANDATA IERI LA PARTITA?

Tu ed il tuo amico avete un sistema tutto vostro di comunicare. In pratica, quando tu o lui scrivete una frase "incomprensibile" per gli altri quello che fate è sostituire ogni lettera con la sua successiva. Della frase che gli hai voluto inviare "COM'E' ANDATA IERI LA PARTITA?" hai preso la C e l'hai sostituita con la sua successiva, la D; hai preso la O e l'hai sostituita con la sua successiva, la P; hai preso la M e l'hai sostituita con la N e così via.

La frase cifrata risultante è stata: "DPN'F' BOEBUB JFSJ DPO MBVSB?". Il tuo amico sa che deve sostituire ogni lettera con la sua precedente per capirne il significato originario. Prende la D e la sostituisce con la precedente, la C; prende la P e la sostituisce con la precedente, la O; prende la N e la sostituisce con la M e così via. In questo modo riesce a capire che la frase che gli hai inviato ha il significato "COM'E' ANDATA IERI LA PARTITA?" che è la frase decifrata.

Il tuo amico dunque sa cosa gli hai voluto dire. Sa anche cosa risponderti, ma per scriverlo sul biglietto di risposta che vuole passarti deve crifrarlo, ovvero utilizzare la stessa tecnica che hai usato tu (sostituire ogni lettera con la successiva) in modo che gli altri non possano comprenderne il significato. Scrive il messaggio cifrato sul biglietto, ma proprio mentre sta per passartelo la prof lo sgama.

Sul biglietto c'era scritto:

BCCJBNP TUSBWJOUP

Conoscendone il significato, ottimo direi...

Ma la prof non sa cosa vuol dire quella strana scritta. Quindi lascia perdere.

Primi esempi in Python​

Utilizzando il linguaggio di programmazione Python (download, consiglio la versione 2.7 che è quella che sarà utilizzata in queste guide) inizieremo ad approcciare il mondo della crittografia.

Sappiamo un primo metodo banale per criptare una frase (una stringa) che consiste nel sostituire ogni lettera con la successiva. Come possiamo scrivere un codice in Python che fa lo stesso?

In Python c'è una funzione molto utile: ord(carattere). A questa funzione dai un carattere come parametro (ad esempio 'c' oppure 'A') ed essa ritorna il suo corrispondente numero ASCII (se non sai cos'è cerca su Google "tabella ASCII", in pratica ad ogni lettera corrisponde un numero).

ord('a') ritorna il valore 97. La lettera a nella tabella ASCII, infatti, ha il valore 97.
ord('b') ritorna il valore 98.
ord('c') ritorna il valore 99.
E così via...

Attenzione: Il carattere 'a' ha un valore diverso dal carattere 'A', in quanto sono la stessa lettera ma due caratteri diversi.

Inoltre, in Python, c'è anche un'altra comoda funzione che è chr(valoreASCII). A questa funzione si passa come parametro un valore ASCII ed essa ritorna il corrispondente carattere.

chr(97) ritorna il carattere 'a'.
chr(98) ritorna il carattere 'b'.
chr(99) ritorna il carattere 'c'.
E così via...

Grazie a queste due funzioni possiamo scrivere una funzione che cifra una frase sostituendo ogni lettera con la successiva.

Innanzitutto, premettiamo che la nostra funzione cifrerà solo lettere minuscole, quindi dal carattere 'a' al carattere 'z', o meglio dal valore ASCII 97 al valore 122. La nostra funzione non cifra nè gli spazi, nè gli apici, nè i caratteri speciali ma cifra solo lettere minuscole.

La nostra funzione consiste, appunto, nel sostituire ogni lettera con la successiva. Ma cosa succede se deve sostituire la lettera 'z' con la successiva? Deve ritornare alla 'a'.

Ora che abbiamo, mentalmente, il funzionamento dello script possiamo passare al codice:
def cifra(stringa):
    stringaCifrata = ""
    stringa = stringa.lower()
    for lettera in stringa:
        if ord(lettera) >= 97 and ord(lettera) < 122:
            stringaCifrata += chr(ord(lettera) + 1)
        elif ord(lettera) == 122:
            stringaCifrata += 'a'
        else:
            stringaCifrata += lettera
    return stringaCifrata
Link al codice.

La riga
stringa = stringa.lower()
non fa altro che cercare le lettere maiuscole nella stringa da cifrare e sostituirle con le corrispondenti lettere minuscole.

Per chi se ne intende un minimo di programmazione, il codice non dovrebbe risultare molto complicato.

Per stampare una stringa cifrata basta scrivere il codice:
s = cifra("com'e' andata ieri la partita?")
print s

Lascio a voi scrivere una funzione per decifrare una stringa cifrata.

Se hai dubbi, domande o problemi col codice non esitare a scrivere nei commenti.

7 commenti:

  1. ottima spiegazione ! hai intenzione di utilizzare in futuro l'RSA?
    e poi una mia richiesta personale è se potevi fare degli articoli sulle VPN sui cui aleggia tanta ignoranza...e magari come riuscire a scoprire chi si nasconde dietro una comunicazione tor
    grazie mille e continua così!!

    RispondiElimina
    Risposte
    1. Per quanto riguarda l'RSA ci penserò...

      Sulle VPN sto preparando un articolo a riguardo.

      Scoprire chi si nasconde dietro una comunicazione Tor è complicato. Molto. Quindi non potrò trattare un argomento di tale portata (su cui anche io sono inesperto) su questo blog.

      Elimina
    2. ok grazie mille per aver risposto :)

      Elimina
    3. Grazie a te. Se hai altri suggerimenti, non esitare a scriverli, mi sono di aiuto.

      Elimina
  2. ciao, non ho capito bene quando hai scritto ,for lettera in stringa, perciò potresti spiegarmi meglio cosa bisogna mettere.
    P.S.
    potresti scrivere anche la tua email che l' ho persa.
    Grazie.

    RispondiElimina
    Risposte
    1. Non è altro che un ciclo. "lettera" e "stringa" sono due variabili e non devi mettere niente al loro posto, devi lasciare scritto così com'è.

      Impara prima il linguaggio Python e poi potrai seguire questa serie di articoli (l'ho anche specificato nei requisiti).

      P.S. L'email a cui puoi contattarmi per qualsiasi domanda è diventarehackerblog@gmail.com, se la perdi di nuovo vai nella pagina "Chi Sono", la trovi lì.

      Elimina