Salta al contenido principal

Sección 4.4 Las Monedas Electrónicas

Subsección 4.4.1 Criptografía elíptica en la vida real

Al igual que los números abstractos, cuya estructura y manejo ya no dependen de los objetos que designan, el valor de las nuevas monedas digitales-encriptadas, no tienen las ataduras clásicas del antiguo dinero (monedas, billetes, papeles, bonos, etc.): solo representan una abstracción de nuestras pertenencias; garantizadas por las matemáticas.
La tecnología desarrollada por la plataforma NEM (Movimiento de la Nueva Economía; por sus siglas en inglés), basa su fortaleza elíptica en el numerito primo \(2^{255}-19\text{.}\) Este ejemplar le permite al cuerpo finito que contiene la curva elíptica: \(-x^2 + y^2 = 1 - \frac{121665}{121666}x^2y^2\text{;}\) Twisted Edwards Ed25519 [27], un impresionante número de elementos de campo para la seguridad del sistema:
\begin{align*} 2^{255}-19 = \amp 5789604461865809771178549250434395392663499\\ \amp continúa \; 2332820282019728792003956564819949 \end{align*}
aunque no todos los elementos de ese descomunal campo de enteros están disponibles; sólo la siguiente cantidad de ellos:
\begin{align*} q \amp = 2^{252}-27742317777372353535851937790883648493 = \\ = \amp 72370055773322622139731865630429942408016317238251628\\ \amp continúa \; 98930247062703686954003. \end{align*}
Considere ese inmenso y extraordinario conjunto de elementos disponibles para una selectividad aleatoria garantizada. Dicho espécimen cardinal hace que la granularidad finita —aparente infinita— e inagotable.
Por un momento deténgase a imaginar la probabilidad de acertar un valor específico del formidable conjunto de elementos que se forma cuando \(p\) y \(m\) tienen los valores utilizados en las criptomonedas como Bitcoin, NEM o Ethereum; y mucho menos intentar encontrar el logaritmo discreto \(e = \log_pP\) a partir de la clave pública \(P\text{;}\) a pesar de que son del dominio público: la ecuación elíptica \(E\text{,}\) el primo \(p\) y otros parámetros de la curva elíptica utilizada; e infinidades de claves públicas de los usuarios. Un método eficaz para resolver el ECDLP pondría en jaque toda la seguridad mundial.

Subsección 4.4.2 El Bitcoin

Definimos una moneda electrónica como una cadena de firmas digitales. Cada propietario transfiere la moneda al siguiente firmando digitalmente un hash de la transacción anterior y la clave pública del siguiente propietario y agregándolos al final de la moneda. Un beneficiario puede verificar las firmas para verificar la cadena de propiedad.
―Satoshi Nakamoto
El problema, por supuesto, es que el beneficiario no puede verificar que uno de los propietarios no haya gastado dos veces la misma moneda. La solución habitual es introducir una autoridad central de confianza, o casa de la moneda, que comprueba cada transacción para que eso no se produzca. Tras cada transacción, la moneda debe regresar a la casa de la moneda para distribuir una nueva moneda, y solo las monedas emitidas directamente desde ella están libres de la sospecha de doble gasto. El problema de esta solución es que el destino de todo el sistema de dinero depende de la compañía que gestiona la casa de la moneda, por la cual pasa cada transacción, igual que un banco. Necesitamos una forma de que el beneficiario sepa que los propietarios previos no han firmado transacciones anteriores. Para nuestros propósitos, la transacción más temprana es la que cuenta, así que no nos preocupamos de los intentos de doble gasto posteriores. La única manera de confirmar la ausencia de una transacción es tener conocimiento de todas las transacciones. En el modelo de la casa de la moneda, esta tiene conocimiento de todas las transacciones y decide cuáles llegaron primero. Para lograr esto sin la participación de una parte de confianza, las transacciones han de ser anunciadas públicamente, y necesitamos un sistema para que los participantes estén de acuerdo en un único historial del orden en que fueron recibidas 1 . El beneficiario necesita prueba de que en el momento de la transacción la mayor parte de los nodos estaban de acuerdo en que esa fue la primera que se recibió [25].
Figura 4.4. Diagrama de la cadena propiedad (cadena de bloque o ‘blockchain’); tomado del artículo original de Satoshi Nakamoto [25].

Curva Elíptica Koblitz SECP25k1.

La curva elíptica base para la seguridad del Bitcoin es la Koblitz secp256k1. Esta curva elíptica, no está especificada en el artículo original de Satoshi Nakamoto (el Libro Blanco del Bitcoin) [25]; fue seleccionada por consenso y cumple con: Recommended Elliptic Curve Domain Parameters (SEC) [33–34] y el Digital Signature Standard (DSS) de NIST, para los algoritmos que se deben de utilizar para generar una firma digital [26]:
\begin{equation} y^2=x^3+ax + b \pmod{p}\tag{4.4.1} \end{equation}
Con el sextuple \(T = (p, a, b, G, n, h)\text{,}\) se especifican los coeficientes y parámetros de \(E\text{:}\)
\begin{align*} a = \; \amp 0\\ b = \; \amp 7\\ p = \; \amp 2^{256}-2^{32}-2^9-2^8-2^7-2^6-2^4-1\\ G = \; \amp 0x79BE667E F9DCBBAC 55A06295 CE870B07\\ \amp \quad \; 029BFCDB 2DCE28D9 59F2815B 16F81798\\ n = \; \amp 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE\\ \amp \quad \; BAAEDCE6 AF48A03B BFD25E8C D0364141\\ h = \; \amp 1 \end{align*}
Donde \(G\) es solo la coordenada \(x\) del punto generador \(G\text{;}\) \(G_y\) se obtiene despejando y evaluando los otros parámetros en \(E\) (4.4.1). El parámetro \(n\) (o \(N\)) es un número primo; suborden del subgrupo de puntos en la curva elíptica (el orden de \(G\)). El cofactor (o cofactor de seguridad) \(h\) es un parámetro asociado a la curva elíptica definida sobre un cuerpo finito \(\mathrm{F}(p)\text{;}\) se calcula como la división del número total de puntos en la curva (\(\#E(F_p)\)) entre el orden del grupo de puntos generados por un punto base \(n\text{:}\) \(h = \#E(\mathrm{F}(p))/n\text{.}\) Si \(h\) es pequeño o igual a 1, la curva se considera “segura”; un cofactor grande podría indicar una debilidad.
Figura 4.5. Aspecto de la traza de la curva elíptica SECP25k1 en \(\mathbb{R}^2\text{;}\) no es posible presentar la traza en \(\mathbb{F}_p\) ya que no tendría sentido alguno; y la potencia de cálculo y despliegue necesaria está alejada de cualquier realidad.

Subsubsección 4.4.2.1 El problema del logaritmo discreto en curva elíptica

Un esquema de firma digital se basa en propiedades matemáticas para demostrar la autenticidad de un documento digital 2 . La firma digital utiliza criptografía asimétrica PKI [Párrafo ]; permite, por ejemplo, que cuando Fafa quiere firmar un documento, calcule el hash del mismo, lo cifre con su clave privada y lo envíe a Jhon. Jhon lo descifra usando la clave pública de Fafa, con lo que verifica la integridad y autenticidad del documento. Para trabajar con criptografía asimétrica con curvas elípticas, hay que tener un mecanismo parecido al usado por RSA; Sección 4.2.
Ya vimos que los criptosistemas tradicionales, aquieren cierta fortaleza con claves grandes, alrededor de 2048 bits; lo que puede ser impráctico para dispositivos con limitaciones de capacidad de cálculo y almacenamiento, como alternativa: surge el uso de las curvas elípticas (esquema inicialmente propuesto por Neal Koblitz y Victor Miller en 1985). Este mecanismo utiliza una curva elíptica para definir un sistema de cifrado asimétrico, con claves más cortas y un nivel de seguridad equivalente. Aunque la operación de suma y producto escalar en curvas elípticas es más compleja, ofrece beneficios en términos de eficiencia y seguridad. Se ha evolucionado sobre diversos enfoques hasta llegar al actual algoritmo ECDSA. El mensaje o dato que se va a firmar digitalmente, el targe u objetivo depende del algoritmo de firma; en Bitcoin se usa ECDSA.

Subsubsección 4.4.2.2 Algoritmo de firma digital de curva elíptica

El algoritmo Elliptic Curve Digital Signature Algorithm (ECDSA) resuelve el problema del logaritmo discreto en curvas elípticas. Es ampliamente utilizado en la firma digital de transacciones criptográficas, como en la tecnología blockchain, donde se asegura la autenticidad y la integridad de las transacciones.
  • Denotamos la clave secreta como \(e\text{,}\) que debe satisfacer lo siguiente: \(eG = P\text{;}\) donde \(P\) es la clave pública y \(e\) la clave privada.
  • El objetivo o targe al que vamos a apuntar es un número \((k)\) aleatorio de 256 bits; hacemos \(kG = R\text{.}\)
  • \(R\) es ahora el objetivo al que apuntamos. De hecho, sólo importa la coordenada \(x\) de \(R\text{,}\) a la que llamremos \(r\text{;}\) de randomica.
  • La siguiente ecuación \(uG + vP = kG\) es equivalente al problema del logaritmo discreto: donde \(k\) es elegido al azar, \(u, v \neq 0\text{;}\) pueden ser elegidos por el firmante; mientras que \(G\) y \(P\) son conocidos. Esto se debe al hecho de que:
    \(uG + vP = kG\) implica \(vP = (k - u)G\text{.}\) Dado que \(v \neq 0\text{,}\) podemos dividir por el múltiplo escalar \(v\text{:}\)
    \begin{equation*} P = (\frac{k - u}{v})G \end{equation*}
  • Si conocemos \(e\text{,}\) tenemos:
    \begin{equation*} e = \frac{k - u}{v} \end{equation*}
    Esto significa que cualquier combinación \((u,v)\) que satisfaga la ecuación precedente será suficiente. Si no conocemos \(e\text{,}\) tendremos que jugar con \((u,v)\) hasta que \(e = \frac{k - u}{v}\text{.}\) Si pudiéramos resolver esto con cualquier combinación \((u,v)\text{,}\) eso significaría que habríamos resuelto \(P = eG\) mientras conocemos solo \(P\) y \(G\text{.}\) En otras palabras, así se resuelve el problema del logaritmo discreto de manera elíptica.
Para proporcionar \((u,v)\) correctos, debemos resolver el problema del logaritmo discreto o conocer el secreto \(e\text{.}\) Como acordamos que el logaritmo discreto es difícil (o imposible), podemos asumir que se supone que \(e\) es conocido por quien ideó \((u,v)\text{.}\)
Tenemos que incorporar la razón o propósito de nuestra intensión para que pueda ser verificada. ¿Cómo saber que hemos acertado al targe esperado? En el lenguaje de firma/verificación, esto se llama hash de firma [Párrafo ]; la “huella digital” del mensaje que contiene el objetivo buscado, que cualquiera que pretenda verificar el mensaje, ya debe de conocer; denotado con \(z\text{.}\)
El hash del mensaje (\(z\)): podemos incorporarlo a nuestro cálculo de \(uG + vP\) de esta manera: \(u = z/s\) y \(v = r/s\text{.}\) Ahora tenemos el propósito \(z\) incorporado en \(u\text{,}\) y el motivo (objetivo o targe \(r\)) incorporado en \(v\text{;}\) ambos son ahora parte de la ecuación. Y con un poco de álgebra podemos sensatear lo que buscamos: la base del algoritmo de firma; cuyos dos números son \(r\) y \(s\text{.}\) La firma digital ECDSA consta de dos componentes: \(r\) y \(s\text{;}\) a la coordenada \(x\) de \(R\) (un punto en la curva elíptica), llamamos \(r\) que es una parte de la firma; la otra parte, está relacionada con el valor del hash del mensaje que se está firmando, y la llamamos \(s\text{.}\)
\begin{equation*} uG + vP = R = kG \end{equation*}
\begin{equation*} uG + veG = kG \end{equation*}
\begin{equation*} u + ve = k \end{equation*}
\begin{equation*} \frac{z}{s} + \frac{re}{s} = k \end{equation*}
\begin{equation*} \frac{z + re}{s} = k \end{equation*}
\begin{align*} s \amp = \frac{z + re}{k} \end{align*}
En resumen: en la firma digital ECDSA, tenemos \(u\) y \(v\) que son componentes calculados, \(R\) es un punto en la curva elíptica, \(k\) es un valor aleatorio, \(z\) es el hash del mensaje, \(e\) es la clave privada y \(s\) es una parte de la firma.
La verificación es sencilla; \(uG + vP\) donde \(u,v \neq 0\) resultando:
\begin{equation*} uG + vP = (\frac{z}{s})G + (\frac{re}{s})G = (\frac{z + re}{s})G = (\frac{z + re}{(z + re)/k)})G = kG = (r,y) \end{equation*}
En este punto, es importante indicar que podemos divulgar \(R\text{,}\) pero \(k\) debe mantenerse en secreto, ya que su revelación equivale a revelar la clave privada \(e\text{:}\) \(uG + vP = R \therefore uG + veG = kG \therefore (k - u)/v = e\text{.}\)
Verificando una firma ECDSA.
Cuando se generan firmas digitales en Bitcoin, estas firman un valor de longitud fija, que es nuestro propósito y tiene 32 bytes. La elección de 32 bytes, equivalente a 256 bits, no es coincidencia, ya que lo que estamos firmando será un escalar para \(G\text{.}\) Para asegurarnos de que lo que firmamos tenga exactamente 32 bytes, aplicamos primero una función hash al documento. En Bitcoin, se utiliza la función hash256, que consiste en dos rondas de sha256 3 . Esto garantiza que el resultado tenga la longitud deseada; es llamado “hash de firma” o \(z\text{.}\) Las firmas que tendremos que verificar, también tienen dos componentes \((r,s)\text{;}\) donde igual \(x\) es la coordenada de algún punto \(R\) y \(s\) es nuestra ecuación anterior: \(s = \frac{z + re}{k}\text{.}\)
Conocemos \(e\) (a partir de: \(P = eG\text{,}\) o lo que estamos demostrando que sabemos en primer lugar), conocemos \(k\) (de: \(kG = R\)) y conocemos \(z\text{.}\) Ahora construiremos \(R = uG + vP\) definiendo \(u\) y \(v\) de esta manera: \(u=z/s\) y \(v=r/s\text{,}\) luego:
\begin{equation*} uG + vP = (\frac{z}{s})G + (\frac{r}{s})P = (\frac{z}{s})G + (\frac{re}{s})G = (\frac{z + re}{s})G \end{equation*}
Como conocemos: \(s = \frac{z + re}{k}\text{,}\) resulta:
\begin{equation*} uG + vP = (\frac{(z + re)}{(z + re)/k})G = kG = R \end{equation*}
Hemos elegido con éxito \(u\) y \(v\) de tal manera que generamos \(R\) como pretendíamos. Además, usamos \(r\) en el cálculo de \(v\text{,}\) lo que demuestra que sabíamos cuál sería \(R\text{.}\) La única forma en que podemos conocer los detalles de \(R\) de antemano es si conocemos \(e\text{.}\)
Algoritmo de verificación de firma ECDSA.
Algoritmo ECDSA para verificar una firma digital:
  1. A partir de \((r,s)\) como la firma, \(z\) como el hash de la ‘cadena de texto’ que se está firmando y \(P\) como la clave pública (o punto elíptico público) del firmante.
  2. Se calcula: \(u = \frac{z}{s}\) y \(v = \frac{r}{s}\text{;}\) donde \((u,v)\) se obtienen mediante el inverso multiplicativo de \(s\text{,}\) con: \(u = z \times s^{-1} \pmod{N}\) y \(v = r \times s^{-1} \pmod{N}\) [En Sage: Nota A.2.6]; donde \(N\) es el suborden del subgrupo de puntos en la curva elíptica SECP25k1 4 .
  3. Se calcula: \(uG + vP = R\text{.}\)
  4. Si la coordenada \(x\) de \(R\) es igual a \(r\text{,}\) la firma es válida.

Algoritmo de Firma ECDSA.

Suponiendo que la clave pública \(P\) es del conocimiento de quien quiera verificarla; y ese verificador conoce \(z\text{;}\) el hash de la ‘cadena de texto’ que se está firmando.
  1. Se elije una \(k\) aleatoria.
  2. Tenemos \(z\) y conocemos \(e\) tal que \(eG = P\text{.}\)
  3. Se obtiene \(R = kG\text{;}\) con \(r = R_x\) (coordenada \(x\) de \(R\)).
  4. Se calcula \(s = \frac{z + re}{k}\text{.}\)
  5. La firma es \((r,s)\text{.}\)

Subsubsección 4.4.2.3 Computo de la firma y verificación ECDSA

En Sage, conocidos los parámetros de la curva elíptica a utilizar (en nuestro caso SECP25k1); se puede firmar y verificar un mensaje secreto (\(m\)); como en el código anexo [7–21].
Las curvas elípticas son protagonistas en la cadena de bloques de las monedas electrónicas, constituyendo los pilares fundamentales de su estructura (Figura 4.4). Junto con la firma digital, su verificación, algoritmos de hash y otros mecanismos de seguridad, estas curvas contribuyen a hacer de estas monedas valores singulares e independientes. Firmar y verificar mediante algoritmos como ECDSA no solo garantiza el valor de dichas monedas, sino que también profundiza en la abstracción del valor que representan. Los propietarios tienen el control total sobre el destino de su moneda, sin ningún intermediario; solo deben dejar constancia de sus acciones en la Blockchain.