RSA mit OAEP und SHA1 liefert mit Crypto++ und phpseclib andere Ergebnisse



  • Hi,

    ich möchte gerade zum Test gerne einen einfachen String mit PHP und phpseclib verschlüsseln und mit C++ und Crypto++ entschlüsseln. Jedoch erhalte ich andere Ergebnisse und ich weiß nicht, wieso.

    Ich habe nun einfach den gleichen String sowohl online als auch offline verschlüsselt. Es gibt ja immer einen Zufallsfaktor, aber interessant ist, dass ich mit Crypto++ einen 192 Byte-String erhalte und online einen 960 (= 192 x 5)-Byte-String erhalte. Ich hatte schon überlegt, ob der automatisch base64 anwendet, jedoch befinden sich die Zeichen laut Hexeditor überall von 00 bis FF.

    Hat jemand für mich irgendwelche Stichworte, nach denen ich suchen könnte und versuchen in Einklang zu bringen? Oder weiß jemand, woran diese "Streckung" auf die 5-fache Größe liegen kann?

    Edit:
    Ebenfalls seltsam ist, dass phpseclib mit dem privaten Schlüssel verschlüsseln und mit dem public Schlüssel entschlüsseln möchte. Crypto++ hat als Standard jedoch das Verschlüsseln mit publicKey und das Entschlüsseln mit privateKey. Ich weiß nicht, ob man das jetzt einfach umdrehen kann (was ich natürlich bei phpseclib getan habe, d.h. ich gebe ihm einfach den publicKey und sage, er verschlüsseln, sonst wäre das andere Ergebnis ja klar 🙄), jedenfalls dumpt Crypto++, wenn ich ihm fürs Entschlüsseln den publicKey statt privateKey reiche... Aber eigentlich sollte ja beides gehen, das ist wohl einfach egal.

    Edit2:
    Hm, könnte es sein, dass die beiden Bibliotheken einfach eine andere Verschlüsselung wie AES mit unterschiedlichen Längen nutzen oder so? Das würde doch die Cipher-Längen-Unterschiede erklären?

    Ich bin für alle Tipps und Hinweise dankbar! 🙂



  • Wie groß ist der zu verschlüsselnde String?
    Gibt es in der Dokumentation der Funktionen von phpseclib nähere Angaben über das Ausgabeformat?



  • Hi,

    okay, das Problem war, dass die str_split-Funktion (PHP4) falsch funktioniert hat.

    phpseclib arbeitet so, dass er prüft, wie groß die maximale Länge ist und dann mit str_split in so viele Teile splittet, dass jeder einzeln verschlüsselt wird.

    Aber Crypto++ arbeitet nicht so. Ist der string zu lang, fliegt ne Exception. Weiß jemand, wie man dafür sorgen kann, dass er die Ver/Entschlüsselung je nach Länge eben mehrfach anwendet? Oder muss man das einfach selbst simulieren?



  • Eisflamme schrieb:

    Aber Crypto++ arbeitet nicht so. Ist der string zu lang, fliegt ne Exception. Weiß jemand, wie man dafür sorgen kann, dass er die Ver/Entschlüsselung je nach Länge eben mehrfach anwendet? Oder muss man das einfach selbst simulieren?

    Ich kenne Crypto++ nicht, aber "simulieren" würde ich da nichts. Es gibt viele verschiedene Möglichkeiten, wie man Verschlüsselung "mehrfach anwendet", um längere Strings zu verschlüsseln. Manche davon sind unsicher, andere sicherer. Einfach auf gut Glück den Algorithmus mehrmals anwenden wird höchstwahrscheinlich was sehr unsicheres.



  • Mir geht es nur darum überhaupt die gesamte Länge zu erfassen. Wenn ich eben 5 x 1KB-Blöcke habe (wenn 1KB eben die maximale Größe wäre), würde ich eben 5 x 1 KB verschlüsseln. Natürlich wäre es besser, wenn Block 2 - 5 noch basierend auf Block 1 verschlüsselt sind, ist das zwar besser, aber grundsätzlich muss man ja trotzdem RSA knacken, um die Blöcke zu kriegen.

    Ich weiß, dass man nicht so sonderlich lange Nachrichten mit RSA verschlüsseln möchte, dafür ist der Algorithmus ja auch einfach nicht gedacht. Von daher kann man das vermutlich einfach ignorieren. 🙂



  • Eisflamme schrieb:

    Natürlich wäre es besser, wenn Block 2 - 5 noch basierend auf Block 1 verschlüsselt sind, ist das zwar besser, aber grundsätzlich muss man ja trotzdem RSA knacken, um die Blöcke zu kriegen.

    Schau dir das Bild an, das ist recht aufschlußreich:

    http://de.wikipedia.org/wiki/Electronic_Code_Book_Mode

    RSA ist EXTREM langsam. Mehr als paar KB willst du damit sicher nicht verschlüsseln wollen.



  • Ja, das weiß ich, danke. 🙂



  • Längere Datenblöcke verschüsselt man nicht mit RSA bzw. EC.
    Man kann natürlich, da sich einige Block Cipher Modes auch mit RSA bzw. EC verwenden lassen. Macht aber eben keinen Sinn, weil eben zu langsam.

    Man generiert einen zufälligen Schlüssel für einen klassischen symmetrischen Block-Cipher (AES, ...), mit dem man die Daten verschlüsselt. Und den Schlüssel verschlüsselt man dann mit RSA bzw. EC.

    Ansonsten hängt die max. Länge von der Schlüssellänge und dem verwendeten Verfahren ab. Bei PKCS#1 Version 1.5 sind es z.B. 11 Byte weniger als die Schlüssellänge in Byte.
    Also bei einem 2048 Bit Key sind das 256-11 = 245 Byte.


Log in to reply