4 Stimmen

Fügen Sie Zufälligkeit zu einem einfachen RSA-Verschlüsselungsbeispiel hinzu

Ich habe gerade angefangen, mit Kryptographie & Public-Key-Verschlüsselung zu spielen. Ich habe ein kleines Python-Programm erstellt, das eine wörtliche Übersetzung des in http://gnosis.cx/publish/programming/cryptology2.pdf (siehe Abschnitt zum RSA-Beispiel) gegebenen Algorithmus ist. Der Code lautet wie folgt.

Verwendet man GPG, gibt es bei der Verschlüsselung des gleichen Textes mit demselben Schlüssel mehrmals unterschiedliche Chiffretexte. Ist es möglich, diese Art von Zufälligkeit dem unten stehenden Programm hinzuzufügen (ohne auf komplexe Mathematik zurückzugreifen :P)? So dass ich jedes Mal einen anderen Chiffretext erhalte und ihn dennoch entschlüsseln kann?

def enc(message, pubkey) :
    msg = [ord(char) for char in message]
    e,n = pubkey
    c = [m**e%n for m in msg]
    return c

def dec(cipher, prikey) :
    d,n = prikey
    msg = [c**d%n for c in cipher]
    msg = [chr(m) for m in msg]
    message = ''.join(msg)
    return message

p, q = 47, 71
n = p*q
e = 79
d = 1019

pubkey = (e, n)
prikey = (d, n)

msg = 'Hallo Welt!'
print msg
cipher = enc(msg, pubkey)
for c in cipher : print c,
decipher = dec(cipher, prikey)
print '\n', decipher

Es gibt folgende Ausgabe :

Hallo Welt!
285 1113 1795 1795 2237 1379 1848 2237 2560 1795 1287 1260 
Hallo Welt!

4voto

abarnert Punkte 332066

Wenn Sie mit GPG denselben Text mehrmals mit demselben Schlüssel verschlüsseln, erhalten Sie jedes Mal einen anderen Geheimtext.

Die meisten Public-Key-Kryptosysteme verschlüsseln Ihre Daten tatsächlich nicht mit Ihrem öffentlichen Schlüssel. Stattdessen tun sie etwas wie dieses:

  • Generieren Sie einen zufälligen "Sitzungsschlüssel".
  • Verschlüsseln Sie den Sitzungsschlüssel mit Ihrem öffentlichen Schlüssel (unter Verwendung eines asymmetrischen Verschlüsselungsverfahrens wie RSA oder ElGamal).
  • Verschlüsseln Sie den Klartext mit dem Sitzungsschlüssel (unter Verwendung eines symmetrischen Verschlüsselungsverfahrens wie IDEA oder CAST5).
  • Fügen Sie den verschlüsselten Sitzungsschlüssel und einige Metadaten zum Verschlüsselungsvorgang dem Geheimtext hinzu.

Der Grund dafür ist nicht so sehr, die Ergebnisse zufällig zu machen, sondern die Verschlüsselung und Entschlüsselung viel schneller zu machen – z.B. ist IDEA viel schneller als RSA, also ist es viel schneller, IDEA auf Ihre 100KB Daten und RSA auf Ihre 32 Byte Sitzungsschlüssel anzuwenden, als RSA auf die gesamten 100KB zu verwenden.

Ist es möglich, eine solche Art von Zufälligkeit zu dem Programm unten hinzuzufügen?

Nun, es ist offensichtlich nicht möglich, genau dieselbe Art von Zufälligkeit hinzuzufügen, ohne das Programm zu ändern, um denselben Algorithmus auszuführen. Aber das ist wahrscheinlich ohnehin das, was Sie tun wollen.

Zur Vereinfachung könnten Sie einfach Ihren PK-Algorithmus sowohl für die Verschlüsselung des Sitzungsschlüssels als auch für die Verschlüsselung des Klartexts mit dem Sitzungsschlüssel verwenden. Sie müssten natürlich die Dinge anpassen, um ein Sitzungsschlüsselpaar zu generieren, den privaten Sitzungsschlüssel zum Verschlüsseln des Klartexts zu verwenden und den öffentlichen Sitzungsschlüssel zur Nachricht anzuhängen (oder umgekehrt). Das könnte für Lernzwecke nützlich sein, auch wenn es nicht für ein Programm im echten Leben nützlich ist.

Dennoch ist es selbst für Lernzwecke wahrscheinlich besser, einen Spielzeug-Symmetriealgorithmus zu erstellen. Also, lassen Sie uns einen super trivialen erstellen, 8-Bit XOR-Verschlüsselung:

def symmetric_enc(message, key):
    return [ord(char) ^ key for char in message]

def symmetric_dec(cipher, key):
    return ''.join(num ^ key for num in cipher)

def asymmetric_enc(message, pubkey) :
    msg = [ord(char) for char in message]
    e,n = pubkey
    c = [m**e%n for m in msg]
    return c

def asymmetric_dec(cipher, prikey) :
    d,n = prikey
    msg = [c**d%n for c in cipher]
    msg = [chr(m) for m in msg]
    message = ''.join(msg)
    return message

def enc(message, pubkey):
    session_key = random.randrange(1, 256)
    return (asymmetric_enc(session_key, pubkey), 
            symmetric_enc(message, session_key))

def dec(message, prikey):
    session_key, body = message
    session_key = asymmetric_dec(session_key, prikey)
    return symmetric_dec(body, session_key)

2voto

Nickolay Olshevsky Punkte 12838

Was du brauchst, heißt 'padding'. Du solltest nach PKCS#1-Padding/OAEP-Padding googeln. In der Kryptographie werden Nachrichten in der realen Welt nicht direkt von RSA verschlüsselt - es werden einige andere (pseudorandom) Bytes hinzugefügt, um die Verschlüsselung zu verstärken und auch Zufälligkeit zur Ausgabe hinzuzufügen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X