Kryptographie in einfacher Sprache: Wir analysieren die symmetrische und asymmetrische Verschlüsselung am Beispiel des Star Wars-Diagramms (aktualisiert).

Hallo an alle Leser von Habr! Vor nicht allzu langer Zeit habe ich mich mit Verschlüsselungsalgorithmen und den Prinzipien der elektronischen Signatur befasst. Das Thema ist meiner Meinung nach interessant und relevant. Während des Studiums habe ich mehrere Bibliotheken ausprobiert, aber die PyCrypto- Bibliothek ist aus meiner Sicht die bequemste. Sie hat eine ausgezeichnete Dokumentation, begleitet von Beispielen.

Bild

Nach dem Lesen des Materials lernen Sie die folgenden Punkte:

  1. Was ist Verschlüsselung?
  2. Was ist der Unterschied zwischen symmetrischer und asymmetrischer Verschlüsselung?
  3. In diesem Fall ist es effizienter, symmetrische und asymmetrische Verschlüsselung zu verwenden.
  4. Was ist ein Daten-Hash und warum wird er bei der Verschlüsselung verwendet?

Die Relevanz des Themas wächst stetig. Die Verwendung von Kryptographie war lange Zeit nicht auf die Verschlüsselung von Informationen beschränkt. In der einen oder anderen Form verwenden wir jeden Tag Verschlüsselungsalgorithmen, wenn wir Websites über das HTTPS-Protokoll besuchen, Einkäufe mit einer Kreditkarte tätigen und in Instant Messenger kommunizieren. In den letzten Jahren haben Blockchain-Technologien, die ebenfalls auf Kryptographie basieren, große Aufmerksamkeit auf sich gezogen.

Der Zweck dieses Artikels ist es, den Leser in grundlegende Verschlüsselungsalgorithmen einzuführen. Beim Schreiben eines Artikels habe ich versucht, dem Thema praktische Anwendung so viel Aufmerksamkeit wie möglich zu widmen. Für die Programmierung wurde Python 3.6 verwendet. Beim Schreiben von Code habe ich versucht, ihn in separate Teile zu unterteilen und alle wichtigen Punkte zu kommentieren.

In diesem Artikel habe ich die digitale Signatur nicht analysiert, aber nachdem ich die asymmetrische Verschlüsselung verstanden habe, wird die Bedeutung dieser Technologie klar.

Handlung


Lassen Sie uns vor den Ereignissen von Episode 6 mental in das Star Wars-Universum reisen, wenn die Widerstandskräfte den Beginn des Baus eines neuen Todessterns bemerken. Das Kommando plant die Einführung einer Geheimdienstgruppe unter dem Deckmantel von Bauherren. Die Operation ist sehr gefährlich, die Kommunikation mit der Zentrale wird schwierig. Im Notfall kann jedes Mitglied der Gruppe ungeschützt Nachrichten vom Hauptquartier senden und empfangen.

Der Zweck der Aufklärungsgruppe sind alle Daten, die Aufschluss über die Konfiguration, die Waffen und den Zweck der zukünftigen Station geben können. Zur Speicherung von Daten ist die Entwicklung spezieller Geräte und Software geplant.

Das Hauptquartier genehmigte zwei Optionen für diese Operation:

Plan A - Rückkehr von Agenten mit gegebenen Rebellenkräften;
Plan B - Fernübertragung von Plänen vom Todesstern selbst unter Verwendung von Stationsausrüstung. Die Übertragung von Informationen erfolgt schnell, aber nach der Übertragung wird der Agent höchstwahrscheinlich berechnet und abgefangen.

Schema
Bild

Sie sind Programmierer in einem Team, das für die Softwareentwicklung verantwortlich ist.

Bei der Planung einer Operation werden mehrere mögliche negative Szenarien berücksichtigt:

  • Der Feind wird das Signal abfangen, seinen Inhalt über die Planung des Angriffs verstehen und das Objekt näher an die dem Imperium loyalen Kräfte führen. In diesem Fall sind die Verluste unter dem Widerstand höher;
  • Einer der Spione wird gefasst und enthüllt während des Verhörs den Operationsplan, der zum Kompromiss bei den Verschlüsselungsschlüsseln führen kann (wir werden weiter unten darauf eingehen).
  • Ein Spion mit heruntergeladenen Daten kann von imperialen Kräften abgefangen werden, die Änderungen am Inhalt vornehmen und den Widerstand über die Schwächen der Station falsch informieren. In diesem Fall wird die Rebellenflotte während des Angriffs in eine falsche Richtung geschickt und nach und nach zerstört.

Aus diesen Szenarien werden die Aufgaben formuliert:

  1. Der Inhalt muss sicher verschlüsselt und vor Änderungen geschützt sein.
  2. Im Falle des Verlusts von Verschlüsselungsschlüsseln oder ihrer Gefährdung sollte es möglich sein, neue Verschlüsselungsschlüssel mit einer Frequenz aus der Ferne zu erhalten, auf die der Gegner zugreifen kann.

Informationsverschlüsselung


Lösen wir das Problem der Informationsverschlüsselung:

Ein Verschlüsselungsschlüssel wird zum Ver- und Entschlüsseln von Informationen verwendet. Es ist der Schlüssel, der die Verschlüsselung umkehrbar macht. Jeder Agent erhält einen Verschlüsselungsschlüssel. Nach dem Herunterladen der Daten verschlüsselt der Agent sie und sendet sie an das Hauptquartier des Widerstands.

Beschreibung des Verschlüsselungsprinzips
Die Methode, mit der die Nachricht mit einem einzigen Schlüssel verschlüsselt und entschlüsselt wird, wird als symmetrische Verschlüsselung bezeichnet .

Bild

Der Schwachpunkt der symmetrischen Verschlüsselung ist der Verschlüsselungsschlüssel bzw. dessen Übermittlung an den Adressaten. Wenn der Schlüssel während der Zustellung kompromittiert wird, kann ein Dritter die Nachricht leicht entschlüsseln. Die Stärke der symmetrischen Verschlüsselung liegt in ihrer Geschwindigkeit, die es ermöglicht, große Datenmengen zu codieren.

Bei der asymmetrischen Verschlüsselung werden zwei miteinander verbundene Schlüssel verwendet: öffentlich und privat.

Bild

Der Wirkungsmechanismus ist wie folgt:

  1. Der Adressat sendet den OPEN-Schlüssel an den Absender.
  2. Der Absender codiert die Nachricht mit dem empfangenen öffentlichen Schlüssel. Gleichzeitig kann die Nachricht nur noch mit dem privaten Schlüssel dekodiert werden.
  3. Nach Erhalt der verschlüsselten Nachricht dekodiert der Empfänger sie mit dem CLOSED-Schlüssel (der zusammen mit der Öffentlichkeit generiert wurde).


Beginnen wir mit der Programmierung! Um die erforderliche Software zu entwickeln, verwenden wir die Python-Bibliothek namens pycrypto . Sie verfügt über eine hervorragende Dokumentation und präsentiert alle gängigen Verschlüsselungsalgorithmen.

Zunächst entwickeln wir eine Funktion für die symmetrische Verschlüsselung mit dem Namen Advanced Encryption Standard (AES) . Es ist einer der häufigsten symmetrischen Verschlüsselungsalgorithmen.

from Crypto.Cipher import AES #   from Crypto.Hash import SHA256 #        SHA. from Crypto.Hash import MD5 #            32  from Crypto import Random def transform_password(password_str): """Transform the password string into 32 bit MD5 hash :param password_str: <str> password in plain text; :return: <str> Transformed password fixed length """ h = MD5.new() h.update(key.encode()) return h.hexdigest() def symmetric_encrypt(message, key, verbose = True): """Encripts the message using symmetric AES algorythm. :param message: <str> Message for encryption; :param key: <object> symmetric key; :return: <object> Message encrypted with key """ key_MD5 = transform_password(key) #      32  message_hash = SHA256.new(message.encode()) message_with_hash = message.encode() + message_hash.hexdigest().encode() #     .      iv = Random.new().read(AES.block_size) cipher = AES.new(key_MD5, AES.MODE_CFB, iv) #     . AES.MODE_CFB -   ,      iv. https://www.dlitz.net/software/pycrypto/api/current/Crypto.Cipher.blockalgo-module.html#MODE_CFB encrypted_message = iv + cipher.encrypt(message_with_hash) #       .  ,       ,       . if verbose: print(f'Message was encrypted into: {encrypted_message.hex()}') return encrypted_message def symmetric_decrypt(encr_message, key): """Decripts the message using private_key and check it's hash :param encrypted_message: <object> Encrypted message :param key: <object> symmetric key; :return: <object> Message decripted with key """ key_MD5 = transform_password(key) #   ,      bsize = AES.block_size dsize = SHA256.digest_size*2 iv = Random.new().read(bsize) cipher = AES.new(key_MD5, AES.MODE_CFB, iv) decrypted_message_with_hesh = cipher.decrypt(encr_message)[bsize:] #     ,      decrypted_message = decrypted_message_with_hesh[:-dsize] #   ,      digest = SHA256.new(decrypted_message).hexdigest() #    .     ,     . if digest==decrypted_message_with_hesh[-dsize:].decode(): #      ,      ,   print(f"Success!\nEncrypted hash is {decrypted_message_with_hesh[-dsize:].decode()}\nDecrypted hash is {digest}") return decrypted_message.decode() else: print(f"Encryption was not correct: the hash of decripted message doesn't match with encrypted hash\nEncrypted hash is {decrypted_message_with_hesh[-dsize:]}\nDecrypted hash is {digest}") 

Lassen Sie uns die Leistung des Codes anhand eines Beispiels überprüfen
 message = """  120   120  / 120   10     30-5 (2)    4.0 """ key = 'Traveling through hyperspace ain't like dusting crops, farm boy.' encr_message = symmetric_encrypt(message, key, verbose = True) print('\n') print('DECRIPTION') decr_message = symmetric_decrypt(encr_message, key) print(decr_message) 

 Message was encrypted into: ed10e4c65358bb9e351c801c3b3200b21fa86a24021c317bb5c9d8b3f76bdf9f3a7d26781a22402f0e4f41ca831b6d2da9e1e6878c34c79ddc7959af3ae9fc2ba0cfff1c0180a7e0f637f1aa5b24507d552d5dfe7625e7b81d817b5882b2b19bb95f3988a03c78f850098dfc8e6089863deaa39b887eaea4c1d4ba006edaec90205d54b27ed4ac70ed75cdd01732e1176bf04218beb8ae742ff708a201a9d1cb57dd5f2e70dc3239208d23705f7a3aae3e315c4df6d73c871b66c4995cce5f19738f731cd58755d21ed92612c44197f875cddf3f7aa1d60e435ce1492679b9d60c4b8538f52408f321711ac1d2daa6dbbc33dc655abca10e2f5fd3ff27823995b9dcdb62c0bafc1963ab539ccb466f1c140479df34b0005f578f72fcdd76b17391332037b801f74f733a08 DECRIPTION Success! Encrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026 Decrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026  120   120  / 120   10     30-5 (2)    4.0 Die Message was encrypted into: ed10e4c65358bb9e351c801c3b3200b21fa86a24021c317bb5c9d8b3f76bdf9f3a7d26781a22402f0e4f41ca831b6d2da9e1e6878c34c79ddc7959af3ae9fc2ba0cfff1c0180a7e0f637f1aa5b24507d552d5dfe7625e7b81d817b5882b2b19bb95f3988a03c78f850098dfc8e6089863deaa39b887eaea4c1d4ba006edaec90205d54b27ed4ac70ed75cdd01732e1176bf04218beb8ae742ff708a201a9d1cb57dd5f2e70dc3239208d23705f7a3aae3e315c4df6d73c871b66c4995cce5f19738f731cd58755d21ed92612c44197f875cddf3f7aa1d60e435ce1492679b9d60c4b8538f52408f321711ac1d2daa6dbbc33dc655abca10e2f5fd3ff27823995b9dcdb62c0bafc1963ab539ccb466f1c140479df34b0005f578f72fcdd76b17391332037b801f74f733a08 DECRIPTION Success! Encrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026 Decrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026  120   120  / 120   10     30-5 (2)    4.0 


Wie Sie sehen, haben wir die Nachricht erfolgreich mit dem öffentlichen Schlüssel verschlüsselt.
Führen Sie den Code mehrmals aus. Sie werden sehen, dass sich das verschlüsselte Teil jedes Mal ändert. Dies liegt daran, dass wir beim Verschlüsseln den Cipher FeedBack-Modus (AES.MODECFB) verwendet haben, bei dem die Klartextblöcke mit den Chiffretextblöcken gemischt werden. iv - Initialisierungsvektor (lesen Sie hier mehr über den Modus). Beim Entschlüsseln der Nachricht sehen wir, dass der Hash der entschlüsselten Nachricht mit dem Hash übereinstimmt, den wir während der Verschlüsselung hinzugefügt haben. Dies bedeutet, dass die Entschlüsselung korrekt war.

Was ist ein Hash?
Ein Dokument-Hash ist einfach eine Zeichenfolge, die für jeden Datensatz eindeutig ist. Bei jeder Datenänderung ändert sich der Hash sehr stark. Mit anderen Worten, ein Hash ist eine Art „Fingerabdruck“ für jeden Datensatz.



Aber was ist, wenn Verschlüsselungsschlüssel aus irgendeinem Grund kompromittiert werden? Dann kann jeder die Informationen entschlüsseln.

In diesem Fall müssen wir die Verschlüsselungsschlüssel irgendwie aus der Ferne mit einer Frequenz ändern, die vom Gegner abgerufen werden kann. Wir gehen davon aus, dass sie ihr bereits zuhören. Wie machen wir das? Hier hilft eine andere Methode, die asymmetrische Verschlüsselung (oder ein kryptografisches System mit öffentlichem Schlüssel). Im Gegensatz zur symmetrischen Verschlüsselung werden zwei Schlüssel verwendet: öffentlich und privat. Die Nachricht wird mit dem öffentlichen Schlüssel verschlüsselt. Danach kann sie nur noch mit dem privaten Schlüssel entschlüsselt werden. Der öffentliche Entschlüsselungsschlüssel ist unbrauchbar. Es gibt jedoch einen wichtigen Punkt: Der private Schlüssel muss auf jeden Fall aus dem generierten öffentlichen Paar stammen. Das Vorhandensein eines öffentlichen Schlüssels ist eine von mehreren wichtigen und interessanten Eigenschaften der asymmetrischen Verschlüsselung. Das heißt, wir können den öffentlichen Schlüssel über jeden Kanal übertragen und haben keine Angst, dass er zum Entschlüsseln der Nachricht verwendet wird.

Gleichzeitig gibt es in Bezug auf unsere Aufgabe eine Nuance: Die asymmetrische Verschlüsselung eignet sich für kleine Datenmengen, beispielsweise für Kurznachrichten. Wir können nur die Menge an Daten erraten, die durch Intelligenz erhalten werden. Natürlich können wir alle empfangenen Daten in kleine Fragmente aufteilen und jedes mit einem privaten Schlüssel codieren, aber es gibt eine bessere Lösung. (Das Problem wird hier behoben ).

Lösung

Der Benutzer Akela_wolf bemerkte zu Recht, dass jeder den öffentlichen Schlüssel generieren und senden kann. Ich habe einige Anpassungen am Plan vorgenommen.

Es ist richtig, wenn die Zentrale vor dem Senden von Agenten mehrere Schlüsselpaare generiert und jedem Agenten einen privaten Schlüssel zuweist. Es ist besser, nur wenige Paare zu generieren, damit jeder Agent einen eigenen Schlüssel hat. Dies ist erforderlich, um den Besitzer des Schlüssels genau zu personifizieren.
Wenn die Schlüssel kompromittiert werden, erstellt das Center einen neuen SYMMETRIC-Schlüssel, codiert ihn mit öffentlichen Schlüsseln an jeden Agenten und sendet ihn über den offenen Kanal.
Allgemeines Lösungsschema






Alte Entscheidung
  1. Der Agent generiert ein Schlüsselpaar (öffentlich und privat) und sendet dann den öffentlichen Schlüssel an die Rebellen.
  2. Im Hauptquartier des Widerstands werden sie einen neuen Schlüssel für die SYMMETRISCHE Verschlüsselung erstellen.
  3. Der symmetrische Schlüssel wird mit dem öffentlichen Schlüssel codiert, den der Agent gesendet hat.
  4. Der verschlüsselte symmetrische Schlüssel wird an den Agenten gesendet, der ihn mit dem privaten Schlüssel dekodiert.

Achten Sie auf unsere Show auf dem offenen Kanal:

  1. Der Agent sendet den OPEN-Schlüssel vom Paar, der CLOSED-Schlüssel befindet sich in seinem Besitz.
  2. Die Widerstandszentrale sendet einen symmetrischen Verschlüsselungsschlüssel, der mit dem vom Agenten gesendeten öffentlichen Schlüssel verschlüsselt ist.


Weder die erste noch die zweite Nachricht haben beim Abfangen einen Wert.


Schreiben wir den Code:

 #          RSA. #        SHA256 from Crypto.PublicKey import RSA #      def generate_keys(bits = 2048): """Generates the pair of private and public keys. :param bits: <int> Key length, or size (in bits) of the RSA modulus (default 2048) :return: <object> private_key, <object> public_key """ private_key = RSA.generate(bits) public_key = private_key.publickey() return private_key, public_key private_key, public_key = generate_keys(bits = 2048) 

Mal sehen, wie die Tasten aussehen.
 print(private_key.exportKey(format='PEM').decode()) print('\n') print('#'*65) print('\n') print(public_key.exportKey(format='PEM').decode()) 

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA4JDLu7Vtvg2yqbH6Y0eJPfoEsOlKzgmOodqhA1CqkEG4OpKi
sGW7ciGP4v37GE6edHBCEy4UNkVQtnpPBjzTHvKd1pO70B84vD5OSrS7uNw2EYkj
d/ZwhrJMrcQKRwPkkM4OiewaaAaK0vPWJIKwlW61DY9X7LfNz7aOKMTbKnm1vdR0
919AV98FUmNoQBgka6nXFGmNbi7D43MtLwxBZIXfFupEiANSvOs+57hgaCho7OWM
GUOjLkG6HBscPhJ2W1H5DU9GjwL24ynTvKifgo1/2ue61MV1Pzh5CVaicJKNaRtg
Pd99gFhBGINsXV2X6Jh/W5nNsCddU4EI0AlO8wIDAQABAoIBAARM4YnjrIlSK9Sy
EtBp40frjMFyhjsx1ahlzmWI2utORt/gRPtJx3AlEmNPZ8qMXt5t8+X4IOz1INmN
uAuviH90N++O/q66mlSIgOlPUrT0ipiFXseCUZ9StMMzGNtJSMw5FfAwNEU/stLd
VoF2ezkxWIg88XsX/fn3Tfub4XKLvu4raJGcJ+Fo2GI9hYEGKnHhSuHvDHekTLlQ
z46O+cIwtehbFGcKesyK3zDD1uP5YLPIWpiqt1TgKjJzRF0l4ZJLk+RT7kU2pGIQ
mosOnr+06WyMIg724yQyAIwtS9X0czKBGUESrtTTb1HCXLeTwnncOTxh6q2z42LF
tn34+DECgYEA6EEp4oTvjfTQfUQPMByuAjF1hpdFHQqRymygiFgoF+Mg3QmL0w8j
/84H/q7s8FSx+3th8MK87bFq4lrry+h/mYwmvF5zZbhxcnl2uaX+KUPgpT6TgvAo
WOv2wc4BSaoo9DrxrZId86vpO2qbopw6gkBsvw47HSoQ+FSqXtZ0p8kCgYEA94Zj
b1ulctUjybiszO93TAjkzx3lU3yL+B1eZiQXtJa3mgG+ka1R/uMfr0NlT+Jzo0My
wHV30YRJDxziCrDol9OgSSU0sXwEcUxUIBLBwXLCp1EmMsYG9PB/x4OTWve35a8F
O+rMxuvWaZeIOfVCfL8UEcWweYaVdWIonJN+ltsCgYEAjeSZ2UlMLZce9RjqioNL
EA31dlfeoqJ9dYUuAn6RaB6cSk51vWlnnfXazo9CNIYaAsFbkcL3t+QHn+jaXEZc
BowocjbmG4Q20zBAB6XRBJbynSIA7yMYE1N9+uOHx+CMisGkO12krOUfZex4zzzR
RhhkF8ly9htoKL9ZIv20YXkCgYBzH3UF6PkVZJ5lhtgP5Nx2Z7iLwBrV7ppnBrnO
BcFkw6iXH3KT7KmzQ82LxWvMcMVZzLpBGyFkOAOG3OchE9DKNKpa+sv8NHMYguip
li+5mneAPFTozoOTznuPvtl9OLO2RuXHTVh6uFub9tdsJW8L+A8MiQagLwE6fDHp
SQxaewKBgQDIyzL1THpW3+AMNrOZuI/d3Em5wpGJiZbDSBRosvsfGm/sHaz4Ik5E
nWnftgktmsAD60eORTTh9/ww/nm7f3q9kzT8Sv1MmqeRXq9VFIOeP/+8SSE/7LzD
izlb5xEtVD8LuY54jHyiOxiZC++TQswMnOKKi0Gx26MDoO7Tx9akVw==
-----END RSA PRIVATE KEY-----

#################################################################

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4JDLu7Vtvg2yqbH6Y0eJ
PfoEsOlKzgmOodqhA1CqkEG4OpKisGW7ciGP4v37GE6edHBCEy4UNkVQtnpPBjzT
HvKd1pO70B84vD5OSrS7uNw2EYkjd/ZwhrJMrcQKRwPkkM4OiewaaAaK0vPWJIKw
lW61DY9X7LfNz7aOKMTbKnm1vdR0919AV98FUmNoQBgka6nXFGmNbi7D43MtLwxB
ZIXfFupEiANSvOs+57hgaCho7OWMGUOjLkG6HBscPhJ2W1H5DU9GjwL24ynTvKif
go1/2ue61MV1Pzh5CVaicJKNaRtgPd99gFhBGINsXV2X6Jh/W5nNsCddU4EI0AlO
8wIDAQAB
-----END PUBLIC KEY-----

Wie Sie sehen können, sind asymmetrische Verschlüsselungsschlüssel lange mathematisch erzeugte Zeichenfolgen.

Also haben wir die Schlüssel generiert. Schreiben wir nun eine Funktion zum Codieren von Daten:

 from Crypto.PublicKey import RSA #        RSA. from Crypto.Hash import SHA256 #        SHA256.    #       from Crypto.Cipher import PKCS1_OAEP #   def encrypt_message(message, public_key, verbose = True): """Encripts the message using public_key. :param message: <str> Message for encryption :param public_key: <object> public_key :param verbose: <bool> Print description; :return: <object> Message encrypted with public_key """ message_hash = SHA256.new(message.encode()) #   . cipher = PKCS1_OAEP.new(public_key) message_with_hash = message.encode() + message_hash.hexdigest().encode() #      ,          encrypted_message = cipher.encrypt(message_with_hash) if verbose: print(f'Message: {message} was encrypted to\n{encrypted_message.hex()}') return encrypted_message def decrypt_message(encrypted_message, private_key): """Decripts the message using private_key and check it's hash :param encrypted_message: <object> Encrypted message :param private_key: <object> private_key :return: <object> Message decripted with private_key """ dsize = SHA256.digest_size*2 cipher = PKCS1_OAEP.new(private_key) decrypted_message_with_hesh = cipher.decrypt(encrypted_message) #   (  ) decrypted_message = decrypted_message_with_hesh[:-dsize] #      digest = SHA256.new(decrypted_message).hexdigest() #     if digest==decrypted_message_with_hesh[-dsize:].decode(): #      ,      ,   print(f"Success!\nEncrypted hash is {decrypted_message_with_hesh[-dsize:].decode()}\nDecrypted hash is {digest}") return decrypted_message.decode() else: print(f"Encryption was not correct: the hash of decripted message doesn't match with encrypted hash\nEncrypted hash is {decrypted_message_with_hesh[-dsize:]}\nDecrypted hash is {digest}") 

Workflow-Schritte
  1. Der Agent generiert ein Schlüsselpaar:
     private_key, public_key = generate_keys() 

  2. Sendet den OPEN-Schlüssel an das Hauptquartier.
  3. Codieren Sie in der Zentrale mit dem öffentlichen Schlüssel den Schlüssel für die symmetrische Verschlüsselung:
     new_symmetric_key = 'SOME_KEY_asdfasdfasdfasdfsdfgrtwhetynt' encr_msg = encrypt_message(new_symmetric_key, public_key) 

    Fazit
    Message: SOME_KEY_asdfasdfasdfasdfsdfgrtwhetynt was encrypted to
    41e940507c96397e3feb4a53390c982633bb1775a52957996a8069bd22063086a0e831bf775a17909276aba0d0478ee6c953837c8ea5d20d40e1c8eb463aaa1bc5c93c71677b1a85e90439c9dbda8a98ce168acb38368155437c66815b84aa2fbdda0eb909e4e6079b4410c720eddd955ed048193bf87f8f9976a17ee32a58a71dfddf3db116343d949d29c25f72c511a440a50a5d4f1e01c37b24a1cb4127e191d3231328b2f120c7dbd0cb5bf19823f0978b8ed17d25952de4b146ef9724fff359eb2af503fdfd72b91525a5503b076ba9aaaeac55af3f8d210c12d579d45dd70362123c0b4b36ef9c2f7705e6f884a25553eb0e11e5077f11fa986d0ff280


  4. Diese lange Sequenz wird an den Agenten zurückgesendet.
  5. Der Agent entschlüsselt die empfangene Nachricht mit dem privaten Schlüssel:
     recieved_symmetric_key = decrypt_message(encr_msg, private_key) print('\n') print(f"New symmetric key is: {recieved_symmetric_key}") 

    Fazit
     Success! Encrypted hash is 42ad66445a05ac09e684bb21f9b487d95b9cfa11d02e0b459931321ee02f7c1c Decrypted hash is 42ad66445a05ac09e684bb21f9b487d95b9cfa11d02e0b459931321ee02f7c1c New symmetric key is: SOME_KEY_asdfasdfasdfasdfsdfgrtwhetynt 


  6. Anschließend verschlüsselt der Agent mithilfe eines neuen symmetrischen Schlüssels die empfangenen Daten:

     message = """  120   120  / 120   10     30-5 (2)    4.0 """ encr_message = symmetric_encrypt(message, recieved_symmetric_key, verbose = True) 

    Fazit
     Message was encrypted into: 


  7. Das Hauptquartier entschlüsselt:
     print('DECRIPTION') decr_message = symmetric_decrypt(encr_message, new_symmetric_key) print(decr_message) 

    Fazit
     DECRIPTION Success! Encrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026 Decrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026  120   120  / 120   10     30-5 (2)    4.0 




Voila!

In diesem abstrakten Beispiel haben wir die Arbeit gängiger Verschlüsselungsalgorithmen gesehen. Symmetrische und asymmetrische Verschlüsselung sowie Hashing werden in der Arbeit des Webs , der elektronischen Signatur , der Blockchain und der Kryptowährungen verwendet . Ich hoffe, das Material war hilfreich, um die Funktionsweise dieser Technologien zu verstehen.

Nachwort


Infolgedessen gelang es dem Geheimdienst der Rebellen, genaue Informationen über die Verwundbarkeit der Station und den Weg dorthin, die Anwesenheit des Kaisers zur Inspektion, die Anwesenheit eines Energieschilds und seiner Quelle auf Endor zu erhalten. Das Imperium entdeckte die Spione und informierte sie falsch über die Kampfkraft der Station. Die Station wurde auch dem Satelliten von Endor zugeordnet, von wo aus sie durch einen Schild geschützt war.

Aber wir wissen, wie alles endete;)

Source: https://habr.com/ru/post/de452042/


All Articles