Kann ich mit den Versammlungen PublicKey eine mit dem entsprechende Privatkaste verschlüsseltes String verwenden?

StackOverflow https://stackoverflow.com/questions/1847357

Frage

Die Unterzeichnung einer Versammlung in .NET umfasst ein öffentliches/privates Schlüsselpaar. Soweit ich anhand des, was ich gelesen habe, verwendet .NET verwendet den RSA -Algorithmus und den privaten Schlüssel, um die Versammlung zu unterschreiben, und überprüft ihn mit dem eingebetteten öffentlichen Schlüssel.

Ich weiß, wie man den öffentlichen Schlüssel abholt (Assembly.PublicKey). Ich habe mich gefragt, ob dieser Schlüssel verwendet werden könnte, um eine kurze Zeichenfolge zu entschlüsseln, die einige mit dem private Schlüssel verschlüsseltes Daten enthält.

Die Dokumente, die ich bisher gelesen habe (z.B) scheinen zu implizieren, dass nur umgekehrt möglich ist: dass ich den öffentlichen Schlüssel zum Verschlingen und den privaten Schlüssel zum Entschlüsseln verwenden müsste - aber ich möchte das nicht wirklich in die Versammlung einbeziehen, do I.

Ich denke, es wäre in Ordnung, wenn ich nur die Zeichenfolge unterschreiben würde. Aber wie?

Ich bin ein bisschen ratlos, wie ich damit beginnen kann. Hat jemand einen Code -Snippet?

Außerdem würde das Verschlingen / Signieren der kleinen Zeichenfolge idealerweise in PHP stattfinden, da ich dies auf einen Webserver abladen möchte und alles, was wir bisher haben, ist Ihre generische PHP / MySQL -Hosted -Website.

Anwendungsfall: Ich versuche, ein leichtes Lizenzierungsschema für eine Software zu entwickeln, die wir für Beta -Tester veröffentlichen möchten. Da die Software wahrscheinlich Freeware sein wird, möchten wir nur wirklich erreichen

  1. Wissen Sie, wer die Software installiert hat (E -Mail -Adresse)
  2. Lassen Sie die Software nach einem bestimmten Zeitraum abläuft, wonach der Benutzer eine neue Lizenz erhalten muss
    • Dies ist so einfach wie das Ausfüllen eines Formulars und das Warten auf eine automatisierte E -Mail mit dem Tast
    • Wir versuchen, die Wahrscheinlichkeit von alten Versionen zu verringern, um unseren Ruf zu beißen / uns zu verfolgen

In der Lage zu sein, ein Tupel (Ablaufdatum, Fingerabdruck) zu verschlüsseln und zu entschlüsseln, dass beim Start ein einfaches Lizenzmodul dargestellt wird: Wenn die Anwendung zum ersten Mal gestartet wird, wird der Benutzer nach E -Mail -Adresse, Namen, Organisation gefragt. Diese Informationen werden im Webserver zusammen mit einem MD5 -Fingerabdruck einiger Systeminformationen (NIC, Computername, Assembly Major und Minor Version) veröffentlicht. Die Webserver antwortet per E -Mail (Überprüfung der Gültigkeit der E -Mail -Adresse) mit einer verschlüsselten Version des Tuple (Ablaufdatum, Fingerabdruck), der dann auf der Festplatte gespeichert wird. Beim Start kann dies entschlüsselt und mit dem aktuellen Datum und dem regenerierten Fingerabdruck verglichen werden.

BEARBEITEN: OK, also habe ich noch nicht alle Antworten auf meine Frage. Aber es sieht so aus, als ob .NET es nicht einfach macht, den privaten Schlüssel für die Verschlüsselung zu verwenden (wenn dies überhaupt möglich ist, sind sich die Antworten darauf nicht wirklich einig).

Die Route, die ich nehmen werde, ist dies (basierend auf meinem Anwendungsfall):

  • Ich werde den privaten Schlüssel verwenden, um die Lizenz zu unterschreiben.
  • Ich werde den öffentlichen Schlüssel verwenden, um zu überprüfen, ob die Lizenz vom privaten Schlüssel unterzeichnet wurde
  • Ich werde eine weitere Frage stellen, die sich an PHP -Entwickler zur Verwendung der .NET -Tasten (erstellt von sn.exe) Um einen Text zu unterschreiben
  • Ich mache mir nicht wirklich Sorgen um den Benutzer, der die Lizenz sieht, da es sowieso ein Hash ist und aus Sachen berechnet wird, die er Allready kennt. Alles was ich möchte, ist es zu schwierig zu machen, dass der typische Gebäudearchitekt meine Software kopiert, ohne dass ich es weiß (denken Sie daran, die Software ist Freeware - alles, was ich möchte, ist eine Papierspur, wer sie installiert hat ... ))

Vielen Dank für Ihre Antworten.

War es hilfreich?

Lösung

Nicht in .net.

In vielen traditionellen Verschlüsselungsalgorithmus im öffentlichen Key wie RSA können Sie in beide Richtungen verschlüsseln und entschlüsseln. In der Regel wird ein Weg als "Verschlüsselung" und die andere "Signier" bezeichnet, obwohl Sie tatsächlich eine verschlüsselte Version von etwas in beide Richtungen haben.

In .NET wurde jedoch die RSA -Implementierung verkrüppelt, und bei der Unterzeichnung werden nur die Eingabeverdauungen erzeugt, nicht die vollständigen verarbeiteten Informationen.

Es scheint, dass es einige Meinungsverschiedenheiten darüber gibt, was mit RSA geschehen kann und was nicht. Lassen Sie mich meine Antwort bearbeiten, um genauer zu sein.

Ich spreche von RSA -Mathematik, nicht von einer bestimmten RSA -Implementierung.

Mit der RSA -Mathematik können Sie Informationen entweder der beiden Schlüssel (privat oder öffentlich) codieren, und die codierten Daten können nur mit den anderen Tasten dekodiert werden.

Normalerweise codieren Sie mit einem öffentlichen Schlüssel, verschlüsseln Sie die Informationen und dekodieren sie mit dem privaten Schlüssel, wodurch die Informationen entschlüsselt werden. Oder Sie nehmen einen Hash der Informationen an, kodieren sie mit dem privaten Schlüssel, unterschreiben Sie den Hash und dekodieren den Hash mit dem öffentlichen Schlüssel, um die Signatur zu vergleichen und zu überprüfen.

Typische Implementierungen ermöglichen es nicht, Daten von privat zu öffentlich zu codieren, nur indem sie die Daten hashend, sondern aber Die Mathematik hinter RSA erlaubt dies vollständig.

Andere Tipps

Sie können nicht mit dem öffentlichen Schlüssel entschlüsseln. Auf diese Weise würde der springende Punkt der "Öffentlichkeit" verloren gehen.

(Möglicherweise können Sie jedoch etwas mit dem privaten Schlüssel unterschreiben und dann die Signatur mithilfe des öffentlichen Schlüssels überprüfen. Dafür verwendet das Framework die Tasten - die Versammlung wird signiert und der öffentliche Schlüssel wird verwendet, um die Signatur zu überprüfen. ))

Dies kann mit SignedXML erfolgen http://msdn.microsoft.com/en-us/library/ms229745.aspx. Auf einer niedrigeren Ebene können Sie RSAPKCS1SignatureDeformatter und RSAPKCS1SignatureFormatter verwenden. Diese funktionieren durch Verschlüsseln eines Hashs der Daten und vergleichen dann die Daten mit dem (entschlüsselten) Hash am anderen Ende. Ich glaube, das Hashing wird verwendet, weil die private Schlüsselverschlüsselung nur kleine Daten verarbeiten kann. Ich bin mir nicht sicher, ob sie den öffentlichen Schlüssel der Versammlung wiederverwendet, wenn sie Probleme verursachen, nur ein separates Schlüsselpaar verwenden.

WARNUNGSWARNUNG, schauen Sie sich dies an, da diese Klassen zu 20 Sekunden Aufhängen führen können! http://www.pcreview.co.uk/forums/thread-3428177.php

Dieser Ansatz ist anfällig für den Signaturverifizierungscode, der die Verwendung von Reflexil manipuliert wird, aber das ist eine andere Angelegenheit.

Ich habe Folgendes geschrieben, aber ich glaube, Sie haben dies bereits bekommen: Sie versuchen nicht wirklich, Daten vor dem Benutzer zu verschlüsseln oder zu verbergen, Sie möchten sie daran hindern, die Lizenz zu erstellen oder zu manipulieren. Sie haben Recht, dass ein öffentlich -privater Schlüssel -Verschlüsselungsalgorithmus dafür verwendet werden kann. Dies ist bekannt als als Unterzeichnung Verwenden eines privaten Schlüssels (Server -Seiten -Lizenzgenerierung). Und Überprüfung der Signatur mithilfe eines öffentlichen Schlüssels (Lizenzprüfung in der App). Ich erwähne diese Terminologie, wie sie bei der Forschung helfen wird.

In RSA werden öffentliche Schlüssel zur Verschlüsselung verwendet, werden private Schlüssel zur Entschlüsselung verwendet. Sie können keinen öffentlichen Schlüssel verwenden, um etwas zu entschlüsseln ...

In RSA ist der einzige tatsächliche Unterschied zwischen einem öffentlichen Schlüssel und einem privaten Schlüssel, welches Sie geheim halten.

Sie können also einen öffentlichen Schlüssel als Verschlüsselungsschlüssel verwenden und mit dem privaten Schlüssel entschlüsseln oder den privaten Schlüssel als Verschlüsselungsschlüssel verwenden und mit dem öffentlichen Schlüssel entschlüsseln.

Verschlüsseln mit dem privaten Schlüssel wird für digitale Signaturen verwendet (jeder kann mit dem öffentlichen Schlüssel dekodieren).

Aber wie @lasse V. Karlsen betonte, könnte .NET es schwieriger machen, als es sein sollte ...

Ich denke, beide Richtungen sind mit öffentlichem Verschlüsselung möglich und entschlüsseln mit privatem und mit privatem Schlüssel verschlüsselt. Die zweite ist die Art und Weise, wie die digitale Signatur funktioniert.

Warnung! Diese Antwort ist falsch, aber ich werde sie hier nicht so lassen, weil die Serie der beigefügten Kommentare lautet. Ich denke an ausreichend Interesse an andere, um die Antwort zu behalten. Ok, es lässt mich wie ein Idiot aussehen, aber das ist für mich nichts Neues;) Stimmen Sie so ab, wie Sie möchten.

Ein öffentlicher Schlüssel kann verwendet werden, um:-

  • Verschlüsseln Sie etwas, das nur mit dem privaten Schlüssel entschlüsselt werden kann
  • Authentifizieren etwas mit dem privaten Schlüssel

Es kann nicht verwendet werden, um etwas zu entschlüsseln, um durch einen privaten Schlüssel zu verschlüsseln. Aus diesem Grund wird das öffentliche/private Schlüsselsystem als asymetrisches System bezeichnet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top