Ich habe Modul und privaten Exponenten.Wie erstelle ich einen privaten RSA-Schlüssel und signiere eine Nachricht?

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

Frage

Ich bin Neuling in Kryptographie und Pykrypto.

Ich habe Modul n und privater Exponent d.Nach dem, was ich nach dem Lesen einiger Dokumente verstehe privater Schlüssel besteht aus n und d.

Ich muss eine Nachricht signieren und kann nicht herausfinden, wie das geht pycrypto. RSA.construct() methode akzeptiert ein Tupel.Aber ich muss zusätzlich einen öffentlichen Exponenten bereitstellen e zu dieser Methode (die ich nicht habe).

Also hier ist meine Frage.Muss ich berechnen e irgendwie, um eine Nachricht zu unterschreiben?

Es scheint, dass ich in der Lage sein sollte, eine Nachricht einfach mit zu signieren n und d (das ist ein privater Schlüssel).Habe ich Recht?Kann ich das mit machen pycrypto?

Danke im Voraus.

War es hilfreich?

Lösung

Tatsächlich reicht es zum Entschlüsseln einer mit dem öffentlichen Schlüssel verschlüsselten Nachricht aus, den privaten Exponenten zu haben.

Das bedeutet auch, dass Sie eine Nachricht signieren können, da das Signieren im Grunde nur das * Entschlüsseln * des Klartexts mit dem privaten Schlüssel ist, der beim * Entschlüsseln * mit dem öffentlichen Schlüssel den Klartext erneut ergibt.Normalerweise verwenden Sie vorher einen Hash-Digest für den Klartext und signieren diesen...

Der Grund, warum Sie eine Nachricht nicht nur mit entschlüsseln können n und d mit pyrcypto ist, dass es eine tut blendender Schritt während der Nachrichtenentschlüsselung, die bezieht den öffentlichen Exponenten mit ein, wird aber für die Entschlüsselung nicht wirklich benötigt.

Durch einige Aufrufe der privaten API kann dieser Schritt jedoch umgangen werden.

Deshalb sollte das funktionieren:

from Crypto.PublicKey import RSA
from Crypto.Util.number import bytes_to_long, long_to_bytes

full = RSA.generate(2048)

# construct key using only n and d
try:
    # pycrypto >=2.5, only tested with _slowmath
    impl = RSA.RSAImplementation(use_fast_math=False)
    partial = impl.construct((full.n, 0L))
    partial.key.d = full.d
except TypeError:
    # pycrypto <=2.4.1
    partial = RSA.construct((full.n, 0L, full.d))   



pub = full.publickey()

# create message with padding
# http://en.wikipedia.org/wiki/RSA_%28algorithm%29#Padding_schemes
cleartext = ...

signature = partial.sign(cleartext, None)

print "validating message: ", pub.verify(cleartext, signature)


message = pub.encrypt(cleartext, None)

# bypassing the blinding step on decrypt
enc_msg=map(bytes_to_long, message)
dec_msg = map(partial.key._decrypt, enc_msg)

print "decrypting: "
for m in dec_msg:
    print long_to_bytes(m)

Andere Tipps

Nein, Sie können nicht berechnen e von d.

RSA ist symmetrisch in d und e:sie können die Rollen des öffentlichen und des privaten Schlüssels gleichermaßen gut austauschen.Natürlich wählen wir einen speziell aus, um privat zu sein und den anderen zu enthüllen - aber theoretisch sie machen das Gleiche.Da Sie den privaten Schlüssel natürlich nicht aus dem öffentlichen ableiten können, können Sie den öffentlichen Schlüssel auch nicht aus dem Privaten ableiten.

Wenn Sie den privaten Schlüssel haben, bedeutet das natürlich, dass Sie generiert das Schlüsselpaar, was bedeutet, dass Sie den öffentlichen Schlüssel irgendwo haben.

Wenn Sie den öffentlichen Exponenten nicht haben, können Sie ihn möglicherweise erraten.Meistens ist es keine zufällige Primzahl, sondern ein statischer Wert.Probieren Sie die Werte 65537 (hex) aus 0x010001, die vierte Zahl von Fermat), 3, 5, 7, 13 und 17 (in dieser Reihenfolge).

[BEARBEITEN] Signieren Sie einfach mit dem privaten Schlüssel und überprüfen Sie mit dem öffentlichen Schlüssel, ob der öffentliche Schlüssel korrekt ist.

Beachten:wenn es die zufällige Primzahl ist, ist sie genauso schwer zu finden wie der private Exponent;das bedeutet, dass Sie versuchen würden, RSA zu knacken - wahrscheinlich nicht für Schlüsselgrößen> 512 Bit.

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