Crittografia robusta: idea!

Google e Microsoft stanno investendo pesantemente su algoritmi di intelligenza artificiale e c’è chi sostiene che nel giro di 10 o 15 anni potremmo avere a disposizione computer con potenze di calcolo equiparabili a quelle di un cervello umano.

Questo mi ha fatto ragionare molto sull’aspetto della sicurezza informatica, come potrebbe adeguarsi il mondo delle password e della crittografia in generale?

Il processo di crittografia in particolare, prevede che attraverso una chiave più o meno lunga, un documento venga cifrato e reso illeggibile.

Avere o trovare la chiave è l’unico sistema per risalire al documento iniziale, è palese quindi che una chiave molto corta implichi un grado di sicurezza minore, ed è per questo che negli anni ho visto le chiavi di cifratura aumentare sempre di più di lunghezza.

Quindi, la robustezza del processo di cifratura e decifratura è data mediamente dalla lunghezza della chiave, tuttavia, con l’incrementare della potenza dei computer, l’unico modo per essere veramente sicuri che i nostri dati siano al sicuro è avere una chiave ipoteticamente lunga come l’intero documento da crittografare.

Aumentando tuttavia la lunghezza della chiave così tanto vorrebbe dire aumentare esponenzialmente il tempo necessario al processo di cifratura.

Quello che servirebbe in sostanza è qualcosa che sia velocissimo e in grado di cifrare i documenti con una chiave lunga come il documento stesso.

Idea

In ogni linguaggio che io conosca esiste una funzione per generare sequenze di numeri casuali, solitamente la funzione si chiama Random, Randomize o Rnd.

Va detto però che i nostri computer non sono in nessun modo capaci di generare numeri casuali, quello che in realtà viene eseguito dalla funzione Random è (dato un numero) restituire una sequenza di numeri che sembrano casuali ma che in realtà sono del tutto ripetibili, di solito infatti, per ottenere numeri potenzialmente casuali, la funzione Random viene inizializzata con parametri esterni che hanno a che fare con l’ora del PC e altri parametri.

In sostanza, se ad esempio in c# eseguiamo la funzione Random(10), i primi 5 numeri restituiti saranno sempre 2041175501 1613858733 1627583427 1487326767 1548100671.

Un’altra funzione che ogni linguaggio possiede è Xor, la usai per la prima volta in Visual Basic 4 per cifrare le password e le chiavi software dei programmi che facevo e solo oggi mi rendo conto di come fosse banale decifrarle (:-)).

Xor è una funzione molto semplice, dati due valori ne viene calcolato un terzo, avendo a disposizione 2 di questi 3 valori è possibile risalire al terzo, qualsiasi essi siano.

Xor è per esempio il sistema su cui si basa un RAID 5 composti da almeno 3 harddisk, se uno dei 3 harddisk si dovesse guastare sarà sempre possibile risalire ai dati che conteneva attraverso lo Xor degli altri 2 dischi sopravvissuti.

 Dove voglio arrivare?

Ecco un esempio in c# dalla semplicità disarmante della routine per cifrare in maniera inattaccabile qualsiasi documento:

class Program
    {
        static void Main(string[] args)
        {
            int hashkey = "Chiave per la crittografia".GetHashCode();

            // Cifratura
            string crypted = CryptDecrypt(hashkey, "Hello World!!!");
            Console.WriteLine("Encrypted: {0}", crypted);

            // Decifratura
            string decrypted = CryptDecrypt(hashkey, crypted);
            Console.WriteLine("Decrypted: {0}", decrypted);

            Console.ReadLine();
        }

        private static string CryptDecrypt(int key, string document)
        {
            Random random = new Random(key);
            StringBuilder output = new StringBuilder();
            foreach (char ch in document)
            {
                int tmp = ch ^ (char)random.Next();
                output.Append((char)tmp);
            }
            return output.ToString();
        }
    }

Questo è un esempio veloce solo per far capire l’algoritmo di per sè molto elementare, spero vi possa essere utile per proteggere i vostri segreti 🙂

Rispondi