Claves Públicas
¿Qué es una clave pública?
Una clave pública es la contraparte de una clave privada.
Y, al igual que una clave privada, se muestra como una cadena hexadecimal.
Por ejemplo:
03e8375e9ef326c8e5b3f7c7366edc07a45939a6f48559614a1e18d644838b3390
Si no acortáramos esta clave pública a una dirección, este sería el "número de cuenta" al que enviarías bitcoins al hacer una transacción.
En fin, aquí está la parte interesante: tu clave pública se calcula a partir de tu clave privada.
¿Cómo obtienes una clave pública a partir de una clave privada?
Insertas una clave privada en una función matemática especial, y el resultado es una clave pública.
¿Qué función es esa?
Se llama multiplicación de curva elíptica.
Esto básicamente implica "rebotar" por el gráfico de una curva elíptica hasta que llegas a un conjunto final de coordenadas en el gráfico, y esas coordenadas resultantes son tu clave pública.
Será más fácil si te lo enseño...
¿Cómo es una curva elíptica?
Así:
Además, la curva elíptica usada en Bitcoin viene con un punto de partida específico.

Llamamos a ese punto de partida punto generador (G).
Y si fuéramos a hacer alguna "multiplicación" en esa curva (por ejemplo: "multiplicar" el punto de partida por 2), nos moveríamos por la curva así.

El hecho de que podamos trazar una tangente en cualquier lugar de la curva y que cruce un otro punto de la curva es una característica especial de las curvas elípticas.
Y ahí lo tienes. Acabamos de "multiplicar" la coordenada de partida G por 2 y encontramos la posición de la coordenada final 2G.
Esta es una ronda de multiplicación de curva elíptica.
¿Cómo creas una clave pública?
En el ejemplo anterior, multiplicamos G por 2 para obtener 2G.
Para obtener una clave pública, multiplicamos G por nuestra clave privada.
clave privada = b7ed7443c993af9937d9c869398bf4ed5f9523129e25dfb77ce4767fba405014
clave privada = 83192796475211405656707086712046461363785842576052176596271883290902735638548
clave pública = 83192796475211405656707086712046461363785842576052176596271883290902735638548 * G
EC Multiply
O, en otras palabras, "rebota por la curva elíptica un número de veces igual a la clave privada".
El punto final de descanso en la curva elíptica te dará un conjunto de coordenadas, y esas coordenadas forman la clave pública.
Entonces, si estas son las coordenadas a las que llegamos después de multiplicar G por nuestra clave privada:
x = 105034410509315626961767289640948690310492512927262445783804994734160408687504
y = 5516217054127125049495563880590479521608770728790951769271312566909207073125
Entonces todo lo que tenemos que hacer es convertir ambas a hexadecimal y unirlas...
clave pública (x) = e8375e9ef326c8e5b3f7c7366edc07a45939a6f48559614a1e18d644838b3390
clave pública (y) = 0c32117641c797f724e7435bc574cfc5f04aa560394af1efec8772f1a0505165
clave pública (x,y) = e8375e9ef326c8e5b3f7c7366edc07a45939a6f48559614a1e18d644838b33900c32117641c797f724e7435bc574cfc5f04aa560394af1efec8772f1a0505165
Clave Pública
¡Y listo! ¡Una clave pública!
Claves Públicas Comprimidas
Para ahorrar espacio, las claves públicas (hoy en día) usan solo la coordenada x completa.
Esto es porque la curva elíptica es una ecuación (y² = x³ + 7), lo que significa que, si tienes la coordenada x, puedes calcular la coordenada y correspondiente.
Sin embargo, debido a la parte y² de la ecuación, y puede ser un número positivo o negativo:
Así que la única información extra que necesitas para encontrar la coordenada y correcta es saber si está arriba o abajo del eje x. Y debido a cómo funcionan las curvas elípticas:
- Si
yes par, está arriba del eje x. - Si
yes impar, está abajo del eje x.
Así que, en lugar de tener que almacenar tanto la coordenada x como la y completas, puedes guardar solo la coordenada x completa y si la coordenada y es par o impar.
En Bitcoin, la polaridad de la coordenada y se representa con un prefijo:
02= par03= impar
Así que, mientras una clave pública no comprimida a la antigua empieza con 04, una clave pública comprimida empieza con 02 o 03:
clave pública (no comprimida) = 04e8375e9ef326c8e5b3f7c7366edc07a45939a6f48559614a1e18d644838b33900c32117641c797f724e7435bc574cfc5f04aa560394af1efec8772f1a0505165
clave pública (comprimida) = 03e8375e9ef326c8e5b3f7c7366edc07a45939a6f48559614a1e18d644838b3390
Mucho más corta.
Parece mucho esfuerzo para ahorrar una pequeña cantidad de datos, pero, como las claves públicas se usan en casi todas las transacciones, esto termina ahorrando mucho espacio en la blockchain con el tiempo.
¿Por qué usamos multiplicación de curva elíptica para crear claves públicas?
Porque las curvas elípticas tienen dos propiedades útiles al crear un par de claves privada/pública.
- La multiplicación de curva elíptica es una "función trampa" (trapdoor). En otras palabras, no puedes volver de la clave pública para descubrir cuál era la clave privada.
Una función trampa es una función fácil de calcular en una dirección, pero difícil de calcular en la dirección opuesta (encontrar su inversa) sin una información especial llamada "trampa".
-
La clave pública tiene una conexión matemática con la clave privada. Como resultado, es posible probar esa conexión (con un poco más de matemática) sin tener que revelar tu clave privada.
Así que, si te doy mi clave pública (o dirección), puedo probarte que la "poseo" sin tener que mostrarte mi clave privada.
Esta característica es especialmente útil al hacer transacciones de bitcoin. Tu clave pública puede ponerse en una transacción cuando quieres recibir bitcoins, y no necesitas revelar la clave privada directamente cuando quieres gastarlos después (véase firmas digitales). Como resultado, eso significa que nadie puede obtener la clave privada y usarla para gastar bitcoins bloqueados a esa misma clave pública.
Cuando digo probar que poseo una clave pública, quiero decir "mostrar que poseo la clave privada a partir de la cual se creó la clave pública".
¿Cómo puedes probar que posees una clave pública?
Este es un tema (o dos) completo por sí mismo. Pero, como esta es una pregunta tan irritantemente relevante, haré lo posible por cubrir lo básico.
Como se mencionó, hay una conexión matemática entre la clave privada y la clave pública.
Como resultado:
- Puedo pasar mi clave privada por más matemática de curva elíptica para obtener un nuevo valor (llamado firma digital).
- Puedo pasar mi clave pública por otra matemática de curva elíptica para obtener un nuevo valor.
Ahora habrá un pequeño solapamiento entre esos nuevos valores:
Y ese solapamiento es suficiente para probar que existe una conexión matemática entre la clave pública y la clave privada.
Y como nadie puede recrear esa firma digital sin la clave privada, mi firma digital es suficiente para probar que yo "poseo" la clave pública.
Como resultado, puedo mostrarte que poseo una clave pública con una firma digital, y tú nunca necesitas ver mi clave privada.
Conclusión
Alabada sea la curva elíptica.