Francesco Runci
PhD | Security Researcher | Cyber Observer | IT Security | Programmer | Drone Pilot

Cryptex

Se vuoi una cosa fatta bene: fattela da solo!

E’ la massima che abbiamo sempre ascoltato, bene ma questa volta ha un valore aggiunto!

Si perchè nel mondo di internet non sappiamo mai con certezza, chi sta leggendo una conversazione, quanti ne hanno copia e soprattutto quante se la crittografia che molti vantano di utilizzare sia effettivamente reale, ovvero se i creatori della stessa crittografia non abbiano le chiavi anche per decrittografare.

Se questa cosa fosse invece affidata a noi? mi spiego meglio… se il programma utilizzato per crittografare e decrittografare fosse nostre? condiviso solo con la persona di interesse ed utilizzando solo chiavi che entrambi conosciamo? A questo punto non saremmo in grado di dire sicuri? Purtoppo non al 100% per diversi fattori, ma per lo meno abbiamo quasi raggiunto l’ottimo.

L’idea nasce per la creazione di un app che nulla fa che Crittografare e Decrittografare un messaggio attraverso delle variabili strettamente personali, ovvero:

  • L’utente a cui inviamo il nostro APK
  • La chiave che utilizziamo per cifrare il messaggio

E’ fatto ovvio che è possibile successivamente utilizzare la stringa crittografata manualmente (es. email, wathsapp etc…), come meglio vogliamo! Tanto nessuno saprà il contenuto, nemmeno se riuscissero a leggerlo

Andiamo a realizzare l’App.

Possiamo poi medificarla ed utilizzarla come meglio crediamo, questo articolo vuole essere uno spunto per i propri progetti.

Realizziamo per iniziare l’interfaccia grafica da activity_main utilizzando il comodo pannello dei pulsanti sulla destra.

  • EditorBox (3): saranno gli spazi dove andremo a scrivere o copiare
  • Switch(1): servirà per far capire al programma se crittografare o decrittografare
  • Button(1): pulsante che servirà per interagire con l’app.
  • Image(1): un po di abbellimento non guasta mai!

Detto questo è opportuno inserire in MainActivity il codice che legherà i pulsanti alle azioni che vogliamo:

public class MainActivity extends AppCompatActivity {

EditText chiper,password,IV;


public void showAlertDialogButtonClicked(View view, String messaggio) {

// setup the alert builder
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Cryptex");
builder.setMessage(messaggio);

builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

//System.exit(0);
}
});

AlertDialog dialog = builder.create();
dialog.show();
}


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ImageView img= (ImageView) findViewById(R.id.imageView);
// img.setScaleType(ImageView.ScaleType.FIT_XY);
// img.setAdjustViewBounds(true);
img.setImageResource(R.drawable.ironlex);


FloatingActionButton fab = findViewById(R.id.floatingActionButton);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

CheckBox chkIos = (CheckBox) findViewById(R.id.checkBox);
chiper = (EditText)findViewById(R.id.chiper);
String text = chiper.getText().toString();

try {

// String pass = URLEncoder.encode(password.getText().toString(), "UTF-8");
// String iv = URLEncoder.encode(IV.getText().toString(), "UTF-8");

Cryptex cp = new Cryptex();
Switch simpleSwitch = (Switch) findViewById(R.id.switch1);
Boolean switchState = simpleSwitch.isChecked();

if(switchState) {

String decr = cp.decrypt(text);
EditText decod = findViewById(R.id.decodifica);
decod.setText(decr);

Toast.makeText(getBaseContext(), "Decodifica effettuata!", Toast.LENGTH_LONG).show();
}
else
{
String enc = cp.encrypt(text);
EditText cod = findViewById(R.id.codifica);

cod.setText(enc);


Toast.makeText(getBaseContext(), "Codifica effettuata!", Toast.LENGTH_LONG).show();
}
}catch (Exception e)
{
Toast.makeText(getBaseContext(),""+e,Toast.LENGTH_LONG).show();
}

}

});

}
}

Non ci resto che implementare la nostra classe Cryptex.java dove andremo ad inserire le due chiamate a funzione: decrypt e encrypt

Prima di proseguire è giusto spendere due parole circa l’algoritmo di codifica: Nel nostro caso utilizzeremo un algoritmo AES.

In crittografia, l’Advanced Encryption Standard (AES), conosciuto anche come Rijndael ([ˈrɛindaːl]),[1][2] di cui più propriamente è una specifica implementazione,[2] è un algoritmo di cifratura a blocchi utilizzato come standard dal governo degli Stati Uniti d’America.
Data la sua sicurezza e le sue specifiche pubbliche si presume che in un prossimo futuro venga utilizzato in tutto il mondo come è successo al suo predecessore, il Data Encryption Standard (DES) che ha perso poi efficacia per vulnerabilità intrinseche. AES è stato adottato dalla National Institute of Standards and Technology (NIST) e dalla US FIPS PUB nel novembre del 2001[3] dopo 5 anni di studi, standardizzazioni e selezione finale tra i vari algoritmi proposti.
L’algoritmo scelto è stato sviluppato da due crittografi belgi, Joan Daemen e Vincent Rijmen, che lo hanno presentato al processo di selezione per l’AES con il nome di “Rijndael”, derivato dai nomi degli inventori. Rijndael, in fiammingo, si pronuncia approssimativamente “rèin-daal”.

https://it.wikipedia.org/wiki/Advanced_Encryption_Standard

Andiamo quindi ad implementare la classe:

public class Cryptex {
private static final String ALGORITHM = "AES";
private static final String MODE = "AES/CBC/PKCS7Padding";
private static final String IV = "123456789";
private static final String KEY = "questaelamiachiavepreferita";


public static String encrypt(String value) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(MODE);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] values = cipher.doFinal(value.getBytes());
return Base64.encodeToString(values, Base64.DEFAULT);
}

public static String decrypt(String value) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
byte[] values = Base64.decode(value, Base64.DEFAULT);
SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(MODE);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
return new String(cipher.doFinal(values));
}
}

Niente di più semplice dato che le due funzioni utilizzano delle variabili preimpostate da noi e quindi con possiblità di poter modificare le chiavi (IV, password) per poi decifrare e crittografare il messaggio.

Terminata l’implementazione andremo a creare la nostra app (.apk) come mostra la figura seguente:

Il gioco è fatto, la nostra app è realizzata e pronta ad essere utilizzata in tutti i telefoni Android.

Share

You may also like...

5 Responses

  1. Pepè says:

    …number one!!! Great my friend.

  2. article says:

    It works really well for me

  3. Blaine says:

    I spent a great deal of time to find something like this

  4. It’s really a cool and useful piece of information. I am glad that you shared this helpful information with us. Please keep us up to date like this. Thanks for sharing.

Leave a Reply

Your email address will not be published. Required fields are marked *