Clave privada de Bitcoin, ubicación en la curva ECC

En el algoritmo ECDSA, la clave privada de Bitcoin es supuestamente un punto en el gráfico (¿o lo es?). Pero la clave privada es un solo número entero, y no las coordenadas x, y. ¿Es el entero, por sí mismo, el valor x o el valor y? Si es x, entonces ¿cuál es y? Si es y, entonces, ¿cuál es x?

La clave pública es un punto, la clave privada es un número entero.
Entonces, ¿qué es la "P" (tenga en cuenta la P mayúscula, no la minúscula, por lo que no es el número primo para modificar)? Casi todos los gráficos que veo que muestran la conversión de la clave privada a la clave pública muestran una "P" y una "Q". Si P = 9 (solo un número entero) y Q = 14,5, ¿cómo se obtiene la clave pública o cuál sería? Parece que no puedo encontrar un ejemplo que funcione.
Le sugerí que consulte certicom.com/index.php/ecc-tutorial en otro hilo. P, Q generalmente denotan puntos y deben tener dos coordenadas.

Respuestas (2)

La operación básica de la curva elíptica es la suma de puntos. La operación de aplicar esta suma repetidamente se llama multiplicación escalar de un punto por un número entero.

La clave privada es el 'escalar', el punto que se multiplica es el punto 'Generador', el resultado es la clave pública.

La multiplicación escalar es básicamente una suma repetida. Multiplicar el punto Generador por 5 significa: calcular G+G+G+G+G.

Calcula esto calculando primero G2= G+G, luego G4=G2+G2, luego G5=G4+G.

La fórmula de la curva

La fórmula para la curva utilizada por los cálculos de bitcoin es la siguiente:

y^2 == x^3 + 7   ( mod p )

dóndep = 2^256 - 2^32 - 977

Puntos en la curva

un punto (x,y) está en la curva si coincide con la ecuación anterior

Adición de curvas

La adición de curvas se visualiza mejor geométricamente

suma de curvas

imagen de certicom

La criptografía de curva elíptica no utiliza valores de punto flotante para sus coordenadas, todos los cálculos se realizan en números enteros módulo un primo grande (mencionado anteriormente, llamado p). Pero el método para calcular la suma de 2 puntos sigue siendo el mismo.

agregando puntos

Sume los puntos P1=(x1,y1) y P2=(x2,y2), dando como resultado Psum= (xsum, ysum)

slope = (y1-y2)/(x1-x2)
xsum = slope^2 - (x1+x2)
ysum = slope*(x1-xsum)-y1

duplicación de puntos

si P1 y P2 son el mismo punto, la fórmula de suma anterior implicaría una división por cero, por lo que se necesita una fórmula diferente para calcular P+P

slope = 3 * x^2 / (2*y)
xdbl = slope^2 - 2*x
ydbl = slope *(x-xdbl)-y

claves ecdsa

GPara ECDSA se eligió un punto generador .

La clave privada es solo un número entero, nómbrelo k. La clave pública es el punto generador agregado a sí mismo kvarias veces. En otras palabras, multiplicado por k.

Si elige imprudentemente su clave privada, digamos 1, su clave pública sería igual al punto generador, esta dirección: 1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm

Como puede ver, incluso se usó recientemente.

Lo que hace que ECDSA sea un sistema criptográfico útil es que es fácil calcular una clave pública a partir de una clave privada, pero no al revés. Otra forma de expresar esto es que la multiplicación es fácil, pero no existe un algoritmo de división (fácil) en una curva elíptica.

Código de ejemplo

Ver esta esencia para un ejemplo en python

Todo el código y las ecuaciones que leí para la suma y multiplicación de puntos requieren dos conjuntos de coordenadas x e y (no muestran cómo trabajar solo con el número entero) que dan como resultado una tercera coordenada x, y. Dado que se supone que la clave privada es una de esas, ¿cómo la convierto en la coordenada x, y?
@Mine: como se explicó, la clave privada es un número entero (módulo el primo p). Lo multiplicas por el punto generador G para obtener la clave pública. La multiplicación es suma repetida. Por ejemplo, si la clave privada es 9, la clave pública es G+G+G+G+G+G+G+G+G. Usas la fórmula de suma de puntos para eso. Para hacerlo más eficiente, usa una variante de "exponenciación al cuadrado": calcula 2G = G + G, 4G = 2G + 2G, 8G = 4G + 4G, 9G = 8G + G.
... Entiendo que y1 y x1 son Gx y Gy, pero su sección de "suma" muestra dos x y dos y, sin especificar de dónde provienen. En ese punto de su ecuación, la única coordenada x,y que puedo ver es Gx y Gy.
@Mine Vamos a intentarlo de nuevo. Digamos que su clave privada es el número 3. Su clave pública es 3G. ¿Cómo calculamos eso? Primero necesitas calcular 2G. Entonces usas la fórmula que William describe para la duplicación de puntos, que solo necesita un par (x_1, y_1) como entrada y produce un nuevo par (x_2, y_2) como salida. El primer par representa G y el segundo par representa 2G. Ahora usa la fórmula de adición de William con estos dos países como entrada para producir 2G+G, que es 3G, su clave pública. Si su clave pública es un número entero más grande, tendrá que hacer esto muchas veces, como lo describió Meni.
Entiendo que lo hago varias veces, pero parece que no puedo obtener las ecuaciones correctas ni una sola vez. ¿Alguien sabe de una buena calculadora en línea (o diablos, una calculadora gratuita) que pueda hacer estas cosas sin notación científica? He ejecutado la ecuación varias veces y ni siquiera puedo hacerlo bien con una clave privada de 2 o 3. Uso la calculadora científica web 2.0, pero parece hacer cosas extrañas, como no seleccionar siempre el número completo cuando estoy copiando y pegando
@Mine: Tal vez lo que tiene problemas es que agregar un punto a sí mismo es un caso límite, que usa una fórmula diferente que para agregar dos puntos diferentes. Busque la fórmula para agregar un punto a sí mismo (duplicar el punto) para la curva elíptica y estará bien (esta fórmula aparece en la respuesta de Willem).
En realidad, es posible que hayan resuelto mi mayor problema, que era cómo aplicar las ecuaciones de multiplicación de puntos/suma de puntos antes de tener dos coordenadas x, y, me estaba confundiendo por completo. Esta inexactitud de los números resultantes es un nuevo desarrollo.
@Mine Si está utilizando alguna calculadora que trata los números como racionales de punto flotante, es imposible hacer aritmética mod p con eso. Necesita algo que maneje enteros de multiprecisión y pueda hacer aritmética modular. Sugerí "Sage" arriba.
@mine: ¿agradó el script de python que vinculé? muestra exactamente cómo hacer los cálculos.
@Willem Sí, lo hice. Sin embargo, ahora estoy más confundido (pero no necesariamente por eso). en.wikipedia.org/wiki/Elliptic_curve_point_multiplication no muestra "inverso" en la ecuación, pero su secuencia de comandos de python sí. Mi objetivo es poder hacer manualmente estas ecuaciones y he hecho la duplicación de puntos para la clave privada de bitcoin que es simplemente el número 2. ¡Funciona! Pero cuando trato de obtener las claves públicas para las claves privadas 3 y 4, no obtengo los resultados. ¿Quizás no entendí bien la aplicación de ecuaciones múltiples? Estoy usando el sitio web de Sagemath para los cálculos.
la función inverse() es para calcular el inverso modular de un número (módulo p), esto es como hacer una división multiplicando por el recíproco: a/b = a*(1/b)
@Willem Pero la página wiki no muestra que se esté usando y mi multiplicación funcionó sin ella. O lo hizo para la clave privada 2. ¿Cómo aplico estas ecuaciones para obtener la clave privada 3/4?
la página wiki muestra cómo se hace para curvas sobre números reales, no muestra específicamente cómo funciona el cálculo con aritmética modular.
Actualicé la esencia con más comentarios y los resultados del cálculo para 2, 3 y 4
@Willem tyvm, probablemente me llevará unos días repasar esto a fondo para asegurarme de que lo entiendo.
Aclaración menor al comentario de @MeniRosenfeld: la clave privada es un número entero en el rango 1, inclusive, al orden de la curva (para la curva secp256k1 de Bitcoin, mencionada nen el documento SEC 2), exclusivo.

La clave pública es un punto, la clave privada es un número entero de 256 bits. Sin embargo, en realidad no almacenamos el punto como x, y como parte de la clave pública, almacenamos x y el signo de y para ahorrar espacio.

Quiere decir que almacenamos la x y el signo de y en referencia a la clave pública, no a la clave privada, ¿verdad?
Correcto, he editado mi respuesta en ese sentido. La clave privada es solo un número entero de 256 bits, aunque parte del rango superior no es válido para nuestra curva.
Todas las ecuaciones para averiguar la clave pública muestran que el valor G x,y se multiplica por un valor x,y, no solo un número entero, ¿alguna idea de cómo convertir la clave privada en un valor x,y?
Quieres decir "x y el signo de y", ¿verdad?
en la multiplicación de puntos y la suma de puntos hay DOS valores de x y DOS valores de y que se requieren para obtener la clave pública. ¿Cómo, exactamente, obtienes el segundo conjunto de valores x, y cuando todo lo que tienes es una coordenada x, y (siendo Gx, Gy) y un número entero (clave privada)?