Hace unas semanas, Roger Ver, desarrollador blockchain y principal personalidad promotora de la propuesta de escalabilidad SegWit2x, fue entrevistado por el medio France 2 acerca de Bitcoin. En la entrevista, Ver ofreció $1000 dólares en Bitcoin Cash al espectador más rápido en escanear un código QR, imagen que fue censurada por France 2 al igual que la llave privada de esa dirección.
A pesar de esto, un grupo de desarrolladores informáticos se dio a la tarea de revelar el código QR a partir de la imagen borrosa, lo cuál lograron exitosamente a pesar de los inconvenientes.
Así lo detalló Michel Sassano, quien publicó su experiencia a través del portal freeCodeCamp de Medium. «Pudimos haber llamado a esta publicación ‘Cuán genial es el código QR y cómo recuperamos uno desde prácticamente nada’, pero es mucho más interesante cuando este código es la llave para una cartera de $1000 dólares de Bitcoin Cash», aseguró con humor.
Paso por paso, Sassano y su colega Clément Storck realizaron un análisis de imagen, luego se avocaron a reconstruir el estándar del QR en dos fases, para posteriormente decodificarlo y corregir dichos errores de código. Por último, utilizando el lenguaje de programación Python y técnicas de fuerza bruta, dieron con la completitud del código y la dirección blockchain que comunica.
I just published “Let’s Enhance ! How we found @rogerkver’s $1000 wallet obfuscated private key.” https://t.co/aNIzuAT3WI
— Michel Sassano (@SassanoM) 23 de octubre de 2017
Para aclarar la razón de por qué France 2 censuró la imagen, y ante las acusaciones de que France 2 optó por quedarse con los BCH en cuestión, Sassano asegura que esto se debió a obligaciones legales; aunque si asegura que solamente quienes grabaron la entrevista pudieron haber reclamado los criptoactivos. También, asegura que por mucho que se intente, no se podría escanear el código QR de ninguna manera dado que el desenfoque lo impide.
A pesar de esto, al final de la entrevista mostraron una pequeña parte del código, por error o no, pero esto les dio una pista a seguir para descifrar la imagen. Contrario a lo que se cree, la fuerza bruta no es lo único que utilizaron para este fin, pues funcionó analizar gráficamente la imagen a partir de ese punto.
Por tanto, inicialmente recabaron todas las pistas gráficas disponibles, como un rompecabezas, analizando el video cuadro por cuadro, descubriendo también parte de la llave privada y su formato, así como detectar que el código tenía un formato de 41 x 41 pixeles. La llave privada fue creada con la herramienta Single Wallet de Bitcoin.com, develando a su vez que la dirección estaría conformada por 52 caracteres.
Luego de unir los fragmentos censurados, lograron dar con esta imagen y descubrir que la última letra de la llave privada es una ‘V’.
El patrón del código fue construido poco a poco por medio de haber determinado diferentes datos al respecto del mismo gracias a la consulta de los fundamentos para crear códigos QR.
Luego de determinar que el tipo de código era de 8-bit Byte, llega el momento de aplicar el Error Correction Code (ECC), un protocolo estipulado por ISO y un conjunto de técnicas que permitirían reconstruir los datos originales y eliminar los errores de creación de código.
Los códigos QR se componen de bloques que representan palabras clave de datos y palabras clave de ECC. Cada bloque pesa 8 bits y cada bit está representado por un cuadros negros o blancos que lo conforman visualmente. Sin embargo, no se podría determinar si un cuadrado representa un 0 o un 1 en código binario, pues antes de renderizar el código se le aplica una máscara que refuerza la seguridad del QR.
Para producir las palabras clave ECC, los códigos QR implementan el protocolo Reed-Solomon, que es el residuo (Remanente? Cuál era la palabra correcta?) de una división efectuada entre el polinomio que representa el mensaje y un generador irreductible de código. El decodificador Reed-Solomon permite revelar las partes borrosas y errores de un código QR al mismo tiempo, aunque tiene un límite llamado Singleton Bound, desde el cuál los esfuerzos serán infructuosos y se deberá utilizar la fuerza bruta para decodificar los ECC.
Junto con las pistas recabadas y estos métodos, redujeron a la mitad las posibilidades de revelar el código por medio de la fuerza bruta, por lo que llegaba el momento de emplear esa técnica. Junto al lenguaje de programación Python y el método Reed-Solomon, dieron con todas las palabras clave, que luego convirtieron al sistema binario e insertaron en el generador de código, para así después de media hora y 838,849 intentos de cómputo, dieron finalmente dar con la llave privada de la dirección: KyUzsRudpNkLKeV2815KV9EzRf7EG1kPivwnQhZrvZEwhKrbF7CV
Y finalmente, el código enteramente restaurado:
La principal lección de esta experiencia es la de proteger al máximo las llaves privadas de acceso a una dirección blockchain, pues aunque no es una tarea que cualquiera pueda realizar, aquellos que tengan el minimo rastro para dar con esa llave, tiene posibilidades de encontrarla.