venerdì 22 agosto 2014

CRITTOGRAFIA SEMPLICE IN JAVA

Quella di cui voglio parlare oggi forse è una delle più semplici ma più sconosciute forme di crittografia a chiave condivisa(o simmetrica) esistenti.




Avevamo già affrontato l'argomento di sicurezza informatica in questo articolo. Vediamo prima di tutto la teoria e successivamente il semplice codice che permette la criptazione/decriptazione.


La Teoria

La crittografia a chiave condivisa è un metodo per nascondere le informazioni che passano da un canale di comunicazione mascherandole tramite il medesimo algoritmo e la medesima chiave di lettura/scrittura. 
Esistono molte applicazioni pratiche di questa metodologia fra cui l'applicazione dell operatore booleano XOR, vediamo un esempio:

informazione: 00000001 00000010 00000011 00000100
chiave:       10101010 10101010 10101010 10101010
crittografia: 10101011 10101000 10101001 10101110
chiave:       10101010 10101010 10101010 10101010
informazione: 00000001 00000010 00000011 00000100

Com'è possibile vedere questa operazione è matematicamente semplice e il risultato è accettabile; Inoltre, dato che ogni char (non unicode) può essere rappresentato in un byte, questo metodo può essere applicato anche alla decodifica di testi.

La Pratica

Nella pratica il lavoro sporco viene effettuato dalla nostra classe XORCryptograpyManager che, data la chiave come parametro, effettua la criptazione e decriptazione delle stringhe che gli vengono fornite:

package org.dgl.manager;

public class XORCryptographyManager {
    
    private byte key;
    
    public XORCryptographyManager(byte key){
        this.key = key;
    }
    
    public String encrypt(String input){
        char[] inputArray = input.toCharArray();
        char[] outputArray = new char[inputArray.length];
        for(int i =0;i<inputArray.length;i++){
            outputArray[i]=(char)((byte)inputArray[i] ^ key);
        }
        return new String(outputArray);
    }
    
    public String decrypt(String input){
        char[] inputArray = input.toCharArray();
        char[] outputArray = new char[inputArray.length];
        for(int i =0;i<inputArray.length;i++){
            outputArray[i]=(char)((byte)inputArray[i] ^ key);
        }
        return new String(outputArray);
    }
}

Conclusione

Questo algoritmo è tanto semplice quanto poco robusto, è ampliamente saputo che ormai la crittografia a chiave condivisa è facilmente decifrabile. Tuttavia è più conveniente che storicizzare informazioni in chiaro. 

Nessun commento:

Posta un commento