Probleme beim Entschlüsseln von C # auf dem iPhone mit RSA

8

Ich habe bis jetzt zwei Tage damit verbracht und jede mir zur Verfügung stehende Quelle durchgekämmt, also ist dies der letzte Ausweg.

Ich habe ein X509-Zertifikat, dessen öffentlicher Schlüssel ich im Schlüsselbund des iPhones gespeichert habe (Simulator nur an dieser Stelle). Auf der ASP.NET-Seite habe ich das Zertifikat im Zertifikatsspeicher mit einem privaten Schlüssel. Wenn ich eine Zeichenfolge auf dem iPhone verschlüssle und sie auf dem Server entschlüssle, bekomme ich eine CryptographicException "Bad data". Ich habe versucht, das Array.Reverse vorgeschlagen auf der RSACryptoServiceProvider Seite auf eine Longshot, aber es hat nicht geholfen.

Ich habe die Basis-64-Saiten auf beiden Seiten verglichen und sie sind gleich. Ich habe die rohen Byte-Arrays nach der Decodierung verglichen und sie sind auch gleich. Wenn ich auf dem Server mit dem öffentlichen Schlüssel verschlüsseln, unterscheidet sich das Byte-Array von der iPhone-Version und entschlüsselt leicht mit dem privaten Schlüssel. Die rohe Klartext-Zeichenfolge besteht aus 115 Zeichen und liegt damit innerhalb der 256-Byte-Begrenzung meines 2048-Bit-Schlüssels.

Hier ist die iPhone-Verschlüsselungsmethode (ziemlich wörtlich aus der CryptoExercise Beispiel App ) s wrapSymmetricKey Methode):

%Vor%

Und hier ist die serverseitige C # Entschlüsselungsmethode:

%Vor%

Mein Verdacht war, dass es zwischen den Plattformen einige Verschlüsselungsprobleme gab. Ich weiß, dass der eine Big-Endian ist und der andere Little-Endian ist, aber ich weiß nicht genug, um zu sagen, was oder wie man den Unterschied überwinden kann. Mac OS X, Windows und das iPhone sind alle Little-Endian, das ist also nicht das Problem.

Neue Theorie: Wenn Sie den booleschen Booleschen Wert für OAEP auf false setzen, wird standardmäßig PKCS # 1 1.5-Padding verwendet. SecKey hat nur SecPadding -Definitionen von PKCS1 , PKCS1MD2 , PKCS1MD5 und PKCS1SHA1 . Vielleicht Microsofts PKCS # 1 1.5! = Apple's PKCS1 und so beeinflusst das Auffüllen die binäre Ausgabe der Verschlüsselung. Ich habe versucht, kSecPaddingPKCS1 mit dem fOAEP auf false zu setzen und es hat immer noch nicht funktioniert. Offenbar ist kSecPaddingPKCS1 Äquivalent zu PKCS # 1 1.5. Zurück zum Zeichenbrett über Theorien ...

Andere neu erprobte Theorien:

  1. Das Zertifikat auf dem iPhone (.cer-Datei) ist nicht genau dasselbe wie das PKCS # 12-Bundle auf dem Server (.pfx-Datei) und könnte daher niemals funktionieren. Installierte .cer-Datei in verschiedenen Zertifikatsspeichern und serververschlüsselten Strings gerundet
  2. Die Konvertierung in base-64 und die POST-Operation zum Server führten zu Ungereimtheiten, die im selben Klassen-Roundtrip nicht vorhanden waren. Also probierte ich zuerst URLEncoding / Decoding und postete rohe Binärdateien vom iPhone, verifizierte, dass es gleich war und bekam dieselben schlechten Daten;
  3. Meine ursprüngliche Zeichenkette war 125 Bytes, also dachte ich, dass sie in UTF-8 (long shot) abgeschnitten werden könnte, also habe ich sie ohne Ergebnis auf eine 44-Byte-Zeichenkette reduziert;
  4. Ich habe über die System.Cryptography-Bibliothek zurückgeschaut, um sicherzustellen, dass ich eine geeignete Klasse verwendet und "RSAPKCS1KeyExchangeDeformatter" entdeckt habe, bin bei neuen Interessenten begeistert gewesen und habe mich enttäuscht, als sie sich genau so verhielt.

Erfolg!

Es stellte sich heraus, dass ich in meinem Schlüsselbund auf dem iPhone Simulator etwas Crust hatte, der sozusagen die Gewässer verdreckte. Ich habe die Schlüsselbund-Datenbank bei ~/Library/Application Support/iPhone Simulator/User/Library/Keychains/keychain-2-debug.db gelöscht, damit sie neu erstellt wird und es funktioniert. Danke für all deine Hilfe. Zahlen, es wäre etwas Einfaches, aber nicht offensichtlich. (Zwei Dinge, die ich gelernt habe: 1) die App aus dem Simulator zu deinstallieren, löscht nicht ihre Schlüsselbund-Einträge und 2) startet absolut regelmäßig in regelmäßigen Abständen.)

HINWEIS: Der generische Pfad für die Schlüsselbunddatei hängt von der iOS-Version ab: ~ / Bibliothek / Anwendungsunterstützung / iPhone Simulator / [version] /Library/Keychains/keychain-2-debug.db z.B., ~ / Bibliothek / Anwendungsunterstützung / iPhone Simulator / 4.3 / Bibliothek / Schlüsselanhänger / keychain-2-debug.db

    
bbrown 17.05.2011, 20:29
quelle

5 Antworten

3

Nun ... der erste Schritt (wie Sie sagen, dass Sie getan haben) ist, die gleichen Nachrichten mit den gleichen Initialisierungsvektoren zu verschlüsseln, die sowohl die iPhone- als auch die C # -Implementierung verwenden. Sie sollten die gleiche Ausgabe erhalten. Du hast gesagt, dass du es nicht getan hast, also gibt es ein Problem.

Dies bedeutet entweder:

  • Die iPhone-Implementierung von RSA ist falsch.
  • Die .NET-Implementierung von RSA ist falsch.
  • Die Schlüsseldateien sind anders (oder werden anders interpretiert).

Ich würde vorschlagen, dass die ersten beiden unwahrscheinlich sind, aber sie sind entfernt möglich.

Sie sagen: "Installierte .cer-Datei in verschiedenen Cert-Speicher und Server-verschlüsselte Zeichenfolge abgerundet einfach gut" ... das beweist nichts: all dies beweist, dass eine bestimmte zufällige Reihe von Zahlen Sie verschlüsseln können / auf einer Plattform erfolgreich entschlüsseln. Sie garantieren nicht, dass beide Plattformen die gleichen Zufallszahlen sehen.

Also schlage ich vor, dass Sie es hier auf die niedrigste mögliche Stufe bringen. Überprüfen Sie die direkten (Byte-Array-) Ein- und Ausgänge der Verschlüsselung auf beiden Plattformen. Wenn Sie mit genau den gleichen (binären) Eingängen nicht die gleiche Ausgabe erhalten, haben Sie ein Plattformproblem. Ich denke, das ist unwahrscheinlich, also ich vermute, Sie werden feststellen, dass die IVs unterschiedlich interpretiert werden.

    
Jon Grant 17.07.2009, 20:55
quelle
1

dies ist meine erste Antwort auf stackoverflow, also bitte vergib mir, wenn ich es falsch mache!

Ich kann Ihnen keine vollständige Antwort geben, aber ich hatte sehr ähnliche Probleme, als ich versuchte, in PHP zu integrieren - es scheint, dass das Format der Zertifikatsdateien von Apple ein wenig anders ist als das, was andere Software erwartet (einschließlich openssl) .

So entschlüssele ich eine verschlüsselte Signatur in PHP: Ich extrahiere tatsächlich den Modulus und PK aus dem übertragenen öffentlichen Schlüssel und verwende diesen für den RSA-Code, anstatt zu versuchen, den Schlüssel zu importieren:

%Vor%

Das Ziel-c, das diesen öffentlichen Schlüssel erzeugt, ist:

%Vor%

Verwenden von SecKeyWrapper aus Apples Beispielprojekt CryptoExercise (Sie können die Datei hier anzeigen: Ссылка )

Ich hoffe, das hilft?

    
Benjie 20.07.2009 10:15
quelle
0

Wird Ihnen das helfen?

Asymmetrische Schlüsselverschlüsselung mit .NET & amp; C #

  • Sorry für den kurzen Beitrag, Zeitbeschränkungen und alles. Wie auch immer, sah Ihre Twitter-Anfrage um Hilfe. Dies zeigt, wie ich dies mit PHP gemacht und entschlüsselt auf .NET, simliar. Ich habe bemerkt, dass Ihre Entschlüsselungsklasse etwas anders ist als meine, daher könnte dieser Artikel helfen.
Matthew M. 17.07.2009 17:13
quelle
-2

Ich glaube, Sie haben die Frage selbst beantwortet. Das Problem liegt sicherlich in der Endianz.

Dies ist ein möglicher Weg, Zweiwege-Konvertierungsmethoden zu schreiben:

%Vor%

Dies könnte eine gute Ressource für Sie sein (außer Wikipedia): Ссылка

    
nicktmro 15.07.2009 22:26
quelle
-3

Da Sie beide Seiten kontrollieren, wäre meine Empfehlung (wenn Sie die Bibliotheksverschlüsselungsalgorithmen nicht auf beiden Plattformen zusammenarbeiten können), die Verschlüsselung auf beiden Seiten mit demselben Algorithmus zu schreiben.

Auf diese Weise haben Sie die Kontrolle und wären in der Lage, die internen Verschlüsselungsfunktionen zu debuggen, um zu sehen, was schief läuft.

Es ist ein letzter Ausweg (natürlich), hätte aber wahrscheinlich weniger Zeit gekostet als die drei Tage, die Sie bereits verbracht haben, und haben eine hohe Erfolgschance.

HTH

    
Joon 16.07.2009 05:52
quelle

Tags und Links