La clave privada es un número aleatorio de 256 bits (32 bytes) generada 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 número total de puntos válidos en la curva secp256k1.
Para convertirla a hexadecimal agrupamos este 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 tenemos 68 caracteres (34 bytes) en nuestra cadena hexadecimal extendida.
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. Formato de importación de billetera.
La clave privada hexadecimal se usa como un escalar matemático que multiplica a un punto base fijo en la curva elíptica. Obtenemos un nuevo punto en la curva elíptica cuya coordenada Y es la clave pública a la cual añadimos el prefijo 02 o 03 según sea la coordenada Y par o impar, respectivamente. (66 caracteres hexadecimales - 33 bytes-)
Para economizar espacio y añadir seguridad, la clave pública se pasa por SHA-256 y el resultado por RIPEMD-160. Esto genera el Witness Program.
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 dando como 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).