Diskussion:Diffie-Hellman-Schlüsselaustausch

aus Wikipedia, der freien Enzyklopädie
Zum Archiv
Wie wird ein Archiv angelegt?

Implementierung mit der Programmierspreche Python

Von der @84.118.82.226: wurde der untenstehende Python-Code als Ergänzung zum Abschnitt "Elliptic Curve Diffie-Hellman (ECDH)" hinzugefügt. Ich habe ihn (vorerst) wieder entfernt und hierhin kopiert. Ich glaube nicht, dass es sinnvoll ist, hier reinen Code zu posten. Dafür gibt es z.B. GitHub. Zumindest müsste man m.E. den Code etwas besser kommentieren, damit er hier einen Mehrwert bietet. Ausserdem müsste er mit "syntaxhighlight" versehen werden. --Didia (Diskussion) 07:57, 7. Mär. 2018 (CET)

import math

# must be of the form 4k + 3 = 4(k+1) - 1

prime = 2**607 - 1

def inv(b,m):

 s = 0
 t = 1
 a = m
 while b != 1:
   q = a/b
   aa = b
   b = a % b
   a = aa
   ss = t
   t = s - q*t
   s = ss
 if t < 0:
   t = t + m
 return t

def genP(x,a,b):

  if (4*a*a*a + 27*b*b) % prime == 0:
     b = b + 1
  while pow(x**3 + a*x + b, (prime - 1)/2, prime) != 1:
    x = x + 1  
  return [x % prime, pow(x**3 + a*x + b, (prime + 1)/4, prime)]

def ts(x,y,a):

 return ((3*(x**2) + a) * inv(2*y, prime)) % prime

def dpoint(P,a):

 x = P[0]
 y = P[1]
 s = ts(x,y,a)
 xr = (s**2 - 2*x) % prime
 yr = (-y + s * (x-xr)) % prime
 return [xr , yr]

def addP(P,Q,a):

 if P == Q:
   return dpoint(P,a)
 x1 = P[0]
 x2 = Q[0]
 y1 = P[1]
 y2 = Q[1]
 while x1 < x2:
    x1 = x1 + prime
 while y1 < y2:
    y1 = y1 + prime
 s = ((y1-y2) * inv(x1-x2, prime)) % prime
 xr = s**2 - x1 - x2
 yr = s * (x1-xr) - y1
 return [xr % prime,yr % prime]

def mulP(P,n,a):

 isFirst = True
 resP = P
 bsize = 20
 while 2**bsize < n:
    bsize = bsize + 1
 PP = resP
 for b in range(bsize + 1):
    if (n & (1 << b) != 0):   
        if isFirst:
           resP = PP
           isFirst = False
        else:
           resP = addP(resP,PP,a)
    PP = dpoint(PP,a) 
 return resP


# The parameters of the Elliptic Curve.

a=4834892389
b=34858911111111

# x-value of the starting point

x=123234354388937

# The starting point which is added many times to itself

P = genP(x,a,b)

# The public keys

privAlice = 85743857348573489891704994859049170499485904
privBob = 455457456346534563457893499994859049170499485904

# We calulate the public keys

pubkAlice = mulP(P, privAlice, a)
print "Public Key from Alice \n", pubkAlice  
pubkBob = mulP(P, privBob, a)
print "Public Key from Bob \n", pubkBob  
shareBob   = mulP(pubkAlice, privBob, a)
shareAlice = mulP(pubkBob, privAlice, a)
print "\n\nThe shared key as calculated from Alice\n", shareAlice 
print "\n\n"
print "Verification: Are the shared keys equal? ", shareAlice == shareBob

DH mit vorgegebenem K?

Wenn ich das richtig verstehe, weiss man nicht, was für ein K am Ende herauskommt. Könnte man DH so verwenden, dass z.B. Alice K vorgibt und die Parameter so wählt, dass Bob ebendieses K errechnet?

Nein, dann müsste Alice ja diskrete Logarithmen berechnen können, was ja eben nicht effizient möglich ist (sein soll). --Didia (Diskussion) 12:13, 25. Aug. 2019 (CEST)

Computational-Diffie-Hellman-Problem (CDH)

Im Text steht „mit mehreren hundert Dezimalstellen“. Sind die verwendeten Zahlen nicht ausschließlich ganze Zahlen, also Zahlen gerade ohne Dezimalstellen? - Chris (Diskussion) 10:01, 22. Mär. 2019 (CET)

Das stimmt. Habs mal korrigiert. --Didia (Diskussion) 12:25, 25. Aug. 2019 (CEST)

Genearator g

Im Artikel steht: „Da die Hälfte aller Zahlen kleiner p solche Generatoren sind, gibt es genug Auswahl.“ openssl dhparam erlaubt nur die Generatoren 2, 3, und 5, was nicht nach „genug Auswahl“ klingt. (nicht signierter Beitrag von 92.211.103.145 (Diskussion) 22:01, 24. Aug. 2019 (CEST))

Gemäss dieser Seite ist bei openssl der DH Parameter g immer 2, was aber nicht heisst, dass auch andere Möglich sind. Im Gegensatz zur Primzahl p muss die Wahl ja nicht unbedingt zufällig und gross sein. --Didia (Diskussion) 12:10, 25. Aug. 2019 (CEST)

Die Anzahl Primitivwurzeln ist nicht die Hälfte, sondern genau φ ( p − 1 ) , wie beim Kapitel Mathematische Grundlagen erwähnt. (nicht signierter Beitrag von 62.202.180.91 (Diskussion) 23:11, 17. Aug. 2022 (CEST))

Das Artikelbild

... ist mehr als irreführend und gibt den Schlüsselaustausch zudem falsch wieder. Das vermischen zweier unterschiedlicher Schlüssel wie in dem Bild wird alleine nie zu einem gemeinsamen Geheimnis führen. Das Bild sollte daher entfernt werden --2003:CE:6726:7700:C8A7:931F:C9A1:A02C 11:48, 4. Apr. 2020 (CEST)

Ich sehe das Problem nicht. Wie umseitig in Diffie-Hellman-Schlüsselaustausch#Mathematische_Funktionsweise genauer beschrieben, wählen Alice und Bob je einen geheimen Schlüssel, generieren daraus je einen öffentlichen Schlüssel und übermitteln diesen an den anderen. Sie kombinieren dann ihren eigenen geheimen Schüssel mit dem öffentlichen Schlüssel, den sie von dem anderen erhalten haben und bestimmen so das gemeinsame Geheimnis. --Count Count (Diskussion) 11:57, 4. Apr. 2020 (CEST)

Public-Key-Kryptoverfahren

Laut Artikel handelt es sich bei dem DH um ein Public-Key-Kryptoverfahren. Von mir aus können wir es als "asymmetrisches Kryptoverfahren" stehen lassen, doch laut dem (sogar verlinkten) Artikel zu asymm. Krypto. ist "Ein Public-Key-Verschlüsselungsverfahren [...] ein Verfahren, um mit einem öffentlichen Schlüssel einen Klartext in einen Geheimtext umzuwandeln, aus dem der Klartext mit einem privaten Schlüssel wiedergewonnen werden kann." Dies trifft nicht auf DH zu, da

1. weder irgendein Klartext in einen Geheimtext umgewandelt wird, geschweige denn aus einem Geheimtext in den ursprünglichen Klartext.

2. Die Privaten Schlüssel (x, y) die öffentlichen Schlüssel (g^x, g^y) nicht einmal invertieren können.

Die Bezeichnung ist daher irreführend. (nicht signierter Beitrag von 95.90.202.31 (Diskussion) 09:39, 2. Jun. 2020 (CEST))