No se puede salvar Diffie-Hellman de curva elíptica con javascript

Sé que esta es una pregunta muy específica, pero traté de intercambiar claves entre php y un cliente utilizando el algoritmo Elliptic Curve Diffie-Hellman (ECDH) basado en 2 bibliotecas que parecen correctas:

https://github.com/mdanter/phpecc para la parte php y

http://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html por la parte js.

¡Parece que los parámetros (como se pueden ver en la segunda demostración) no son los adecuados para la biblioteca Mattias Danter en (1)!

Lo que intenté:

a. producir la clave pública de Alicia en PHP

segundo. tome los valores de x e y de (a) y coloque la página de demostración js en stanford en lugar de los campos de Alice

do. producir desde la página (b) punto público de Bob y clave privada

re. vuelva a ejecutar php en (a) pero ahora restablezca las propiedades de Alice a la ejecución anterior (tuve que agregar algunos configuradores en las clases de Mattias Danter) y luego usé los valores públicos y la clave secreta de Bob para restablecer los valores de JavaScript de Bob

mi. importar claves y comparar

pero php atrapa un error:

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 

buscando en mi código encontré la causa del error: fue durante el cálculo de la clave común por Alicia:

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

La clave pública de Bob (de javascript) fue almacenada enEcDH::receivedPubPoint y genera error !!

Aquí está el objeto Alicia con alguna identificación (clase EcDH):

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] =>
)

Mi opinión es que los valores públicos de javascript no son correctos debido a la forma en que se implementan los campos en "Parámetros de curva elíptica" enhttp://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html.

Al buscar más, descubrí que estos bloques js del código de Stanford son problemáticos en comparación con la versión php:

// 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);
}

¿Hay alguna sugerencia?

Gracias.

Respuestas a la pregunta(1)

Su respuesta a la pregunta