Kann mich jemand in die richtige Richtung weisen, um eine Zeichenfolge verschlüsseln zu können und eine andere Zeichenfolge mit den verschlüsselten Daten zurückzugeben? (Ich habe versucht, mit AES256-Verschlüsselung zu arbeiten.) Ich möchte eine Methode schreiben, die zwei NSString-Instanzen benötigt, von denen eine die zu verschlüsselnde Nachricht und die andere ein Passcode zum Verschlüsseln ist. Ich vermute, ich müsste sie generieren den Verschlüsselungsschlüssel mit dem Passcode auf eine Weise, die umgekehrt werden kann, wenn der Passcode mit den verschlüsselten Daten geliefert wird. Die Methode sollte dann einen NSString zurückgeben, der aus den verschlüsselten Daten erstellt wurde.
Ich habe die im ersten Kommentar zu diesem Beitrag beschriebene Technik ausprobiert , aber bisher hatte ich kein Glück. Apples CryptoExercise hat sicherlich etwas, aber ich kann es nicht verstehen ... Ich habe viele Verweise auf CCCrypt gesehen , aber es ist in jedem Fall fehlgeschlagen, in dem ich es verwendet habe.
Ich müsste auch in der Lage sein, eine verschlüsselte Zeichenfolge zu entschlüsseln, aber ich hoffe, das ist so einfach wie kCCEncrypt / kCCDecrypt.
Antworten:
Da Sie keinen Code veröffentlicht haben, ist es schwierig, genau zu wissen, auf welche Probleme Sie stoßen. Der Blog-Beitrag, auf den Sie verlinken, scheint jedoch recht anständig zu funktionieren ... abgesehen von dem zusätzlichen Komma in jedem Aufruf,
CCCrypt()
das Kompilierungsfehler verursacht hat.Ein späterer Kommentar zu diesem Beitrag enthält diesen angepassten Code , der für mich funktioniert und etwas einfacher zu sein scheint. Wenn Sie den Code für die Kategorie NSData einfügen, können Sie Folgendes schreiben: (Hinweis: Die
printf()
Aufrufe dienen nur dazu, den Status der Daten an verschiedenen Stellen zu demonstrieren. In einer realen Anwendung wäre es nicht sinnvoll, solche Werte zu drucken .)Angesichts dieses Codes und der Tatsache, dass verschlüsselte Daten nicht immer gut in einen NSString übersetzt werden können, ist es möglicherweise bequemer, zwei Methoden zu schreiben, die die von Ihnen benötigte Funktionalität vorwärts und rückwärts einschließen ...
Dies funktioniert definitiv bei Snow Leopard und @Boz berichtet, dass CommonCrypto Teil des Core-Betriebssystems auf dem iPhone ist. Sowohl 10.4 als auch 10.5 haben
/usr/include/CommonCrypto
, obwohl 10.5 eine Manpage fürCCCryptor.3cc
und 10.4 nicht hat, also YMMV.EDIT: Siehe Diese Folgefrage zur Verwendung von Base64 - Kodierung für verschlüsselte Daten , welche als eine Zeichenkette Bytes (falls gewünscht) unter Verwendung von sicherem, lossless Konvertierungen.
quelle
autorelease
.Ich habe eine Sammlung von Kategorien für NSData und NSString zusammengestellt, die Lösungen aus Jeff LaMarches Blog und einige Hinweise von Quinn Taylor hier auf Stack Overflow verwenden.
Es verwendet Kategorien, um NSData zu erweitern, um eine AES256-Verschlüsselung bereitzustellen, und bietet auch eine Erweiterung von NSString, um verschlüsselte Daten mit BASE64-Codierung sicher in Zeichenfolgen zu codieren.
Hier ist ein Beispiel, um die Verwendung zum Verschlüsseln von Zeichenfolgen zu zeigen:
Den vollständigen Quellcode erhalten Sie hier:
Vielen Dank für alle hilfreichen Tipps!
- Michael
quelle
@owlstead, bezüglich Ihrer Anfrage nach "einer kryptografisch sicheren Variante einer der angegebenen Antworten", siehe RNCryptor . Es wurde entwickelt, um genau das zu tun, was Sie anfordern (und wurde als Reaktion auf die Probleme mit dem hier aufgeführten Code erstellt).
RNCryptor verwendet PBKDF2 mit Salt, stellt eine zufällige IV bereit und hängt HMAC (ebenfalls aus PBKDF2 mit seinem eigenen Salt generiert) an. Es unterstützt den synchronen und asynchronen Betrieb.
quelle
Ich habe ein bisschen auf @QuinnTaylor gewartet, um seine Antwort zu aktualisieren, aber da er es nicht getan hat, ist hier die Antwort etwas klarer und so, dass sie auf XCode7 (und vielleicht auch höher) geladen wird. Ich habe dies in einer Cocoa-Anwendung verwendet, aber es wird wahrscheinlich auch mit einer iOS-Anwendung funktionieren. Hat keine ARC-Fehler.
Fügen Sie vor jedem @ Implementierungsabschnitt in Ihre AppDelegate.m- oder AppDelegate.mm-Datei ein.
Fügen Sie diese beiden Funktionen in die gewünschte @ Implementierungsklasse ein. In meinem Fall habe ich @implementation AppDelegate in meiner Datei AppDelegate.mm oder AppDelegate.m ausgewählt.
quelle
dataWithBytesNoCopy
zuzuordnen und dann einfach einenNSMutableData
with zuzuweisendataWithLength
und diemutableBytes
Eigenschaft für den Bytezeiger zu verwenden, und dann einfach die Größe zu ändern, indem Sie seinelength
Eigenschaft festlegen . 3. Die direkte Verwendung einer Zeichenfolge für eine Verschlüsselung ist sehr unsicher. Es sollte ein abgeleiteter Schlüssel verwendet werden, wie er von PBKDF2 erstellt wurde.keyData.length = kCCKeySizeAES256;
.https://github.com/muneebahmad/AESiOSObjC
quelle