2017-05-08 25 views
0

Ich suche nach einer zuverlässigen Methode zur Überprüfung, ob die Zeichenfolge, die nach der Entschlüsselung der verschlüsselten Payload zurückgegeben wird, ein Garbage-Wert ist (wie: = z { Z : k/ ˃ d A * Ԥ = ? M 5). Ich versuche, die verschlüsselte Zeichenfolge mit einem anderen öffentlichen Schlüssel zu entschlüsseln, so dass ich, wie erwartet, eine Fehlermeldung wie oben angezeigt bekomme. Meine Frage ist, was ist der beste Weg, in C# zu validieren, ob die zurückgegebene Zeichenfolge eine gültige Zeichenfolge oder ein Müllwert ist.So validieren Sie den von Bouncy Castle zurückgegebenen Müllwert RSA-Entschlüsselung mit falschem Schlüssel

Antwort

0

Die Lösung Sie vorschlagen wird überprüfen, ob die zurückgegebene Zeichenfolge ASCII ist (technisch eine Teilmenge von ASCII) ... Betrachtet man Ihren Namen und Ihren Nachnamen, Sie sollten aus erster Hand wissen, dass die Welt nicht aus ASCII-Strings besteht. Unicode wurde aus einem Grund "erfunden". Jetzt, wie geschrieben here, ist RSA "formbar". Eine sehr einfache Lösung besteht darin, den Hash des Originaltexts (z. B. mit SHA256) an den Text anzuhängen/anzuhängen, bevor alles verschlüsselt wird, und dann zu überprüfen, ob der Hash nach der Entschlüsselung korrekt ist.

+0

Ich stimme zu, dass es ein sauberer Weg wäre, aber da in meinem Szenario, wird es eine clientseitige Änderung erfordern (weil sie die Zeichenfolge verschlüsseln und ich entziffere es in serverseitigem Code), werde ich mit meinem gehen müssen Lösung. Außerdem denke ich, es wäre in Ordnung, wenn ich nur diese "Teilmenge" von ASCII betrachte, da ich erwarte, dass meine Zeichenfolge nur diese Zeichen enthält. – tavier

+0

BTW, nur neugierig, was ist falsch mit meinem Namen und Nachnamen. In Englisch, fällt es in diese Teilmenge von ASCII-Zeichen richtig? :) – tavier

+0

@AshishAgrawal Wahrscheinlich die Hälfte der amerikanischen Programmierer denken, dass das ganze Alphabet in den AZ-Zeichensatz enthalten ist ... Sie können sich nicht einmal vorstellen, dass andere Sprachen Nicht-ASCII-Zeichen wie àèììù brauchen könnten (ohne auch nur an Chinesisch, Japanisch zu denken , die verschiedenen indischen Sprachen ...) ... Das kannst du in jeder Regex-Frage sehen ("Wie kann ich überprüfen, ob es ein Wort ist? Benutzt etwas wie' [A-Za-z] * '. Du solltest (oder deine Eltern sollten es sein) aus einem Teil der Welt, wo 'AZ' nicht dein ursprünglicher Zeichensatz ist. – xanatos

0

Wenn Sie nur mit RSA zu tun haben, verwenden Sie ein geeignetes Padding-Schema wie Optimal Asymmetric Encryption Padding (OAEP), wie in PKCS # 1 v2.0 definiert. Es verwendet intern Hashing, um zu prüfen, ob Fehler vorliegen. C# hat dafür native Unterstützung und Sie erhalten einen Fehler, wenn etwas Falsches passiert wie ein gebrochener Chiffretext oder der falsche Schlüssel.

Wenn Sie mit hybrid encryption (RSA + gewissen Blockchiffre) betroffen sind, schlage ich vor, dass Sie RSA-OAEP verwenden zusammen mit einem authentifizierten Betriebsart wie AES-GCM (erhältlich in C# durch BouncyCastle). Auf diese Weise können Sie alle (bösartigen) Manipulationen feststellen.

Verwandte Themen