AES-Rijndael con ActionScript e ASP.Net
Cristian Merighi ()

Come passare dati criptati in tutta sicurezza tra un oggetto Flash e un applicativo server side sviluppato in tecnologia .Net utilizzando l'algoritmo Rijndael/AES.
Questo articolo è da considerarsi obsoleto. Alcune funzionalità potrebbero non essere più disponibili e non è possibile aggiungere commenti.
In questi giorni sto lavorando ad un concorso online consistente in un gioco flash custom che ha
il compito di coinvolgere gli utenti del web in modo da poterne stilare una classifica (in termini di punteggio ottenuto al gioco).
I 10 top scorers riceveranno un gran bel premio una volta terminato il concorso...
Nulla da dire sul fatto che la caratteristica più richiesta al concorso è stata quella della sicurezza! (Sì, lo so che non
è una novità e che anzi è basilare, sta di fatto che stavolta più di altre volte l'accento è stato marcato visto il montepremi...)
Il punto cruciale di debolezza per l'applicativo è il passaggio di dati tra il gioco in flash (client side) e lo strato di logica dell'applicativo (server side).
Abbiamo voluto evitare che navigatori maliziosi potessero sniffare, postare, forzare dati in modo da falsare la classifica.
Per fare ciò ci siamo affidati alla crittazione dei dati!
Sappiamo bene che impossibile impedire a un utente di visualizzarsi i propri pacchetti http, solo ci accontentiamo che non li possa leggere
in modo da poter poi riprodurre post falsati.
Il .Net Framework di suo è piuttosto ricco quanto ad API per la crittazione (e per le versioni future è previsto un ulteriore ampliamento
delle librerie, date un occhio a cosa è compreso nella
prossima CTP di Orcas),
l'ActionScript invece difetta di questo tipo di classi...
Grazie al lavoro di Mika Palmu, che ha messo insieme
un package davvero utile di classi ActionScript 2.0 focalizzate sulla crittografazione, possiamo affrontare la missione con
relativa tranquillità...
Di seguito un esempio funzionante dell'operatività richiesta:
Di seguito il nucleo di codice ActionScript utilizzato per la crittazione...
var aesMode:String = "ECB";
var aesKey:String = "01230123012390129012901A";
var aes:it.pacem.Rijndael = new it.pacem.Rijndael(192, 128);
cipher_txt.text = aes.encrypt(plain_txt.text, aesKey, aesMode);
...e quello C# utilizzato, lato server, per la decrittazione:
MemoryStream msDecrypt = null;
CryptoStream csDecrypt = null;
StreamReader srDecrypt = null;
System.Security.Cryptography.RijndaelManaged aesAlg = null;
string plaintext = null;
try
{
aesAlg = new System.Security.Cryptography.RijndaelManaged();
aesAlg.Key = "01230123012390129012901A";
aesAlg.Mode = CipherMode.ECB;
aesAlg.Padding = PaddingMode.Zeros;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
msDecrypt = new MemoryStream(cipherText);
csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
srDecrypt = new StreamReader(csDecrypt);
plaintext = srDecrypt.ReadToEnd();
}
finally
{
if (srDecrypt != null)
srDecrypt.Close();
if (csDecrypt != null)
csDecrypt.Close();
if (msDecrypt != null)
msDecrypt.Close();
if (aesAlg != null)
aesAlg.Clear();
}
Per maggiori specifiche sull'algoritmo Rijndael/AES, rimandiamo al documento ufficiale
sullo standard AES (FIPS PUB 197) e alla documentazione MSDN sulla classe System.Security.Cryptography.RijndaelManaged.
« download AES Standard (FIPS PUB 197) in PDF format
« download code
Take care. Bye.