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)