Elliptic Curve Diffie-Hellman kann nicht mit Javascript überbrückt werden

Ich weiß, dass dies eine sehr spezifische Frage ist, aber ich habe versucht, Schlüssel zwischen PHP und einem Client mit dem Elliptic Curve Diffie-Hellman-Algorithmus (ECDH) auszutauschen, der auf 2 Bibliotheken basiert, die vernünftig erscheinen:

https://github.com/mdanter/phpecc für den PHP-Teil und

http://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html für den js Teil.

Es scheint, dass die Parameter (wie in der zweiten Demo zu sehen) für die Mattias Danter-Bibliothek in (1) einfach nicht richtig sind!

Was ich versucht habe:

ein. Produziere Alice öffentlichen Schlüssel in PHP

b. nimm x- und y-Werte aus (a) und setze js Demo-Seite in Stanford anstelle von Alice-Feldern ein

c. Produziere von Seite (b) Bobs öffentlichem Punkt und privatem Schlüssel

d. Führen Sie PHP in (a) erneut aus, setzen Sie aber jetzt Alices Eigenschaften auf die vorherige Ausführung zurück (ich musste einige Setter in Mattias Danter-Klassen hinzufügen) und verwendeten dann Bobs öffentliche Werte und den geheimen Schlüssel, um Bob auf die Werte von Javascript zurückzusetzen

e. Schlüssel importieren und vergleichen

aber PHP fängt einen Fehler:

Fatal error: Uncaught exception 'ErrorException' with message 'Curve CurveFp Object 
( [a:protected] => -3 [b:protected] => 
2455155546008943817740293915197451784769108058161191238065 [prime:protected] => 
6277101735386680763835789423207666416083908700390324961279 ) does not contain point 
( 1328803036204499271979785126753219480492435117174 , 
-228023147101697490181439300085858154675358736333 )' in 
/var/www/users/test/php/tests/ext/phpecc-master/classes/Point.php:53 

Beim Durchsuchen meines Codes habe ich herausgefunden, was den Fehler verursacht hat: Es war während der Berechnung des gemeinsamen Schlüssels durch Alice:

public function calculateKey() {
  $this->agreed_key = Point::mul($this->secret, $this->receivedPubPoint)->getX();
}

Bobs öffentlicher Schlüssel (aus Javascript) wurde in gespeichertEcDH::receivedPubPoint und erzeugt Fehler !!

Hier ist das Objekt Alice mit einer Bezeichnung (EcDH-Klasse):

Alice:
EcDH Object
(
  [generator:EcDH:private] => Point Object
  (
    [curve] => CurveFp Object
    (
      [a:protected] => -3
      [b:protected] => 2455155546008943817740293915197451784769108058161191238065
      [prime:protected] => 6277101735386680763835789423207666416083908700390324961279
    )

    [x] => 602046282375688656758213480587526111916698976636884684818
    [y] => 174050332293622031404857552280219410364023488927386650641
    [order] => 6277101735386680763835789423176059013767194773182842284081
  )

  [pubPoint:EcDH:private] => Point Object
  (
    [curve] => CurveFp Object
    (
      [a:protected] => -3
      [b:protected] => 2455155546008943817740293915197451784769108058161191238065
      [prime:protected] => 6277101735386680763835789423207666416083908700390324961279
    )

    [x] => 1230571492519579244570075682716266141492045436832711426918
    [y] => 925696034592317781055362853857916815608433923236519324844
    [order] =>
  )

  [receivedPubPoint:EcDH:private] =>
  [secret:EcDH:private] => 14506874945990177925841757912817895350330843517362
  [agreed_key:EcDH:private] =>
)

Meiner Meinung nach sind die öffentlichen JavaScript-Werte aufgrund der Art und Weise, in der Felder unter "Elliptic Curve-Parameter" implementiert sind, nicht korrekthttp://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html.

Wenn ich mehr suche, stelle ich fest, dass die js-Blöcke von Stanfords Code im Vergleich zur PHP-Version problematisch sind:

// ECCurveFp
// constructor
function ECCurveFp(q,a,b) {
    this.q = q;
    this.a = this.fromBigInteger(a);
    this.b = this.fromBigInteger(b);
    this.infinity = new ECPointFp(this, null, null);
}

// ----------------
// SECNamedCurves
function secp192k1() {
    // p = 2^192 - 2^32 - 2^12 - 2^8 - 2^7 - 2^6 - 2^3 - 1
    var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37");
    var a = BigInteger.ZERO;
    var b = fromHex("3");
    //byte[] S = null;
    var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D");
    var h = BigInteger.ONE;
    var curve = new ECCurveFp(p, a, b);
    var G = curve.decodePointHex("04"
                + "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D"
                + "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D");
    return new X9ECParameters(curve, G, n, h);
}

Gibt es irgendwelche Vorschläge?

Vielen Dank.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage