2009-09-13 18 views
15

Ich habe eine iPhone App, die einen eingegebenen NSString mit CCCrypt (AES256) und einem Klartextschlüssel verschlüsselt. Die Zeichenfolge und der Schlüssel werden der Verschlüsselungsmethode übergeben, die ein NSData-Objekt zurückgibt.Verschlüsselte NSData zu NSString in obj-c?

anfordern [Datenbeschreibung], wobei ‚Daten‘ sind die verschlüsselten Zeichenfolge Daten geben einen NSString wie: „< 0b368353 a707e7de 3eee5992 ee69827e e3603dc2 b0dbbc0b 861ca87d f39ce72a>“ aber wenn ich versuche, das zu einem NSString zu konvertieren, erhalte ich „(Null)".

Ich muss einen NSString an den Benutzer zurückgeben, der verwendet werden kann, um mit dem gleichen Klartextschlüssel zurück zur ursprünglichen Zeichenfolge zu entschlüsseln. Wenn die Eigenschaft 'description' des NSData-Objekts eine Zeichenfolge zurückgeben kann, gibt es eine Möglichkeit, einen NSString vom NSData-Objekt zu erstellen, ohne "(null)" zu erhalten?

UPDATE: Danke an Quinn, der vorschlägt, die Base64-Codierung zu verwenden, um die verwirrte Zeichenfolge zu erzeugen. Soweit ich weiß, vertauscht die Base64-Codierung nicht einfach Zeichen, aber der Zeichenaustausch hängt von der Position ab, also ist das in Ordnung.

Meine einzige Sorge ist, dass ich die Nachricht mit einer "Passphrase" verschlüsseln und die identische Passphrase eingeben möchte, wenn die verwirrte Zeichenfolge decodiert werden muss - kann jemand Möglichkeiten vorschlagen, dies zu implementieren?

+0

Ich habe meine Antwort zu diesem Thema aktualisiert. Sie sind richtig, Base64 ist kein Substitutionsalgorithmus - es erweitert grundsätzlich 3 Bytes auf 4 Bytes, so dass kodierte Daten 1,37 x so groß sind wie sein nicht kodiertes Gegenstück. Im Grunde dauert es 3 8-Bit-Chunks und rediviert es in 4 6-Bit-Chunks, dann interpretiert jeder dieser als 8-Bit-Chunks, die leicht in ASCII dargestellt werden können. Wikipedia hat mehr Details. –

Antwort

32

Zunächst einmal DO NOT Verwenden Sie -[NSData description], um einen NSString für solche Zwecke zu erstellen. (Es ist am besten, -description als Debugging-Ausgabe zu behandeln. Ich entschuldige mich, wenn Sie in die Irre geführt hat, habe ich lediglich die Beschreibung gedruckt, um zu demonstrieren, dass die NSData verschlüsselt und entschlüsselt werden kann.) Verwenden Sie stattdessen NSString -dataUsingEncoding: und -initWithData:encoding: Methoden zwischen NSData und NSString zu konvertieren. Beachten Sie, dass AES-verschlüsselte Daten wahrscheinlich nicht so gut in Strings umgesetzt werden, wie sie sind - einige Byte-Sequenzen werden einfach nicht gut abgespielt. Es ist also eine gute Idee, die Daten vor dem Erstellen der Zeichenfolge zu codieren.

Ich würde vorschlagen, versuchen Sie Base64 encoding die NSData, da Base64 Daten immer als eine ASCII-Zeichenfolge dargestellt werden können. (Natürlich, wenn Sie das tun, werden Sie von Base64 haben zu entschlüsseln, bevor entschlüsseln.)

Hier sind einige hilfreiche Ressourcen ...


Edit: ich vorausgesetzt, Sie mit meiner Antwort auf your previous question auf AES-Verschlüsselung von NSString Objekte kombinieren würde. Die Codierung von Daten als Base64 stellt für die Daten selbst keine Einschränkungen dar - es kann sich durchaus um AES-verschlüsselte Daten handeln. Hier ist was zu tun ist, wenn Sie nur String-Eingang und Ausgang wollen:

  • Encryption
    • die NSString Geben Sie verschlüsselt werden, und das Passwort für die Verschlüsselung zu verwenden.
    • Konvertieren Sie die Zeichenfolge in eine NSData und führen Sie die AES-Verschlüsselung darauf aus (siehe vorherige Frage).
    • Base64-Codierung der NSData, dann erstellen und zurückgeben und NSString der codierten Ausgabe.
  • Entschlüsselungs
    • Bereitstellung des verschlüsselten und codierten Zeichenfolge und das Passwort für die Entschlüsselung zu verwenden.
    • Erstellen Sie eine NSData aus der ersten Zeichenfolge, dann Base64-decodieren Sie die Daten.
    • Führen Sie die AES-Entschlüsselung für die Daten durch, erstellen Sie dann einen NSString und geben Sie ihn zurück.

Es ist wirklich nur darum, die beiden Teile miteinander verketten und sie in umgekehrter Richtung auf dem Weg aus der Durchführung. Von meiner vorherigen Antwort können Sie encryptString:withKey: ändern, um den letzten Schritt auszuführen und eine Zeichenfolge zurückzugeben, und decryptData:withKey: zu decryptString:withKey: ändern und zwei Zeichenfolgen akzeptieren. Es ist ziemlich einfach.

+3

+1 und Danke für den Link zu NSDataAdditions, sehr nützlich! –

+0

@FreeAsInBeer Bitte markieren Sie die Antworten anderer Personen nicht als Community-Wiki, wenn Sie sie bearbeiten. Dafür ist es nicht da. –

+0

@QuinnTaylor Die FAQ besagt, dass Sie als einzige Zugriff auf das Community Wiki-Kontrollkästchen haben. Meine Bearbeitung hat versehentlich dazu geführt, dass es in den Community-Wiki-Modus eingetreten ist, aber das war völlig unbeabsichtigt. Bitte beschuldigen Sie andere nicht, Dinge zu tun, die sie nicht tun können. [Referenz] (http://meta.stackexchange.com/questions/11740/what-are-community-wiki-posts/11741#11741) – FreeAsInBeer

2

Ich habe ein komplettes Bündel von Kategorien für NSData und NSString zusammengestellt, um AES256-Verschlüsselung für Strings bereitzustellen.

Weitere Informationen finden Sie unter my answer auf der 'ursprünglichen' Frage.