{"id":10211,"date":"2013-03-22T13:14:41","date_gmt":"2013-03-22T12:14:41","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=10211"},"modified":"2013-05-14T17:05:23","modified_gmt":"2013-05-14T15:05:23","slug":"t114-uso-della-crittografia-nelle-applicazioni-iphone-e-ipad-con-rncryptor-parte-2","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t114-uso-della-crittografia-nelle-applicazioni-iphone-e-ipad-con-rncryptor-parte-2\/","title":{"rendered":"T#114 \u2013 Uso della crittografia nelle applicazioni iPhone e iPad con RNCryptor &#8211; Parte 2"},"content":{"rendered":"<p>Ed eccoci con la seconda parte del nostro tutorial sull&#8217;uso della crittografia nelle applicazioni iOS (iPhone e iPad) con RNCryptor: oggi si fa pratica!<br \/>\nPer usare RNCryptor nel vostro progetto \u00e8 sufficiente importare la libreria con tutti i files che contiene prelevandolo direttamente dallo stream di Rob Napier su github.<br \/>\nSulla vostra applicazione sar\u00e0 poi sufficiente importare questi headers per usufruire dei servizi offerti da RNCryptor:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \"RNEncryptor.h\"\r\n#import \"RNDecryptor.h\"\r\n<\/pre>\n<p>Nell&#8217;esempio proposto ho optato per una interfaccia minimale. Questo per focalizzare l&#8217;attenzione esclusivamente sull&#8217;uso delle API di RNCryptor, piuttosto che ad elementi estetici o altre funzionalit\u00e0 del progetto. Per questo il tutorial si basa su un&#8217;unica UIViewController in cui sono presenti semplicemente tutti i campi di testo utili per dimostrare l&#8217;encryption e la decryption.<!--more--><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-01.png\" alt=\"t114-crittografia-ios-app-con-RNCryptor-01\" width=\"382\" height=\"835\" class=\"aligncenter size-full wp-image-10223\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-01.png 382w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-01-137x300.png 137w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Possiamo osservare le UITextField predisposte per:<\/p>\n<ol>\n<li>inserire il testo da cifrare<\/li>\n<li>inserire la password con cui cifrare<\/li>\n<li>inserire la password con cui decifrare (per dimostrare che se non combacia con loriginale di cifratura, l&#8217;operazione non va a buon fine)<\/li>\n<li>inserire eventualmente lo stream dati (in ASCII) da decifrare<\/li>\n<\/ol>\n<p>Sono presenti anche delle UITextView predisposte per:<\/p>\n<ol start=\"5\">\n<li>visualizzare il testo criptato (che verr\u00e0 riportato anche sulla UITextField 4)<\/li>\n<li>visualizzare il testo in chiaro derivato dalla de-cifratura<\/li>\n<\/ol>\n<p>Inoltre troviamo i pulsanti UIButton per:<\/p>\n<ol start=\"7\">\n<li>eseguire la cifratura<\/li>\n<li>eseguire la de-cifratura<\/li>\n<li>resettare tutti i campi<\/li>\n<\/ol>\n<p>Qui di seguito si pu\u00f2 osservare un esempio pratico di inserimento di una frase e della password. Quindi dopo aver premuto sul pulsante &#8220;Encrypt&#8221; verr\u00e0 visualizzato il messaggio cifrato.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-02.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-02.png\" alt=\"t114-crittografia-ios-app-con-RNCryptor-02\" width=\"382\" height=\"835\" class=\"aligncenter size-full wp-image-10224\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-02.png 382w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-02-137x300.png 137w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/a><br \/>\n<\/center><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-03.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-03.png\" alt=\"t114-crittografia-ios-app-con-RNCryptor-03\" width=\"382\" height=\"835\" class=\"aligncenter size-full wp-image-10225\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-03.png 382w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-03-137x300.png 137w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>La funzione di encrypt \u00e8 realizzata con queste poche righe di codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nNSData *data = [textToCrypt.text dataUsingEncoding:NSUTF8StringEncoding];\r\n\/\/encrypt!\r\nNSData *encryptedData = [RNEncryptor encryptData:data\r\n                                    withSettings:kRNCryptorAES128Settings\r\n                                        password:password2crypt.text\r\n                                           error:&error];\r\n<\/pre>\n<p>Come si pu\u00f2 osservare \u00e8 estremamente semplice, basta indicare un oggetto NSData che nel tutorial \u00e8 stato derivato dalla conversione in NSData della NSString del campo UITextField. Occorre indicare la struttura dati che imposta tutti i settaggi dell&#8217;algoritmo, che nell&#8217;esempio \u00e8 riportata kRNCryptorAES128Settings. Quindi indicare la password in formato NSString e la variabile NSError che conterr\u00e0 l&#8217;eventuale errore della conversione.<\/p>\n<p>L&#8217;output della cifratura \u00e8 un oggetto NSData, per poterlo visualizzare a video \u00e8 stata realizzata una funzione di conversione da NSData ad NSString che rappresenta quindi i dati binari in un formato hex.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\ncryptedString = [FirstViewController hexStringFromData:(NSData *)encryptedData];\r\n<\/pre>\n<p>Qui sotto si pu\u00f2 osservare anche l&#8217;output dell&#8217;NSLog che \u00e8 sparso nel codice:<\/p>\n<pre>\r\n2013-02-19 21:36:26.655 MGCryptorTutorial[9178:c07] sourceText:Questo \u00e8 un testo di prova in chiaro!\r\n2013-02-19 21:36:26.657 MGCryptorTutorial[9178:c07] sourceData:<51756573 746f20c3 a820756e 20746573 746f2064 69207072 6f766120 696e2063 68696172 6f21>\r\n2013-02-19 21:36:26.657 MGCryptorTutorial[9178:c07] sourcePassword:<31323334 61626364>\r\n2013-02-19 21:36:26.671 MGCryptorTutorial[9178:c07] encryptionSalt:<6a880558 ceb05090>\r\n2013-02-19 21:36:26.671 MGCryptorTutorial[9178:c07] encryptionKey:<27e2d9d5 fd9c7e1d 7ed5ae1d be3d2670>\r\n2013-02-19 21:36:26.672 MGCryptorTutorial[9178:c07] HMACSalt:<1e6b0473 43e1cc48>\r\n2013-02-19 21:36:26.672 MGCryptorTutorial[9178:c07] HMACKey:<558aa20e 1c54fa1c 24963db7 6c1c4386>\r\n2013-02-19 21:36:26.673 MGCryptorTutorial[9178:c07] IV:<5b1e1561 9a9ffb2c 08a13aa4 8f3be152>\r\n2013-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>\r\n2013-02-19 21:36:26.674 MGCryptorTutorial[9178:c07] encryptedText:02016A880558CEB050901E6B047343E1CC485B1E15619A9FFB2C08A13AA48F3BE152D4DD6AF1A48E8DA3B113A6D136104817F4247DBED44DB52D5CBC6B60EE2D72136ED686E372C93762757119C780E9CF5DA918B4C8BD52323B31FF0752D1DA61439C5381C5\r\n<\/pre>\n<p>Dopo aver impostato come password di de-cifratura la stessa per la cifratura (nel nostro esempio vale &#8220;1234abcd&#8221;, cliccando sul pulsante &#8220;Decrypt&#8221; si pu\u00f2 osservare come l&#8217;operazione di de-cifratura riporti l&#8217;esito OK in verde e il messaggio che \u00e8 tornato in chiaro nella UITextView relativa.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-04.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-04.png\" alt=\"t114-crittografia-ios-app-con-RNCryptor-04\" width=\"382\" height=\"835\" class=\"aligncenter size-full wp-image-10226\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-04.png 382w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-04-137x300.png 137w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>L&#8217;operazione di decrypt \u00e8 eseguita mediante questa riga di codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nNSData *decryptedData = [RNDecryptor decryptData:data\r\n                                    withPassword:password2decrypt.text\r\n                                           error:&error];\r\n<\/pre>\n<p>Come per l&#8217;encrypt, anche in questo caso \u00e8 molto semplice, basta indicare l&#8217;oggetto NSData d\u2019ingresso, la password e la variabile d\u2019errore d&#8217;uscita.<\/p>\n<p>Si noti come (a differenza della parte Encryption) non \u00e8 necessario esplicitare la configurazione dell\u2019algoritmo. L&#8217;ho fatto notare a Rob, il quale mi ha risposto che al momento la configurazione del decrypt \u00e8 pre-cablata e non ha in programma di renderla configurabile cos\u00ec come \u00e8 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 \u00e8 sufficiente cercare la stringa kRNCryptorAES128Settings in tutto il progetto e cambiarla con una tabella di configurazione diversa in base alle proprie eventuali proprie esigenze.<\/p>\n<p>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&#8217;esattezza con l&#8217;operazione di decrypt. Qui sotto \u00e8 riportato un altro esempio di questo genere:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-05.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-05.png\" alt=\"t114-crittografia-ios-app-con-RNCryptor-05\" width=\"382\" height=\"835\" class=\"aligncenter size-full wp-image-10227\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-05.png 382w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-05-137x300.png 137w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Proviamo a questo punto ad introdurre un errore volontariamente nella stringa di partenza, per esempio cambiando l&#8217;ultimo byte dello stream con il valore FF. Qui di seguito si pu\u00f2 vedere l&#8217;errore generato, che deriva dal controllo della signature con l&#8217;HMAC.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-06.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-06.png\" alt=\"t114-crittografia-ios-app-con-RNCryptor-06\" width=\"382\" height=\"835\" class=\"aligncenter size-full wp-image-10228\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-06.png 382w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-06-137x300.png 137w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/a><br \/>\n<\/center><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-07.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-07.png\" alt=\"t114-crittografia-ios-app-con-RNCryptor-07\" width=\"382\" height=\"835\" class=\"aligncenter size-full wp-image-10229\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-07.png 382w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t114-crittografia-ios-app-con-RNCryptor-07-137x300.png 137w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/a><br \/>\n<\/center><\/p>\n<h3>Conclusioni<\/h3>\n<p><a href=\"http:\/\/rnapier.github.com\/RNCryptor\/doc\/html\/Classes\/RNCryptor.html#overview\" target=\"_blank\">Questa<\/a> \u00e8 la fantastica e completa documentazione di RNCryptor realizzata da Rob Napier, in perfetto stile Apple.<\/p>\n<p><a href=\"https:\/\/github.com\/rnapier\/RNCryptor\" target=\"_blank\">Questo<\/a> \u00e8 il repository github di RnCryptor.<\/p>\n<p><a href=\"https:\/\/github.com\/megabri\/MGCryptorTutorial\" target=\"_blank\">Qui<\/a>, invece, potete scaricare il progetto completo Objective-C in Xcode 4.6.<\/p>\n<p>Un ringraziamento alla redazione di devAPP per avermi dato la possibilit\u00e0 di pubblicare questo tutorial su questo blog. Non dimenticatevi di accedere anche al mio blog personale <a href=\"http:\/\/www.megabri.com\" target=\"_blank\">http:\/\/www.megabri.com<\/a> e al portale delle mie App <a href=\"http:\/\/www.mgproductions.it\" target=\"_blank\">http:\/\/www.mgproductions.it<\/a>.<\/p>\n<p>Gabriele Merlonghi<\/p>\n<p><center><\/p>\n<h3>Vuoi ringraziare l&#8217;autore di questa guida?<br \/>\nOffrigli un caff\u00e8 scaricando <a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=https:\/\/itunes.apple.com\/it\/app\/fast-tutor\/id532463469?mt=8&#038;partnerId=2003\" target=\"_blank\">la sua applicazione<\/a> \ud83d\ude42<\/h3>\n<p><a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=https:\/\/itunes.apple.com\/it\/app\/fast-tutor\/id532463469?mt=8&#038;partnerId=2003\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/Banner-Fast-And-Tutor.png\" alt=\"Banner-Fast-And-Tutor\" width=\"468\" height=\"60\" class=\"aligncenter size-full wp-image-10214\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/Banner-Fast-And-Tutor.png 468w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/Banner-Fast-And-Tutor-300x38.png 300w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ed eccoci con la seconda parte del nostro tutorial sull&#8217;uso della crittografia nelle applicazioni iOS (iPhone e&#8230;<\/p>\n","protected":false},"author":529,"featured_media":10469,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1264,1266,413,1265],"class_list":["post-10211","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-pratici","tag-commoncrypto","tag-crittografia-applicazione-iphone-ipad","tag-programmare-iphone","tag-rncryptor-ios"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/529"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=10211"}],"version-history":[{"count":20,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10211\/revisions"}],"predecessor-version":[{"id":10470,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10211\/revisions\/10470"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/10469"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=10211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=10211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=10211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}