2009-09-13 15 views
15

Ho un'app per iPhone che crittografa un NSString immesso tramite CCCrypt (AES256) e una chiave in chiaro. La stringa e la chiave vengono assegnate al metodo di crittografia che restituisce un oggetto NSData.NSData crittografato su NSString in obj-c?

Richiesta [descrizione dei dati] dove 'dati' sono i dati stringa crittografata fornisce una NSString come: "< 0b368353 a707e7de 3eee5992 ee69827e e3603dc2 b0dbbc0b 861ca87d f39ce72a>", ma quando provo a convertire in un NSString, ottengo "(nullo)".

Ho bisogno di restituire un NSString all'utente, che può essere utilizzato per decifrare di nuovo alla stringa originale usando la stessa chiave in chiaro. Se la proprietà 'description' dell'oggetto NSData può restituire una stringa, esiste un modo per produrre una NSString dall'oggetto NSData senza ottenere "(null)"?

AGGIORNAMENTO: Grazie a Quinn, che suggerisce di utilizzare la codifica Base64 per produrre la stringa confusa. Da quello che ho capito, la codifica Base64 non si limita a scambiare i caratteri, ma lo scambio di caratteri dipende dalla posizione, quindi va bene.

La mia unica preoccupazione è che voglio essere in grado di crittografare il messaggio con una "passphrase", e richiedere la passphrase identica da inserire quando la stringa confusa deve essere decodificata - qualcuno può suggerire modi per implementarlo?

+0

Ho aggiornato la mia risposta per rispondere a questa domanda. Sei corretto, Base64 non è un algoritmo di sostituzione, in pratica espande 3 byte fino a 4 byte, quindi i dati codificati sono 1.37x grandi quanto la loro controparte non codificata. Fondamentalmente, ci vogliono 3 blocchi da 8 bit e lo si riduce in 4 blocchi da 6 bit, quindi li reinterpreta ciascuno come blocchi da 8 bit, che possono essere facilmente rappresentati in ASCII. Wikipedia ha più dettagli. –

risposta

32

Prima di tutto, NON utilizzare -[NSData description] per creare un NSString per tali scopi. (È meglio trattare -description come output di debug. Mi scuso se my previous answer ti ha ingannato, stavo semplicemente stampando la descrizione per dimostrare che NSData può essere crittografato e decrittografato.) Utilizzare invece i metodi -dataUsingEncoding: e -initWithData:encoding: di NSString per la conversione tra NSData e NSString. Anche con questi, si noti che i dati crittografati con AES probabilmente non si traducono bene in stringhe così com'è - alcune sequenze di byte non funzionano bene, quindi è una buona idea codificare i dati prima di creare la stringa.

Suggerirei di provare Base64 encoding NSData, poiché i dati Base64 possono sempre essere rappresentati come una stringa ASCII. (Naturalmente, quando lo fate, dovrete decodificare da Base64 prima di decifrare.)

Ecco alcune risorse utili ...


Edit: stavo assumendo che ci si combina questo con la mia risposta a your previous question su crittografia AES di oggetti NSString. La codifica dei dati come Base64 non pone alcuna restrizione sui dati stessi - può essere certamente un dato crittografato con AES. Ecco cosa fare se si desidera solo stringa di input e di output:

  • crittografia
    • Fornire il NSString per essere criptato, e la passphrase da utilizzare per la crittografia.
    • Convertire la stringa in un NSData ed eseguire la crittografia AES su di esso (vedere la domanda precedente).
    • Base64-codifica NSData, quindi crea e restituisce e NSString dell'output codificato.
  • decrittografia
    • Fornire la stringa crittografata e codificati, e la frase di accesso da utilizzare per la decrittografia.
    • Creare un NSData dalla prima stringa, quindi Base64 decodifica i dati.
    • Eseguire la decrittografia AES sui dati, quindi creare e restituire una NSString.

E 'davvero solo una questione di concatenamento delle due parti insieme e li eseguendo in senso inverso la via d'uscita. Dalla mia precedente risposta, è possibile modificare encryptString:withKey: per eseguire l'ultimo passaggio e restituire una stringa e modificare decryptData:withKey: in decryptString:withKey: e accettare due stringhe. È piuttosto semplice.

+3

+1 e Grazie per il collegamento a NSDataAdditions, molto utile! –

+0

@FreeAsInBeer Si prega di non contrassegnare le risposte di altre persone come Wiki della comunità quando si modificano. Non è quello per cui è. –

+0

@QuinnTaylor Le FAQ indicano che sei l'unico ad avere accesso specifico alla casella Wiki della community. La mia modifica potrebbe aver inavvertitamente causato l'accesso alla modalità Wiki della community, ma ciò era completamente involontario. Per favore non accusare altre persone di fare cose che non possono fare. [Riferimento] (http://meta.stackexchange.com/questions/11740/what-are-community-wiki-posts/11741#11741) – FreeAsInBeer

2

Ho creato un pacchetto completo di categorie per NSData e NSString per fornire la crittografia AES256 per le stringhe.

Vedere my answer nella domanda "originale" per ulteriori dettagli.