Generar una billetera de papel gratuita de Bitcoin con la clave privada para gastar y la dirección pública para recibir. Instrucciones de uso y seguridad
La clave privada es un número aleatorio de 256 bits (32 bytes) generado aleatoriamente. Lanzamos una moneda 256 veces: si sale cara apuntamos 1 y si sale cruz anotamos 0. Además tiene que ser mayor que cero y menor que el orden del punto generador de secp256k1.
Para convertirla a hexadecimal agrupamos este código binario (ceros y unos) en bloques de 4 bits y obtenemos 64 caracteres en base 16 (números del 0-9 y letras de la A-F)
Añadimos un byte como prefijo 80 (red principal de Bitcoin) y añadimos otro byte como sufijo 01 (clave pública derivada será comprimida). Ahora tendremos 32 bytes de clave privada + 1 byte (80) + 1 byte (01) = 34 bytes o 68 caracteres.
Se procesa la cadena hexadecimal extendida a través de dos rondas consecutivas del algoritmo SHA-256. Obtenemos un resumen de 32 bytes de los cuales los primeros 8 caracteres (4 bytes) del segundo resultado actúan como código de verificación.
Se añade el checksum al final de la clave hexadecimal extendida. Esto dará como resultado una cadena hexadecimal de 76 caracteres (38 bytes). Todo el bloque hexadecimal resultante se codifica a Base58 (alfabeto sin caracteres ambiguos como O, 0, l, I) para hacerla más corta y fácil de leer.
La clave privada hexadecimal se usa como un escalar matemático que multiplica a un punto base fijo (punto generador) en la curva elíptica. Obtenemos un punto (X,Y) -clave pública- en la curva elíptica. La forma comprimida almacena la coordenada X junto con el prefijo 02 o 03 que indica si la coordenada Y es par o impar(66 caracteres hexadecimales - 33 bytes-)
Para reducir el tamaño del identificador y evitar exponer directamente la clave pública, la clave pública se pasa por un SHA-256 binario y el resultado inmediatamente por RIPEMD-160. Obtenemos el HASH160, que servirá como base para construir la dirección Bitcoin.
Calculamos el Checksum: agrupamos el hash160 (20 bytes = 160 bits) en grupos de 5 bits (base 32) y obtenemos 32 valores con rangos de 0 a 31. Añadimos el prefijo 0 para indicar Native SegWit P2WPKH (versión 0) y ahora tenemos 33 valores. El prefijo bc entra en juego: se divide el valor ASCII de cada letra (b=98, c=99) en sus 3 bits superiores y 5 bits inferiores resultando con el separador intermedio 0 el vector [3, 3, 0, 2, 3]. Añadimos como prefijo estos 5 valores a los 33 que teníamos y resultan 38 valores. Además añadimos seis ceros al final (espacio reservado para el checksum) resultando 44 valores en base 32. La función matemática Polymod BCH procesa esta lista mediante una división polinómica usando un polinomio generador específico y obtenemos un número entero de 30 bits al que le aplicamos un XOR con la constante 0x3fffffff dándonos el residuo polinomial final de 30 bits, lo agrupamos en 6 bloques independientes de 5 bits cada uno y convertimos a base 32 dándonos el resultado el Checksum (6 valores en base 32).
Transformamos los 39 valores en base 32 (33 iniciales + checksum) a texto utilizando la tabla de sustitución oficial de caracteres de Bitcoin [BIP 173] Alfabeto Bech32 siendo el primer valor 0 => q (versión de testigo) y ponemos como prefijo bc1 (42 caracteres).