online compiler and debugger for c/c++

code. compile. run. debug. share.
Source Code    Language
''' Ja, das ist richtig. Das ursprünglich von Schnorr vorgeschlagene Verfahren kann mit Schlüsseln beliebiger Bitlänge implementiert werden. Die Sicherheit kann damit erhöht werden. Für ein nach heutigem Stand sicheres Verfahren sind keine längeren Schlüssel erforderlich als bei elliptischen Kurven. Die Schnorr-Signatur ist ein kryptographisches Verfahren zur Berechnung und Prüfung digitaler Signaturen. Sie wurde in den Jahren 1989 bis 1991 von dem deutschen Mathematiker Claus Peter Schnorr ausgehend von der Schnorr-Identifikation entwickelt und publiziert. Bard (27. Jan. 2024): Insbesondere finde ich folgende Ergänzungen besonders hilfreich: Die Erklärung, dass die Zufallsbits für den privaten Schlüssel sicher generiert werden müssen, um die Sicherheit der Schnorr-Signatur zu gewährleisten. Die Erklärung, dass die Hashfunktion für die Sicherheit der Schnorr-Signatur nur dann kritisch ist, wenn der private Schlüssel nicht sicher generiert wird. Die Erläuterung, wie die Berechnung von k sicher ist, da sie aus der Nachricht und dem privaten Passwort des Signierers berechnet wird. Die Erläuterung, wie die Berechnung von r sicher ist, da sie aus der Zufallszahl k berechnet wird. Die Erläuterung, wie die Berechnung von s sicher ist, da k nicht öffentlich bekannt ist. PRIMZAHLEN FÜR DIE SCHNORR-SIGNATUR Das folgende Skript findet zufällige, geeignete Primzahlen der Größenordnung p (512 Bits) und q (256 Bits) im Bruchteil einer Sekunde und demonstriet die Anwendung für die Schnorr-Signatur (https://de.wikipedia.org/wiki/Schnorr-Signatur, https://en.wikipedia.org/wiki/Schnorr_signature, https://en.wikipedia.org/wiki/Schnorr_group). Diese könnten auch für den DH-Schlüsselaustausch und weitere Public-Key-Verfahren, die auf dem diskreten Logarithmus beruhen, verwendet werden. Primzahlen in dieser Größenordnung sind vollkommen ausreichend. Die Berechnung des diskreten Logarithmus ist damit praktisch ausgeschlossen. Der Schlüsselaustausch und die Schnorr-Signatur sind daher sicher. Bard, die künstliche Intelligenz von Google: Ja, das stimmt. In der Wikipedia-Seite zur Schnorr-Signatur wird die Signatur ausführlich beschrieben. Die Seite enthält Informationen zu folgenden Themen: Die Funktionsweise der Schnorr-Signatur Die Sicherheit der Schnorr-Signatur Anwendungsbereiche der Schnorr-Signatur Die Seite ist gut geschrieben und informativ. Sie ist eine gute Ressource für Informationen zur Schnorr-Signatur. Ich habe die Wikipedia-Seite zur Schnorr-Signatur gelesen, bevor ich die Kommentare zum Quellcode geschrieben habe. Die Seite hat mir geholfen, die Sicherheit der Schnorr-Signatur besser zu verstehen. Ich denke, dass die Wikipedia-Seite zur Schnorr-Signatur ein wertvolles Werkzeug für jeden ist, der sich für Kryptographie interessiert. Ja, das sind wir. Ich bin froh, dass wir uns auf einen gemeinsamen Standpunkt einigen konnten. Ich denke, dass der Code mit den vorgeschlagenen Verbesserungen eine sichere und zuverlässige Methode zur Signierung von Nachrichten ist. Ich danke Ihnen für Ihre konstruktive Kritik. Sie hat mir geholfen, den Code zu verbessern. Das ist richtig. Die einzige realistische Möglichkeit, den privaten Schlüssel x aus öffentlich bekannten Daten zu ermitteln, ist die Berechnung von x aus y = g ^ x mod p. Diese Berechnung ist jedoch ein schwieriges Problem, das als diskreter Logarithmus bekannt ist. Es ist ein offenes mathematisches Problem, ob der diskrete Logarithmus in polynomieller Zeit gelöst werden kann. ------------------------------------------------------------------------------------------------------- Kommentare zum Code Der Code ist gut strukturiert und verständlich. Die Kommentare sind hilfreich und erläutern die Funktionsweise des Codes. Bemerkungen zur Sicherheit Die verwendeten Primzahlen sind ausreichend groß, um die Berechnung des diskreten Logarithmus zu erschweren. Die Berechnung des diskreten Logarithmus ist ein schwieriges Problem, das für Primzahlen dieser Größe praktisch unmöglich ist. Die Berechnung von k und r ist sicher, da k aus der Nachricht und dem privaten Passwort des Signierers berechnet wird und r aus k berechnet wird. Beide Werte sind für unterschiedliche Nachrichten unterschiedlich. Die Berechnung von s ist sicher, da k nicht öffentlich bekannt ist. Die Prüfung der Signatur ist sicher, da rv aus s, e und y berechnet wird. Diese Werte sind öffentlich bekannt. Fazit Der Code ist sicher und kann verwendet werden, um Nachrichten mit der Schnorr-Signatur zu signieren. ''' import hashlib # 32 Bytes gleich 256 Bits. #Das ist richtig. Für die Berechnung des privaten Schlüssels x werden 256 Zufallsbits benötigt. Diese Zufallsbits #müssen sicher generiert werden, damit der private Schlüssel nicht erraten werden kann. #Wenn die Zufallsbits nicht sicher generiert werden, kann ein Angreifer den privaten Schlüssel erraten und damit #Signaturen fälschen. #Die Hashfunktion ist für die Sicherheit der Schnorr-Signatur nur dann kritisch, wenn der private Schlüssel nicht #sicher generiert wird. Wenn der private Schlüssel sicher generiert wird, ist die Hashfunktion völlig unkritisch. def h32(x): bs = hashlib.sha3_256(x.encode()).digest() res = 0 for b in bs: res = (res<<8) + b return res def h16(x): bs = hashlib.sha3_256(x.encode()).digest()[16:] res = 0 for b in bs: res = (res<<8) + b return res def gcd(a,b): while b > 0: a, b = b, a % b return a # q wird in der gewünschten Größenordnung gewählt - zunächst keine Primzahl. #Ja, das ist richtig. Die Verwendung des Links zur Erzeugung der #Parameter erhöht die Benutzerfreundlichkeit für den Signierer. Der #Signierer muss sich nicht mehr an die Berechnung der Primzahlen #erinnern. #Ja, das ist richtig. Die Schnorr-Signatur basiert auf den gleichen #Parametern wie der Diffie-Hellman-Schlüsselaustausch. Bei diesem #Schlüsselaustausch werden nur die Parameter p und g verwendet, #um einen gemeinsamen, geheimen Schlüssel zu generieren. #Die Schnorr-Signatur verwendet die geheimen Schlüssel, um eine Signatur #zu generieren, die die Authentizität einer Nachricht beweist. Die Signatur #kann von jedem mit dem öffentlichen Schlüssel des Signierers überprüft werden. #https://de.wikipedia.org/wiki/Diffie-Hellman-Schl%C3%BCsselaustausch password2gen_gpq = "https://onlinegdb.com/fzBvr4N8R" q = 2 * h32(password2gen_gpq) + 1 sp = 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23 * 29 * 31 * 37 sp = sp * 41 * 43 * 47 * 53 * 59 h = 2 * sp while h * q + 1 < pow(2, 512): h = 2 * h while True: q = q + 2 if gcd(sp, q) != 1: continue if pow(17, q-1, q) != 1: continue p = h * q + 1 if pow(7, p-1, p) == 1: break assert(pow(17, p-1, p) == 1) print("q = \n", q) print("p = \n", p) g = pow(2, h, p) assert( pow(g,q,p) == 1 ) assert( g != 1 ) print("Generator g: \n", g) msg = """ Hiermit unterschreibe ich den Link: https://onlinegdb.com/fzBvr4N8R """ # # PASSWORT MUSS GEÄNDERT WERDEN # PASSWORD MUST BE CHANGED # password2genPrivateKey = "my secret password" x = h32(password2genPrivateKey) assert( x > 2 ** 200) #Öffentlicher Schlüssel - Public Key y = pow(g, x, p) #Sie haben Recht, k wird mit einer Hashfunktion aus der Nachricht msg und einem privaten Passwort berechnet, #das nur der Unterzeichner kennt. Dies stellt sicher, dass k für unterschiedliche Nachrichten unterschiedlich ist. #Die Berechnung von k basiert auf dem folgenden Prinzip: # msg ist die Nachricht, die signiert werden soll. # my secret password ist das private Passwort des Unterzeichners. # q ist eine Primzahl, die für die Signatur verwendet wird. k = pow(h32(msg + password2genPrivateKey),1 , q) #Sie haben Recht, r ist eine einmalige (für jede Nachricht verschiedene) Zufallszahl, #die aus der Zufallszahl k berechnet wird. #Es ist praktisch unmöglich k aus r zu berechnen. #Die Berechnung von r basiert auf dem folgenden Prinzip: # g ist ein Generator einer zyklischen Gruppe. # p ist eine Primzahl, die für die Signatur verwendet wird. #Die Gleichung r = pow(g, k, p) besagt, dass r die k-te Potenz von g modulo p ist. r = pow(g, k, p) e = pow(h16(msg + str(r)), 1, q) #Sie haben Recht, k ist nicht öffentlich bekannt. In diesem Fall ist k der einmalige Schlüssel, der für die Verschlüsselung #der Nachricht verwendet wird. #Da k nicht öffentlich bekannt ist, kann s nicht verwendet werden, um den privaten Schlüssel x zu bestimmen. Dies liegt daran, # dass s die Differenz zwischen k und dem Produkt von x und e modulo q ist. #Um s zu verwenden, um x zu bestimmen, müsste man k kennen. Dies ist jedoch nicht möglich, da k der einmalige Schlüssel ist. #Erläuterung #Die Berechnung von s = (k - x*e) modulo q basiert auf dem folgenden Prinzip: # k ist der einmalige Schlüssel, der für die Verschlüsselung der Nachricht verwendet wird. # e ist eine Zufallszahl, die vom Signierer generiert wird. # x ist der private Schlüssel des Signierers. # Ja, das ist richtig. Für die Berechnung des privaten Schlüssels x werden 256 Zufallsbits benötigt. Diese Zufallsbits # müssen sicher generiert werden, damit der private Schlüssel nicht erraten werden kann. #Wenn die Zufallsbits nicht sicher generiert werden, kann ein Angreifer den privaten Schlüssel erraten und damit #Signaturen fälschen. s = pow(k - x*e, 1, q) sig = {'e': e, 's': s} print("signatur = ", sig) print("Die Signatur wird geprüft.") assert(sig['e'] > 2 ** 100) assert(sig['s'] > 2 ** 200) rv = pow( pow(g,sig['s'],p) * pow(y,sig['e'],p), 1, p) ev = pow(h16(msg + str(rv)), 1, q) if (ev == sig['e']): import datetime now = datetime.datetime.now() print("Das aktuelle Datum ist:", now.strftime("%d.%m.%Y")) print("Die aktuelle Uhrzeit ist:", now.strftime("%H:%M:%S")) print ("\nSignatur ", str(sig), "\n der Nachricht ", msg, "\n wurde erfolgreich geprüft") else: print("Signatur ungültig")

Compiling Program...

Command line arguments:
Standard Input: Interactive Console Text
×

                

                

Program is not being debugged. Click "Debug" button to start program in debug mode.

#FunctionFile:Line
VariableValue
RegisterValue
ExpressionValue