Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| lehrkraefte:blc:informatik:glf20:robotik:modernecrypto:asymmetric [2021/06/08 08:06] – created Ivo Blöchliger | lehrkraefte:blc:informatik:glf20:robotik:modernecrypto:asymmetric [2021/06/17 19:12] (current) – [GPG Public/Private-Keys und e-mail Verschlüsselung] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Asymmetrische Krypto-Verfahren ====== | ||
| + | * {{lehrkraefte: | ||
| + | |||
| + | ===== Diffie-Hellman Verfahren zur Schlüsselerzeugung ===== | ||
| + | <hidden Python-Code> | ||
| + | <code python diffiehellman.py> | ||
| + | from random import randrange | ||
| + | import time | ||
| + | |||
| + | # Überprüft, | ||
| + | def isPrime(p): | ||
| + | if p%2==0: | ||
| + | return False | ||
| + | f=3 | ||
| + | while (f*f< | ||
| + | if p%f==0: | ||
| + | return False | ||
| + | f+=2 | ||
| + | return True | ||
| + | |||
| + | # Sucht die nächste Primzahl p>=x so, dass (p-1)/2 auch prim ist | ||
| + | # (sonst vereinfacht sich die Berechnung des diskreten Logarithmus) | ||
| + | def nextSophieGermainPrime(x): | ||
| + | while not isPrime(x) or not isPrime((x-1)// | ||
| + | x+=1 | ||
| + | return x | ||
| + | |||
| + | # Sucht die nächste Primzahl p>=x | ||
| + | def nextPrime(x): | ||
| + | while not isPrime(x): | ||
| + | x+=1 | ||
| + | return x | ||
| + | |||
| + | # Berechnet a^e % n | ||
| + | def modpow(a, | ||
| + | prod = 1 | ||
| + | while e>0: | ||
| + | if e%2==1: | ||
| + | prod = (prod*a) % n | ||
| + | a = (a*a) % n | ||
| + | e = e//2 # Ganzzahlige Division | ||
| + | return prod | ||
| + | |||
| + | |||
| + | # Exponent durch Probieren herausfinden | ||
| + | def discreteLog(a, | ||
| + | print(" | ||
| + | tic = time.time() | ||
| + | for e in xrange(p): | ||
| + | if modpow(a, | ||
| + | toc = time.time() | ||
| + | print(" | ||
| + | return e | ||
| + | return -1 | ||
| + | |||
| + | def schluesselTausch(basis=-1, | ||
| + | if modulus==-1: | ||
| + | modulus = nextPrime(1000000+randrange(100000)) | ||
| + | if basis==-1: | ||
| + | basis = nextSophieGermainPrime(randrange(modulus-1000)+100) | ||
| + | | ||
| + | # Zufällige Zahl | ||
| + | if x==-1: | ||
| + | x = randrange(modulus-101)+100 | ||
| + | | ||
| + | # Öffentliches a^x mod p | ||
| + | ax = modpow(basis, | ||
| + | | ||
| + | # Öffentliche Daten ausgeben | ||
| + | print(" | ||
| + | | ||
| + | if ay==-1: | ||
| + | ay = inputInt(" | ||
| + | # Geheimnis berechnen | ||
| + | s = modpow(ay, x, modulus) | ||
| + | |||
| + | # Ausgabe | ||
| + | print(" | ||
| + | print(" | ||
| + | # Ausgabe verstecken | ||
| + | print(" | ||
| + | # Öffentliche Daten ausgeben | ||
| + | print(" | ||
| + | | ||
| + | def hacker(basis, | ||
| + | # Exponenten vom ersten Kommunikationsparter durch Probieren finden | ||
| + | x = discreteLog(basis, | ||
| + | # Geheimnis s = (a^y)^x | ||
| + | s = modpow(ay, x, modulus) | ||
| + | print(" | ||
| + | |||
| + | | ||
| + | ##################### | ||
| + | ### Programmstart ### | ||
| + | ##################### | ||
| + | | ||
| + | schluesselTausch() | ||
| + | |||
| + | # hacker(276779 ,1007381, 942681, 5623) # Basis, Modulus (p), a^x und a^y eintragen zum Knacken (s=644690) | ||
| + | |||
| + | |||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== GPG Public/ | ||
| + | |||
| + | <WRAP todo> | ||
| + | **Hinweis**: | ||
| + | * Erzeugen Sie sich ein Schlüsselpaar und speichern Sie Ihre Schlüssel in einer Text-Datei (.txt, nicht .docx). | ||
| + | * Als Identität können Sie ihren Vornamen oder einen Fantasie-Namen verwenden. | ||
| + | * Als Passwort wählen Sie ein einfaches Passwort. Das es hier nur um eine kleine Demo geht und nichts sicherheitsrelevantes, | ||
| + | * Belassen Sie die Einstellungen des Algorithmus und der Schlüssellänge. | ||
| + | * Zu Demo-Zwecken und diese Aufgabe kann folgende Webseite verwendet werden: [[https:// | ||
| + | * Posten Sie Ihren Public Key auf diesem [[https:// | ||
| + | * Testen Sie erst für sich die Ver- und Entschlüsselung mit Ihrem public Key, den Sie auf Teams veröffentlicht haben, um sicher zu stellen, dass der public key auch korrekt auf Teams veröffentlicht wurde und dass Sie damit verschlüsselte Nachrichten lesen können. [[https:// | ||
| + | * Schreiben Sie sich (oder auch mir) auf diesem Teams-Kanal verschlüsselte Nachrichten. Bennen Sie den Adressaten mit @-Zeichen (z.B. @ivo.bloechliger), | ||
| + | * Für die Ver- und Entschlüsselung können Sie folgende Seite verwenden: [[https:// | ||
| + | * Entschlüsseln Sie die Nachrichten, | ||
| + | </ | ||