Mastering Bitcoin

Mastering Bitcoin


6. Claves, Direcciones, Carteras » Introducción » Generando una Clave Pública

Página 28 de 98

6. Claves, Direcciones, Carteras

Introducción

La propiedad de bitcoins se establece a través de claves digitales, direcciones bitcoin, y firmas digitales.

Las claves digitales no son almacenadas realmente en la red, sino que son creadas y almacenadas por usuarios en un archivo o simple base de datos llamada cartera (wallet). Las claves digitales en la cartera de un usuario son completamente independientes del protocolo bitcoin y pueden ser generadas y administradas por el software de cartera del usuario sin referencia alguna a la cadena de bloques o acceso a Internet. Las claves habilitan muchas de las propiedades interesantes de bitcoin, incluyendo la confianza descentralizada y el control, comprobación de propiedad, y el modelo de seguridad de pruebas criptográficas.

Cada transacción bitcoin requiere una firma válida para ser incluida en la cadena de bloques, la cual puede generarse con claves digitales válidas; por lo tanto, quien posea una copia de dichas claves tendrá control de los bitcoins en esa cuenta. Las claves vienen en pares, consistiendo de una clave privada (secreta) y una clave pública. Imagine la clave pública como si fuera el número de una cuenta bancaria y la clave privada el PIN secreto o la firma en un cheque que proporciona control sobre la cuenta. Estas claves digitales son rara vez vistas por los usuarios de bitcoin. Normalmente se almacenan dentro del archivo cartera y son administradas por el software de cartera bitcoin.

En la parte del pago de una transacción bitcoin, la clave pública del destinatario es representada por su huella digital, llamada una dirección bitcoin, la cual es usada de igual forma que el nombre del beneficiario en un cheque (i.e., «Páguese a la orden de…»). En la mayoría de los casos una dirección bitcoin se genera a partir de y corresponde a una clave pública. Sin embargo, no todas las direcciones bitcoin representan una clave pública; también pueden representar otros beneficiarios tales como scripts, como veremos más tarde en este capítulo. De esta forma las direcciones bitcoin abstraen al destinatario de los fondos, flexibilizando el destino de las transacciones, de forma similar a los cheques en papel: un único instrumento de pago que puede ser usado para pagar a cuentas de personas, compañías, pagar facturas o pagar por efectivo. La dirección bitcoin es la única representación de las claves que los usuarios ven rutinariamente ya que esta es la parte que necesitan compartir con el mundo.

En este capítulo presentaremos carteras, las cuales contienen claves criptográficas. Echaremos un vistazo a cómo las claves son generadas, almacenadas y administradas. Analizaremos los varios formatos de codificación utilizados para representar claves privadas y públicas, direcciones y direcciones script. Finalmente veremos usos especiales de claves: para firmar mensajes, probar propiedad y crear direcciones de vanidad (vanity addresses) y carteras de papel (paper wallets).

Criptografía de Clave Pública y Criptomonedas

La criptografía de clave pública fue inventada en la década de 1970 y es la base matemática de la seguridad informática.

Desde la invención de la criptografía de clave pública, se han descubierto varias funciones matemáticas adecuadas, tales como exponenciación de números primos y multiplicación de curvas elípticas. Estas funciones matemáticas son prácticamente irreversibles, lo cual significa que son fáciles de calcular en una dirección e inviables de calcular en la dirección opuesta. Basada en estas funciones matemáticas, la criptografía permite la creación de secretos digitales y firmas digitales infalsificables.

Bitcoin utiliza la multiplicación de curvas elípticas como base para su criptografía de clave pública.

En bitcoin utilizamos la criptografía de clave pública para crear un par de claves que controla el acceso a los bitcoins. El par de claves consiste en una clave privada y —derivada de esta última— una clave pública única. La clave pública se usa para recibir bitcoins, y la clave privada se usa para firmar transacciones y gastar dichos bitcoins.

Existe una relación matemática entre las claves pública y privada que permiten que la clave privada sea utilizada para generar firmas en mensajes. Estas firmas pueden ser validadas contra la clave pública sin necesidad de revelar la clave privada.

Cuando los bitcoins son gastados el dueño actual de los bitcoins presenta su clave pública y firma (diferente cada vez, pero creada a partir de la misma clave privada) en una transacción para gastar esos bitcoins. A través de la presentación de la clave pública y firma, todos los participantes en la red bitcoin pueden verificar y aceptar la transacción como válida, confirmando que la persona que transfiere los bitcoins los posee al momento de la transferencia.

En la mayoría de las implementaciones de carteras las claves privadas y públicas son almacenadas juntas como pares de claves por conveniencia. Sin embargo la clave pública puede calcularse a partir de la clave privada, por lo que almacenar únicamente la clave privada también es posible.

Claves Privadas y Públicas

Una cartera bitcoin contiene una colección de claves, cada una compuesta de una clave privada y una pública. La clave privada (k) es un número, generalmente elegido aleatoriamente. A partir de la clave privada utilizamos multiplicación de curva elíptica, una función criptográfica de sentido único, para generar la clave pública (K). A partir de la clave pública (K) utilizamos una función de hash criptográfica de sentido único para generar la dirección bitcoin (A). En esta sección comenzaremos por generar una clave privada, echar una mirada a la matemática de curva elíptica usada para covertirla en una clave pública, y finalmente generar una dirección bitcoin a partir de la clave pública. La relación entre clave privada, clave pública y dirección bitcoin se ilustra en Clave privada, clave pública y dirección bitcoin.

Figura 1. Clave privada, clave pública y dirección bitcoin

Claves Privadas

Una clave privada es simplemente un número escogido al azar. La propiedad y control de una clave privada es la raíz del control del usuario sobre los fondos asociados con la dirección bitcoin correspondiente. La clave privada se usa para crear las firmas requeridas para gastar bitcoins demostrando la pertenencia de los fondos usados en una transacción. La clave privada debe permanecer en secreto en todo momento, ya que revelarla a terceros es el equivalente a darles el control sobre los bitcoins asegurados por dicha clave. También deben hacerse copias de respaldo de las claves privadas para protegerlas de pérdidas accidentales, ya que si se pierde no puede ser recuperada y los fondos asegurados por ella se perderán para siempre.

La clave privada bitcoin es simplemente un número. Puedes elegir tu clave privada aleatoriamente usando simplemente una moneda, papel y lápiz: arroja la moneda 256 veces y tendrás los dígitos binarios de una clave privada aleatoria que puedes usar en una cartera bitcoin. La clave pública puede luego ser generada a partir de la clave privada.

Generando una clave privada a partir de un número aleatorio

El primer y más importante paso en la generación de claves privadas es encontrar una fuente de entropía o azar segura. Crear una clave bitcoin es esencialmente lo mismo que «elegir un número entre 1 y 2256». El método exacto utilizado para elegir tal número no importa siempre y cuando no sea predecible ni repetible. El software bitcoin utiliza los generadores de números aleatorios del sistema para generar 256 bits de entropía (azar). Usualmente el generador de números aleatorios del sistema operativo es inicializado por una fuente humana de azar, lo cual es la razón por la que puede que te solicite que muevas tu ratón durante algunos segundos. Para los verdaderamente paranoicos nada vence a un dado, papel y lápiz.

Más precisamente, la clave privada puede ser cualquier número entre 1 y n - 1, donde n es una constante (n = 1,158 * 1077, poco menos que 2256) definida como el orden de la curva elíptica usada en bitcoin (ver Criptografía de Curva Elíptica Explicada). Para crear tal clave elegimos un número de 256 bits y verificamos que sea menor a n - 1. En términos de programación, esto es generalmente se logra alimentando una cadena más grande de bits aleatorios, recolectada a partir de una fuente de aleatoriedad criptográficamente segura, en un algoritmo de hash SHA256 que convenientemente producirá un número de 256 bits. Si el resultado es menor a n - 1 hemos obtenido una clave privada apropiada. De lo contrario, simplemente lo intentamos nuevamente con otro número aleatorio.

No crees tu propio código para generar un número aleatorio ni uses un generador de números aleatorios «simple» ofrecido por tu lenguaje de programación. Utiliza una fuente de números pseudoaleatorios criptográficamente segura (FNPACS) con una semilla a partir de una fuente de entropía suficiente. Estudia la documentación de la biblioteca de generación de números aleatorios que elijas para estar seguro de que sea criptográficamente segura. La correcta implementación de una FNPACS es crítica para la seguridad de las claves.

La siguiente es una clave privada (k) generada aleatoriamente, mostrada en formato hexadecimal (256 dígitos binarios representados en 64 dígitos hexadecimales, cada uno con 4 bits):

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

El tamaño del espacio de claves privadas bitcoin, 2256 es un número inimaginablemente grande. Es aproximadamente 1077 en decimal. Se estima que el universo visible contiene 1080 átomos.

Para generar una clave nueva con el cliente Bitcoin Core (ver capítulo 5) usa el comando getnewaddress. Por razones de seguridad muestra solamente la clave pública, no la clave privada. Para pedir a bitcoind que exhiba la clave privada usa el comando dumpprivkey. El comando dumpprivkey muestra la clave privada en formato codificado en Base58 con checksum, Formato de Importación de Cartera (Wallet Import Format, o WIF), el cual examinaremos en mayor detalle en Formatos de claves privadas. Aquí hay un ejemplo de generación y exhibición de una clave privada usando estos dos comandos:

$ bitcoind getnewaddress

1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

$ bitcoind dumpprivkey 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

El comando dumpprivkey abre una cartera y extrae la clave privada que fue generada por el comando getnewaddress. No es posible para bitcoind conocer la clave privada a partir de la clave pública a menos que estén ambas almacenadas en la cartera.

El comando dumpprivkey no está generando una clave privada a partir de una clave pública, ya que esto es imposible. El comando simplemente revela la clave privada ya conocida por la cartera, la cual ha sido generada por el comando getnewaddress.

También puedes usar la herramienta de línea de comando Bitcoin Explorer (ver apartado al efecto) para generar y mostrar claves privadas con los comandos seed, ec-new y ec-to-wif:

$ bx seed | bx ec-new | bx ec-to-wif

5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

Claves Públicas

La clave pública es generada a partir de la clave privada usando multiplicación de curva elíptica, la cual es irreversible:

(K = k * G)

Donde k es la clave privada, G es un punto constante llamado el punto generador y K es la clave pública resultante. La operación inversa, conocida como «encontrando el logaritmo discreto», es calcular k a partir de K y es tan difícil como probar todos los valores de k, es decir, una búsqueda por fuerza bruta. Antes de demostrar cómo generar una clave pública a partir de una clave privada, echemos una mirada a la criptografía de curva elíptica en más detalle.

Criptografía de Curva Elíptica Explicada

La criptografía de curva elíptica es un tipo de criptografía asimétrica o de clave pública basada en el problema del logaritmo discreto tal como se expresa por suma y multiplicación sobre puntos de una curva elíptica. Una curva elíptica es un ejemplo de una curva elíptica, similar a las usadas por bitcoin.

Figura 2. Una curva elíptica

Bitcoin usa una curva elíptica específica y un conjunto de constantes matemáticas definidas en un estándar llamado secp256k1, establecido por el Instituto Nacional de Estándares y Tecnología (National Institute of Standards and Technology, o NIST). La curva secp256k1 es definida por la siguiente función, la cual produce una curva elíptica:

ó

El mod p (módulo del número primo p) indica que la curva se encuentra sobre un cuerpo finito de orden p, también escrito como \(\mathbb{F}_p\), donde p = 2256 – 232 – 29 – 28 – 27 – 26 – 24 – 1, un número primo muy grande.

Figura 3. Criptografía de curva elíptica: visualizando una curva elíptica sobre F(p), con p=17

Ya que la curva se encuentra definida sobre un cuerpo finito de orden primo en vez de sobre los números reales, se ve como un patrón de puntos dispersos en dos dimensiones, lo cual lo vuelve difícil de visualizar. Sin embargo, la matemática es idéntica a la de la curva elíptica sobre los números reales. Como ejemplo, Criptografía de curva elíptica: visualizando una curva elíptica sobre F(p), con p=17 muestra la misma curva elíptica sobre un cuerpo finito mucho menor de orden primo 17, mostrando un patrón de puntos sobre una cuadrícula. La curva elíptica de bitcoin secp256k1 puede pensarse como un patrón mucho más complejo de puntos sobre una cuadrícula inconmensurablemente grande.

Así que, por ejemplo, el siguiente es un punto P con coordenadas (x,y) que es un punto en la curva secp256k1. Puedes verificar esto tú mismo usando Python:

P = (55066263022277343669578718895168534326250603453777594175500187360389116729240, 32670510020758816978083085130507043184471273380659243275938904335757337482424)

Python 3.4.0 (default, Mar 30 2014, 19:23:13)

[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.38)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> p =

>>> x = 55066263022277343669578718895168534326250603453777594175500187360389116729240

>>> y = 32670510020758816978083085130507043184471273380659243275938904335757337482424

>>> (x ** 3 + 7 - y**2) % p

0

En matemática de curva elíptica existe un punto llamado el «punto al infinito», el cual corresponde al rol de 0 en la suma. En computadores a veces es representado como x = y = 0 (lo cual no satisface la ecuación de la curva elíptica, pero es un caso aislado simple que puede ser chequeado).

Existe también un operador + llamado «suma», el cual posee ciertas propiedades similares a la suma tradicional de números reales que aprenden los niños en la escuela. Dados dos puntos P1 y P2 sobre una curva elíptica, existe un tercer punto P3 = P1 + P2, también sobre la curva.

Geométricamente, este tercer punto P3 es calculado dibujando una línea entre P1 y P2. Esta línea intersecará la curva elíptica en exactamente un punto adicional. Llamemos a este punto P3' = (x, y).

Luego reflejamos el eje x para obtener:

P3 = (x, –y)

Existen un par de casos especiales que explican la necesidad del «punto al infinito».

Si P1 y P2 son el mismo punto, la línea «entre» P1 y P2 debe extenderse para ser la tangente sobre la curva en el punto P1. Esta tangente intersecará la curva en exactamente un nuevo punto. Puedes usar técnicas de cálculo para determinar la pendiente de la línea tangencial. Estas técnicas curiosamente funcionan a pesar de estar restringiendo nuestro interés a puntos sobre la curva con coordenadas de dos enteros.

En algunos casos (esto es, si P1 y P2 tienen el mismo valor en x pero distinto valor en y) la línea tangente será exactamente vertical, en cuyo caso P3 = «punto al infinito».

Si P1 es el «punto al infinito», entonces la suma P1 + P2 = P2. Similarmente, si P2 es el punto al infinito, entonces P1 + P2 = P1. Esto muestra que el punto al infinito juega el rol de 0.

Resulta que + es asociativo, lo cual significa que (A + B) + C = A + (B + C). Eso significa que podemos escribir A + B + C sin paréntesis y sin ninguna ambigüedad.

Ahora que hemos definido la suma podemos definir la multiplicación en la forma estándar en que extiende a la suma. Para un punto P sobre la curva elíptica, si k es un número entero, entonces kP = P +

P + P + … + P (k veces). Nótese que k es a veces llamada una «exponente» en este caso, lo cual puede causar confusión.

Generando una Clave Pública

Comenzando con una clave privada en la forma de un número k generado aleatoriamente, lo multiplicamos por un punto predeterminado de la curva llamado punto generador G para producir otro punto en algún otro punto de la curva, el cual será la clave pública K correspondiente. El punto generador es especificado como parte del estándar secp256k1 y es siempre el mismo para todas las claves en bitcoin donde k es la clave privada, G es el punto generador, y K es la clave pública resultante, un punto sobre la curva. Ya que el punto generador es siempre el mismo para todos los usuarios de bitcoin, una clave privada k multiplicada por G siempre dará como resultado la misma clave pública K. La relación entre k y K es fija, pero solo puede ser calculada en una dirección, de k a K. Esa es la razón por la que una dirección bitcoin (derivada de K) puede ser compartida con cualquiera sin revelar la clave privada (k) del usuario.

Una clave privada puede ser convertida a una clave pública, pero una clave pública no puede ser convertida en una clave privada ya que la matemática solo funciona en un sentido.

Para implementar la multiplicación de curva elíptica tomamos la clave privada k generada previamente y la multiplicamos por el punto generador G para encontrar la clave pública K:

K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G

La Clave Pública K se define como el punto K = (x,y):

K = (x, y)

donde,

x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A

y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

Para visualizar la multiplicación de un punto y un entero usaremos la más sencilla curva elíptica sobre los números reales. Recuerda, la matemática es la misma. Nuestro objetivo es encontrar el múltiplo kG del punto generador G. Eso es lo mismo que sumar G a sí mismo k veces consecutivas. En curvas elípticas sumar un punto a sí mismo es el equivalente a dibujar una línea tangente sobre el punto y hallar dónde interseca la curva nuevamente y luego reflejar ese punto sobre el eje x. Criptografía de curva elíptica: Visualizando la multiplicación de un punto G por un entero k sobre una curva elíptica muestra el proceso de derivar G, 2G, 4G, como una operación geométrica sobre la curva.

Figura 4. Criptografía de curva elíptica: Visualizando la multiplicacion de un punto G por un entero k sobre una curva elíptica

La mayoría de las implementaciones bitcoin usan la biblioteca criptográfica OpenSSL para realizar los cálculos de curva elíptica. Por ejemplo, para derivar la clave pública se usa la función EC_POINT_mul().

Ir a la siguiente página

Report Page