
Ed eccoci con la seconda parte del nostro tutorial sull’uso della crittografia nelle applicazioni iOS (iPhone e iPad) con RNCryptor: oggi si fa pratica!
Per usare RNCryptor nel vostro progetto è sufficiente importare la libreria con tutti i files che contiene prelevandolo direttamente dallo stream di Rob Napier su github.
Sulla vostra applicazione sarà poi sufficiente importare questi headers per usufruire dei servizi offerti da RNCryptor:
#import "RNEncryptor.h"
#import "RNDecryptor.h"
Nell’esempio proposto ho optato per una interfaccia minimale. Questo per focalizzare l’attenzione esclusivamente sull’uso delle API di RNCryptor, piuttosto che ad elementi estetici o altre funzionalità del progetto. Per questo il tutorial si basa su un’unica UIViewController in cui sono presenti semplicemente tutti i campi di testo utili per dimostrare l’encryption e la decryption.

Possiamo osservare le UITextField predisposte per:
- inserire il testo da cifrare
- inserire la password con cui cifrare
- inserire la password con cui decifrare (per dimostrare che se non combacia con loriginale di cifratura, l’operazione non va a buon fine)
- inserire eventualmente lo stream dati (in ASCII) da decifrare
Sono presenti anche delle UITextView predisposte per:
- visualizzare il testo criptato (che verrà riportato anche sulla UITextField 4)
- visualizzare il testo in chiaro derivato dalla de-cifratura
Inoltre troviamo i pulsanti UIButton per:
- eseguire la cifratura
- eseguire la de-cifratura
- resettare tutti i campi
Qui di seguito si può osservare un esempio pratico di inserimento di una frase e della password. Quindi dopo aver premuto sul pulsante “Encrypt” verrà visualizzato il messaggio cifrato.


La funzione di encrypt è realizzata con queste poche righe di codice:
NSData *data = [textToCrypt.text dataUsingEncoding:NSUTF8StringEncoding];
//encrypt!
NSData *encryptedData = [RNEncryptor encryptData:data
withSettings:kRNCryptorAES128Settings
password:password2crypt.text
error:&error];
Come si può osservare è estremamente semplice, basta indicare un oggetto NSData che nel tutorial è stato derivato dalla conversione in NSData della NSString del campo UITextField. Occorre indicare la struttura dati che imposta tutti i settaggi dell’algoritmo, che nell’esempio è riportata kRNCryptorAES128Settings. Quindi indicare la password in formato NSString e la variabile NSError che conterrà l’eventuale errore della conversione.
L’output della cifratura è un oggetto NSData, per poterlo visualizzare a video è stata realizzata una funzione di conversione da NSData ad NSString che rappresenta quindi i dati binari in un formato hex.
cryptedString = [FirstViewController hexStringFromData:(NSData *)encryptedData];
Qui sotto si può osservare anche l’output dell’NSLog che è sparso nel codice:
2013-02-19 21:36:26.655 MGCryptorTutorial[9178:c07] sourceText:Questo è un testo di prova in chiaro! 2013-02-19 21:36:26.657 MGCryptorTutorial[9178:c07] sourceData:<51756573 746f20c3 a820756e 20746573 746f2064 69207072 6f766120 696e2063 68696172 6f21> 2013-02-19 21:36:26.657 MGCryptorTutorial[9178:c07] sourcePassword:<31323334 61626364> 2013-02-19 21:36:26.671 MGCryptorTutorial[9178:c07] encryptionSalt:<6a880558 ceb05090> 2013-02-19 21:36:26.671 MGCryptorTutorial[9178:c07] encryptionKey:<27e2d9d5 fd9c7e1d 7ed5ae1d be3d2670> 2013-02-19 21:36:26.672 MGCryptorTutorial[9178:c07] HMACSalt:<1e6b0473 43e1cc48> 2013-02-19 21:36:26.672 MGCryptorTutorial[9178:c07] HMACKey:<558aa20e 1c54fa1c 24963db7 6c1c4386> 2013-02-19 21:36:26.673 MGCryptorTutorial[9178:c07] IV:<5b1e1561 9a9ffb2c 08a13aa4 8f3be152> 2013-02-19 21:36:26.673 MGCryptorTutorial[9178:c07] encryptedData:<02016a88 0558ceb0 50901e6b 047343e1 cc485b1e 15619a9f fb2c08a1 3aa48f3b e152d4dd 6af1a48e 8da3b113 a6d13610 4817f424 7dbed44d b52d5cbc 6b60ee2d 72136ed6 86e372c9 37627571 19c780e9 cf5da918 b4c8bd52 323b31ff 0752d1da 61439c53 81c5> 2013-02-19 21:36:26.674 MGCryptorTutorial[9178:c07] encryptedText:02016A880558CEB050901E6B047343E1CC485B1E15619A9FFB2C08A13AA48F3BE152D4DD6AF1A48E8DA3B113A6D136104817F4247DBED44DB52D5CBC6B60EE2D72136ED686E372C93762757119C780E9CF5DA918B4C8BD52323B31FF0752D1DA61439C5381C5
Dopo aver impostato come password di de-cifratura la stessa per la cifratura (nel nostro esempio vale “1234abcd”, cliccando sul pulsante “Decrypt” si può osservare come l’operazione di de-cifratura riporti l’esito OK in verde e il messaggio che è tornato in chiaro nella UITextView relativa.

L’operazione di decrypt è eseguita mediante questa riga di codice:
NSData *decryptedData = [RNDecryptor decryptData:data
withPassword:password2decrypt.text
error:&error];
Come per l’encrypt, anche in questo caso è molto semplice, basta indicare l’oggetto NSData d’ingresso, la password e la variabile d’errore d’uscita.
Si noti come (a differenza della parte Encryption) non è necessario esplicitare la configurazione dell’algoritmo. L’ho fatto notare a Rob, il quale mi ha risposto che al momento la configurazione del decrypt è pre-cablata e non ha in programma di renderla configurabile così come è accaduto per la parte di encrypt. Sinceramente non ho capito benissimo le motivazioni di questa scelta, ma ad ogni modo se si vogliono cambiare a proprio piacimento è sufficiente cercare la stringa kRNCryptorAES128Settings in tutto il progetto e cambiarla con una tabella di configurazione diversa in base alle proprie eventuali proprie esigenze.
Ho voluto predisporre anche il campo UITextField per indicare (magari con un copy-and-paste) una stringa esadecimale che potrebbe essere il risultato della cifratura effettuata con lo stesso meccanismo di RNCryptor, ma implementata in un linguaggio diverso (ad esempio in PHP) e quindi verificarne l’esattezza con l’operazione di decrypt. Qui sotto è riportato un altro esempio di questo genere:

Proviamo a questo punto ad introdurre un errore volontariamente nella stringa di partenza, per esempio cambiando l’ultimo byte dello stream con il valore FF. Qui di seguito si può vedere l’errore generato, che deriva dal controllo della signature con l’HMAC.


Conclusioni
Questa è la fantastica e completa documentazione di RNCryptor realizzata da Rob Napier, in perfetto stile Apple.
Questo è il repository github di RnCryptor.
Qui, invece, potete scaricare il progetto completo Objective-C in Xcode 4.6.
Un ringraziamento alla redazione di devAPP per avermi dato la possibilità di pubblicare questo tutorial su questo blog. Non dimenticatevi di accedere anche al mio blog personale http://www.megabri.com e al portale delle mie App http://www.mgproductions.it.
Gabriele Merlonghi
One Response to “T#114 – Uso della crittografia nelle applicazioni iPhone e iPad con RNCryptor – Parte 2”
23 Marzo 2013
TechnoHouse » Tutorial sull’uso della Crittografia in applicazioni iOS parte 2[…] T#114 – Uso della crittografia nelle applicazioni iPhone e iPad con RNCryptor – Parte 2 […]