Programación y la ecuación ECDSA

He estado implementando la adición de puntos en un programa C++ que he escrito, pero no veo cómo se puede hacer esto correctamente. Cuando lo hago slope = (y1 - y2)/(x1 - x2), obtengo un maldito decimal, que no produce los puntos adecuados cuando se aplica a las otras partes de la ecuación debido a que no conserva sus cualidades fraccionarias. ¿Alguien tiene alguna idea de cómo superar eso?

La suma de puntos se define mediante la siguiente ecuación:

slope = (y1 - y2) / (x1 - x2)

xsum = slope ^ 2 - (x1 + x2)

ysum = slope * (x1 - xsum) - y1

Donde Dirección Privada x02 con coordenadas x,y respectivamente:

89565891926547004231252920425935692360644145829622209833684329913297188986597
12158399299693830322967808612713398636155367887041628176798871954788371653930

con la Adición de Puntos de Dirección Privada x01 con coordenadas x,y respectivamente:

55066263022277343669578718895168534326250603453777594175500187360389116729240
32670510020758816978083085130507043184471273380659243275938904335757337482424

aplicada a la ecuación anterior produce el resultado de Dirección Privada x03 con coordenadas x, y respectivamente:

112711660439710606056748659173929673102114977341539408544630613555209775888121
25583027980570883691656905877401976406448868254816295069919888960541586679410

http://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication

EDITAR:

Preparé este programa en C++ y lo modifiqué de todas las formas que se me ocurrieron (moviendo %p, haciéndolo demasiadas veces, dividiendo las ecuaciones y cosas por el estilo). No puedo conseguir que resulte en los resultados adecuados. ¿A alguien le importaría echarle un vistazo y ver qué puede encontrar, por favor?

http://coliru.stacked-crooked.com/a/26f9ed24ed5a86ed

Probablemente debería señalar la descripción que está leyendo, ya que las que he visto no tienen nada que se llame pendiente. Sin embargo, supongo que tal vez la división debe hacerse usando aritmética modular.
Wow, la primera respuesta y ya desafió mi comprensión limitada de c ++. ¿Cómo lo convertiría en un ... "puntero"?
Lo siento, solo me refiero a una URL a la descripción del algoritmo.
usas ph1^2 que es XOR en C++, debes escribir ph1*ph1,
y usas camino a muchos corchetes. y el %p se aplica solo a (gx1 + gx2), no a toda la expresión
y usa enteros sin firmar, creo que necesita enteros con signo.
y el while (a>1) en tu mul_inv debería ser: while (b!=0)
En la esquina inferior derecha del sitio web hay un botón de "editar" que cualquiera puede usar para probarlo (luego lo compilas y lo compartes, el recurso compartido producirá una nueva URL que puedes compartir). coliru.stacked-crooked.com/a/7368ec065cd78b8c es el más nuevo. Intenté todas sus sugerencias (cualquier variación de las mismas) sin éxito.
Wilem, tyvm, ni siquiera puedo entender por qué una de mis variaciones no funcionó (como "sé", lo intenté). Tal vez estoy cometiendo un error en el que mis programas no se compilan en una forma actualizada o algo así ... ¿de casualidad le importaría mostrarme cómo obtendría la coordenada y adecuada también en ese programa? realmente no lo entiendo; pero el mío no funciona para el valor y.
Bien, lo entiendo... No entiendo por qué tuve que hacer y2 = (ph1 * gx1) - (ph1 * x2) - gy1 con %p de cada paréntesis en lugar de y2 = ph1 * (gx1 - x2 ) - y1 y luego y2 %= p.
su resultado ph1 de alguna manera tiene el signo incorrecto, si lo reemplaza con 'p-ph1' llega al resultado correcto. tal vez algo está mal con su mul_inv todavía?
Eso parece posible de repente, acabo de verificar algunos de mis resultados, el programa escupe las coordenadas x, y adecuadas para solo un par de direcciones. De repente obtiene la coordenada y incorrecta, entonces eso sesga todos los valores posteriores. lo estoy evaluando mas
coliru.stacked-crooked.com/a/74648b16c2692525 Los valores resultantes de x son válidos hasta 0x05, en 0x06 son incorrectos. Los valores de y solo son válidos para 0x03 y no para otros.

Respuestas (1)

La frase mágica en esa página está en un campo finito . Aquí el campo finito son los enteros mod p, donde p es el número 2 256 - 2 32 - 2 9 - 2 8 - 2 7 - 2 6 - 2 4 - 1 (ver aquí ). Así que toda la aritmética en tus ecuaciones no es aritmética ordinaria de números enteros o números reales; hay que hacerlo mod p. Consulte http://en.wikipedia.org/wiki/Modular_arithmetic . Para sumas, restas y multiplicaciones, puede usar la aritmética de enteros ordinaria y calcular el resto mod p al final. Para la división, necesitará algo como el algoritmo euclidiano extendido. Por supuesto, también deberá usar aritmética de precisión arbitraria si aún no lo ha hecho, ya que los números de este tamaño son demasiado grandes para los tipos estándar de C++ como long inty double.

Entonces, ¿básicamente no existe un método simple y corto para lograr esto?
No, no creo que haya atajos que lo simplifiquen mucho más de lo que ya has leído. En particular, no puede evitar el uso de la aritmética modular.