Está en la página 1de 9

Fue una de las primeras formas de pago electrónico: el usuario tenía que retirar billetes del banco

y asignar claves (públicas y privadas) para enviarlas al destinatario.

De este modo, a los bancos y gobiernos les resultaba imposible localizar a los usuarios, ya que se
identificaban únicamente con una cadena alfanumérica.

¿Le recuerda a algo?

Lamentablemente, este método adolecía de centralización, ya que el banco tenía que emitir un
permiso para utilizar las claves, y, tras innumerables intentos de salvar la brecha, la empresa
quebró.

Pero este fue el comienzo de la revolución.

A partir de ese momento, entraron en escena personalidades muy importantes, como


● Adam Back
● Wei Dai
● Hal Finney
● Nick Szabo

Ya en 1997 circulaba el concepto de prueba de trabajo.

De hecho, Adam Back creó Hashcash, basado en la prueba de trabajo (PoW), con el fin de limitar el
spam de correo electrónico y los ataques DoS.

¿Cómo lo hizo? Dificultando la vida de los spammers, cuyo objetivo es enviar un gran número
correos electrónicos con muy poco coste por mensaje.

Gracias a su nuevo sistema, sin embargo, el destinatario podía verificar si el remitente había
realmente el PoW y utilizar los resultados para filtrar los correos electrónicos más fácilmente.

Al año siguiente, 1998, Wei Dai publicó el primer artículo en el que describía su idea de
criptomoneda, la b-money. Fue la primera criptomoneda anónima y distribuida.

Wei Dai desarrolló dos protocolos.

El primero se utilizaba para mantener una base de datos sincronizada, donde se registraba la
información relacionada con el medio de intercambio. Cada participante de la red tenía una copia
exacta de la misma. Esto es la descentralización.

El segundo se utilizó para contar la cantidad de money-b que se poseía. En 2004 Hal Finney creó
el RPoW, Reusable Proof of Work, basado en Hashcash. Permitía el intercambio de tokens y
garantizaba que cada token sólo pudiera gastarse una vez. Se llamó RPoW porque, además de
PoW, utilizaba criptografía asimétrica RSA11 para firmar las transacciones; de ahí el nombre de
RPoW.
No obstante, este proyecto adolecía de centralización, ya que las comprobaciones necesarias para
evitar el doble gasto eran realizadas por un servidor centralizado.

Ahora es el turno de Nick Szabo, que en 2005 publicó Bit Gold, basado en RPoW.

Bit Gold proponía un sistema descentralizado en el que los usuarios, gracias a su par de claves,
podían firmar las transacciones, utilizando la firma digital.

Aunque Bit Gold nunca ha visto la luz, es considerado por muchos como el precursor de Bitcoin.
Introdujo conceptos como la tolerancia a fallos bizantina, el sellado de tiempo y la resolución de
puzles criptográficos por parte de los usuarios. A diferencia de Bitcoin, esta moneda no habría
tenido una oferta, es decir, un número máximo de monedas en circulación.

Luego, en 2008, durante la crisis financiera, nació Bitcoin.

Parece que Satoshi Nakamoto había reunido todas las buenas características de los trabajos
descritos anteriormente y creó lo que todos conocemos como blockchain y Bitcoin.

Aún hoy desconocemos su verdadera identidad.

La revolución había nacido.

CENTRALIZACIÓN, DESCENTRALIZACIÓN P2P Y PROTOCOLO

A menudo oímos hablar de centralización, descentralización, distribución, redes P2P y protocolos.


Son conceptos realmente amplios que van más allá del alcance de este libro. Intentaremos
entender los conceptos clave y las diferencias.

Centralización

 Todas las operaciones son procesadas por un único nodo, es decir, un único ordenador.
 Cada individuo depende del libro mayor centralizado.
 Los datos se almacenan en una base de datos propietaria centralizada, por lo que tenemos
que confiar en la entidad con la que estamos interactuando, con respecto a la integridad y
validez de los datos.
Descentralizado

 No hay ninguna unidad de control central.


 Las operaciones son realizadas por múltiples nodos.
 Los datos se replican en múltiples nodos, múltiples servidores trabajan juntos para
proporcionar los datos solicitados.

Distribuido

 No hay ningún ordenador especializado para el almacenamiento de datos.


 Todos los nodos están al mismo nivel, es decir, tienen los mismos derechos.
 Los datos se replican en cada nodo.
 También se denominan redes sin confianza, porque no es necesario "confiar" en
un tercero, ya que la información se comparte.

¿Dónde se sitúa la cadena de bloques en este escenario?

Está políticamente descentralizada, no hay una entidad superior encargada del control. La
arquitectura también está descentralizada, ya que no hay ningún punto de fallo. Esto significa que
si un nodo se vuelve inalcanzable, el sistema sigue funcionando.

La lógica es centralizada, ya que existe un consenso común y en ese momento el sistema se


comporta como un único ordenador.

Ahora que estamos más familiarizados con los conceptos de distribución, descentralización y
centralización, vamos a intentar entender qué es una red P2P.

Todo el mundo, o al menos muchos de nosotros, probablemente recuerde Napster.

Napster era un programa que permitía el intercambio de música a través de la arquitectura P2P.

Podemos definir la red P2P como resistente y descentralizada. No hay nodos "especiales" y todos
tienen los mismos derechos.

Los nodos son los participantes de la red P2P.

Si replicáramos la red P2P en el mundo real, podríamos pensar en el sistema de votación


democrática, donde el voto de Marco tiene el mismo poder que el de Alessio.

Por lo tanto, podemos decir que el sistema P2P, o más bien la arquitectura P2P, es una
arquitectura igualitaria.
¿Qué es un protocolo?
Un protocolo es un conjunto de reglas que definen el modo de comunicación entre dos o más
entidades.

Criptografía
La palabra criptografía viene del griego y significa escritura secreta.
Puede utilizarse para cifrar mensajes, ocultando así su significado, o para
verificar que un mensaje no ha sido manipulado y que ha sido enviado por el remitente deseado.
remitente deseado.

Por el momento, en la cadena de bloques de Bitcoin los mensajes se transmiten sin codificar, por
lo que no hay ningún tipo de cifrado. En cambio, la firma digital (Algoritmo de Firma Digital de
Curva Elíptica ECDSA) se utiliza para verificar que el mensaje, es decir, la transacción, fue
realmente realizada por el propietario de las claves.

Antes de continuar, es necesario entender el significado de algunas palabras utilizadas durante


este capítulo:

 Cifrado: es el proceso por el cual ciframos el mensaje aplicando una función matemática
que hace que el mensaje sea incomprensible.
 Desencriptación: proceso inverso a la encriptación.
 Texto claro: elemento que no ha sido cifrado.
 Función Hash: algoritmo matemático que a partir de una longitud arbitraria devuelve un
tamaño fijo.
 Resumen: resultado obtenido de una función hash criptográfica.
 Clave: elemento fundamental para la criptografía.

Utilizando los personajes clásicos Alice y Bob, y una tercera persona, Peter, trataremos de
identificar qué problemas resuelve la criptografía.

 Secreto: el mensaje debe ser incomprensible para terceros.


Alicia envía un mensaje a Bob. Pedro no debe poder leerlo.
 Integridad: El mensaje no debe ser alterado durante la transmisión. Alice envía un
mensaje a Bob diciendo: W Bitcoin. Peter lo intercepta y lo cambia por: W Ethereum.
Bob debe ser capaz de notar dicho cambio.
 Autenticidad: Bob debe estar seguro de que el mensaje que recibió fue enviado por
Alice, y no por Peter haciéndose pasar por Alice.

¿Cómo se pueden resolver estos problemas?

El secreto se resuelve gracias a la criptografía, disfrazando el mensaje. Así, aunque Pedro


intercepte el mensaje entre Alicia y Bob, no puede entender su significado.

La integridad y la autenticidad se garantizan utilizando la firma digital del mensaje.

Recuerda que cualquier cambio en el mensaje provoca una distorsión del compendio.

Existen dos categorías de algoritmos criptográficos.

La criptografía simétrica y la criptografía asimétrica.

 Simétrica. También llamada criptografía de clave privada, utiliza la misma clave para el
cifrado y el descifrado. El problema más conocido es la distribución de la clave.
 Asimétrica. También llamada criptografía de clave pública, tiene dos claves diferentes
(pública y privada), unidas por propiedades algebraicas. La clave pública del destinatario
es utilizada por el emisor para cifrar el mensaje, mientras que el emisor utiliza su clave
privada para descifrarlo.

Los puntos fuertes de la clave son:

 La clave privada no puede derivarse de la clave pública. Así podemos distribuirla con
seguridad.
 Univocidad en la derivación de la clave pública a partir de la clave privada.

Pasemos a la práctica, empezando por la firma digital.

Para estos ejemplos utilizaremos OpenSSL13 y ECDSA14 el algoritmo utilizado por Bitcoin para
firmas digitales.
Abrimos dos terminales, en uno creamos la carpeta bob y en el otro la carpeta alice.

/Users/barno/Documents/bob
/Users/barno/Documents/alice

La version de OpenSSL que estoy usando es la siguiente:

openssl version
OpenSSL 1.0.2r 26 Feb 2019

Bitcoin utiliza los parámetros secp256k1 del algoritmo de curva elíptica.


Para mostrar la lista de los parámetros de la curva elíptica.

openssl ecparam -list_curves

Utilizaremos secp256k1 para crear la firma digital

Supongamos que Bob necesita enviar un mensaje a Alice.


Alice quiere estar segura de que el mensaje no ha sido alterado durante el viaje.
Para estar segura, Bob debe firmar digitalmente el documento, para demostrar a Alice que el
mensaje recibido es la copia exacta del documento original, resolviendo así el problema de
autenticidad e integridad.

Por lo tanto, si la verificación realizada por Alice tiene éxito, significa que tiene la copia original del
mensaje.
¿Cómo se lleva a cabo dicha verificación?
El remitente (Bob) envía tanto el mensaje sin cifrar, como el compendio obtenido con la clave
privada sobre el mensaje a enviar y su clave pública. El receptor (Alice) descifra el mensaje con la
clave pública del emisor (Bob) y verifica que es el mismo que el no cifrado, obteniendo así la
integridad y el no rechazo.

En la carpeta de Bob creamos la clave privada.


cd /Users/barno/Documents/bob

openssl ecparam -genkey -name secp256k1 -rand /dev/urandom -noout -out


private.pem
Con el comando openssl que acabamos de utilizar, hemos creado una clave privada con buena
entropía.

Debería tener un aspecto similar al siguiente


cat private.pem

Resultado:
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIH8evY2vqJXiHGCGnERz5wVrosQt9bfVg0UDd/k/z608oAcGBSuBBAAK
oUQDQgAEpwu6bl+f0ZWgKS0XBWXd8TvFCfPLjFFENJR4EmeOGAcNg5zKC5HJVJGX
80nFi8lq6Rr3SFD3wU1HeG/lDW04Yw== -----END EC PRIVATE KEY-----

Así que puedes leer las diferentes opciones.


Ahora podemos obtener la clave pública de Bob.

openssl ec -in private.pem -pubout -out public.pem

Donde private.pem es la clave privada creada anteriormente.


Tu clave pública debería tener un aspecto similar a este:
cat public.pem

-----BEGIN PÚBLIC KEY-----


MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgApwu6bl+f0ZWgKS0XBWXd8TvFCfPLjFFE
NJR4EmeOGAcNg5zKC5HJVGX80nFi8lq6Rr3SFD3wU1HeG/lDW04Yw==
-----END PÚBLIC kEY-----

Ahora crea un archivo vacío


touch testo_segreto.txt

Ahora tanto la clave pública como la privada están a nuestra disposición; por lo tanto, podemos
firmar el mensaje.
openssl dgst -sha256 -sign private.pem testo_segreto.txt > signature.bin

Creamos la firma aplicándola al fichero secret_text.txt, que representa nuestro


mensaje. Ahora vamos a transmitir la firma y la clave pública a Alice.
cp ./{public.pem,signature.bin,testo_segreto.txt} ../alice

Alice tiene todo lo que necesita para comprobar si el mensaje ha sido alterado durante la
transmisión. Vayamos a la carpeta de Alice y lancemos el comando
openssl dgst -sha256 -verify public.pem -signature signature.bin
testo_segreto.txt

Obtenemos un mensaje positivo, lo que significa que el mensaje no ha sido modificado durante la
transmisión. Sólo tenemos que hacer una contra-comprobación, modificando el archivo.

Modificamos el contenido del archivo secret_text.txt, sustituyendo bitcoin por ether, lo


guardamos y volvemos a aplicar la verificación de la firma.
openssl dgst -sha256 -verify public.pem -signature signature.bin testo_segreto.txt

La verificación no fue exitosa, como debería ser.


También analizamos el cifrado para cerrar el círculo.
Limpiamos nuestras carpetas.
Bob
rm -Rf ./{public.pem,signature.bin,testo_segreto.txt,private.pem}
Alice
rm -Rf ./{public.pem,signature.bin,testo_segreto.txt}

El escenario es el mismo que el anterior, excepto que Bob quiere enviar un mensaje a Alice
encriptándolo.
Para este ejemplo utilizaremos RSA, otro tipo de algoritmo.
Estos son los pasos que vamos a realizar:
 Un par de claves privadas y públicas para Alice.
 Alice envía la clave pública a Bob.
 Bob utiliza la clave pública de Alice para cifrar el mensaje.
 Bob envía el mensaje cifrado a Alice.
 Alice lo descifra gracias a su clave privada.

En la carpeta de Alice creamos la clave privada.


openssl genrsa -out private.pem 2048

Con la clave privada recién creada podemos derivar la clave pública.


openssl rsa -in private.pem -out PEM -pubout -out public.pem

Ahora vamos a transmitir la clave pública a Bob.


Tenga en cuenta que no importa tener un canal seguro para esta transmisión, que resuelve el
problema del cifrado simétrico, es decir, la distribución de las claves.
cp public.pem ../bob/

Ahora Bob es capaz de encriptar el mensaje y hacerlo ilegible, usando la clave pública que acaba
de recibir.
Vayamos a la carpeta de Bob y escribamos el mensaje.
cd ../bob
vi messaggio.txt

Ahora escribamos dentro, ¡Te quiero!


Un poco de romanticismo no vendría mal.
Después ciframos el mensaje con la clave pública de Alice.
cat messaggio.txt | openssl rsautl -encrypt -pubin -inkey public.pem >
messaggio_crittato.txt

En este punto sólo Alice con su clave privada es capaz de leerlo.


Nosotros no podemos desencriptarlo, ni siquiera con la clave pública que acabamos de utilizar.
Este paso es esencial, porque de lo contrario existiría el problema de la transmisión de claves
públicas y cualquiera podría leer el mensaje secreto.
Podemos ver cómo se encriptó el mensaje, con
cat mensaje_crittato.txt

El mensaje es totalmente incomprensible.


Bien, podemos enviarlo a nuestra querida Alice.
cp messaggio_crittato.txt ../alice

Ahora Alice puede leer el mensaje usando su clave privada.


cd ../alice
cat messaggio_crittato.txt | openssl rsautl -decrypt -inkey private.pem
> messaggio_decrittato.txt

Entonces:
cat messaggio_decrittato.txt

Ha leído el mensaje de amor y está segura de que es la única capaz de leerlo.

Recapitulando:
- Hemos creado un par de claves privadas y públicas.
- Alice ha enviado a Bob su clave pública.
- Bob ha utilizado la clave pública de Alice para cifrar el mensaje.
- Bob envió el mensaje cifrado a Alice.
- Alice lo descifra con su clave privada.

El tema de la criptografía es muy amplio y va más allá del alcance de este libro.
En los próximos capítulos veremos cómo se utiliza la criptografía en el blockchain

También podría gustarte