Este post se ocupa de lo que se puede denominar criptografía moderna o criptografía asimétrica. En este post estudiamos el cifrado simétrico y supusimos que tiene
un problema de escalabilidad significativo cuando la clave de cifrado debe distribuirse a un gran número de destinatarios. Por ejemplo, considere el escenario donde una clave de cifrado tiene que ser distribuido a miles de destinatarios. Cada transmisión de la clave a un destinatario conlleva una cierta probabilidad de que la llave sea interceptada por un actor malévolo. El objetivo de los criptosistemas de clave pública, entre otras cosas, es resolver este problema de escalabilidad y también hacen discutible el tema de la interceptación de la clave secreta por los adversarios. La pieza de resistencia de la teoría de los criptosistemas de clave pública son los algoritmos de firma digital;
estos resuelven tres problemas simultáneamente:
- Asegurar la integridad de los mensajes
- Asegurar la autenticidad de los mensajes
- Resolver el problema de escalabilidad
Los criptosistemas de clave pública se utilizan en una muchas aplicaciones modernas. Por ejemplo, se utilizan en comunicaciones HTTP seguras, en redes privadas virtuales,
en sistemas de comercio electrónico, en tarjetas inteligentes, en tarjetas de identidad electrónicas y sistemas de pago como SWIFT y ahora en criptomonedas y aplicaciones blockchain.
En este post comenzaré resumiendo el problema de distribuir claves de cifrado simétrico y luego proporcionar una breve descripción del algoritmo de firma digital. Después de esto, te proporcionaré algunas de las teorías matemáticas sobre criptosistemas de clave pública subyacentes y finalmente proceder a hablar sobre los algoritmos de firma digital en mayor profundidad. También proporcionaré ejemplos de código en Python a medida que avancemos.
El problema de la distribución de claves revisado
Una vez más, suponga que usted y yo estamos en los extremos opuestos de la Vía Láctea y que yo quiero enviarte un mensaje secreto. En primer lugar, debe poseer la clave de cifrado simetrico para que pueda descifrar el mensaje. Por lo tanto, si no tiene esta clave, debo transmitírtela. Una vez que le proporciono la clave, te puedo enviar mensajes cifrados y podrás descifrarlos utilizando la clave secreta. Para detectar
si el mensaje ha sido alterado mientras estaba en tránsito, también puedo transmitir el hash SHA-256 del texto sin formato o del mensaje cifrado. Este hash criptográfico puede ser adjunto al mensaje.
En el escenario anterior, hay dos cuestiones pendientes que deben ser
solucionadas. En primer lugar, no sabes si el mensaje ha sido enviado realmente por
mí o por algún actor hostil que se hace pasar por mí. El mensaje pudo haber sido
creado por cualquiera que tenga la clave de cifrado. Este es el problema de la autenticidad. ¿Como demostramos que un mensaje ha sido enviado por la persona que pretende ser su autor?
El segundo problema es que la clave de cifrado podría haber sido interceptada por una entidad hostil mientras está en tránsito. No existe una forma determinista de demostrar que la clave secreta no ha sido interceptada mientras estaba en tránsito. Este problema se agrava cuando la clave debe distribuirse a un gran número de destinatarios. Considera, por ejemplo, una red en la que cada nodo de la red debe tener la misma clave de encriptación.
Heurística de los algoritmos de firma digital
En criptografía de clave pública, se utiliza un algoritmo de generación de clave asimétrica para generar una clave pública y una clave privada. Cada una de estas claves es una cadena muy larga. La entidad que genera este par de claves mantiene la clave privada de forma segura consigo misma y distribuye la clave pública a los destinatarios previstos. Por ejemplo, la clave pública puede ser distribuida al mundo en general mediante su publicación en Internet. El aspecto esencial de la distribución de la clave pública es que no nos importa que una entidad hostil tenga posesión de esta clave. Dado que la entidad que genera el par de claves debe mantener la clave privada de forma segura
consigo mismo, es importante que el algoritmo de generación de claves asimétricas no haga computacionalmente factible recuperar la clave privada de la clave pública.
Una entidad puede ahora cifrar un mensaje con la clave pública y transmitirla al titular
de la clave privada o simplemente publicar el mensaje cifrado en Internet. El algoritmo asimétrico de generación de claves garantiza que este mensaje solo se puede descifrar con la clave privada, es decir, es computacionalmente inviable descifrar el mensaje sin la
llave privada. Por inviabilidad computacional, queremos decir que se necesitaría una enorme cantidad de tiempo (quizás eones) para descifrar el mensaje en ausencia de la clave privada. Del mismo modo, un mensaje cifrado con la clave privada solo puede ser descifrado por la clave pública correspondiente a la clave privada. Es computacionalmente inviable para un adversario recuperar el mensaje original del texto cifrado sin la clave pública. Las claves pública y privada son inversas entre sí en el sentido de que el cifrado de las operaciones realizadas por cualquier clave se pueden invertir con la otra clave. Esta es la esencia de la criptografía de clave pública. La figura de abajo muestra este proceso.

En el proceso anterior, Alice genera un par de claves pública-privada y le entrega
la clave pública al Sr Smith mientras mantiene ella mantiene la clave privada de forma segura. El Sr Smith entonces cifra un mensaje con esta clave pública y entrega el texto cifrado a Alice. Alice entonces descifra el texto cifrado con su clave privada.
Alice sabe que el mensaje ha sido cifrado por una persona que tiene la clave pública, pero normalmente Alice no sabrá la identidad de la persona que realmente cifró este mensaje (a menos que Alice sepa con certeza que solo Smith tiene la clave pública). La determinación de este problema de identidad requiere una infraestructura de clave pública (PKI). Hablaremos sobre la infraestructura de clave pública en breve.
El otro escenario es cuando Alice cifra un mensaje con su clave privada. Tal
El mensaje puede ser descifrado por cualquier persona que posea la clave pública correspondiente. La característica esencial aquí es que el destinatario del mensaje puede concluir que el mensaje fue generado por la entidad que posee la clave privada. Además, Alice no puede repudiar la afirmación de que el mensaje se generó con la clave privada que tenía ella. Tenga en cuenta que en ausencia de información exógena, el destinatario no puede asociar la clave privada con Alice. Una forma de establecer tales asociaciones es mediante el uso de autoridades de certificación (PKI).
Alice y Smith pueden participar en comunicaciones bidireccionales seguras si cada parte
envía mensajes utilizando la clave pública de la otra parte.
Los algoritmos de firma digital abordan dos cuestiones: en primer lugar, que un mensaje no ha sido manipulado y, en segundo lugar, que la firma ha sido generada por una determinada clave y, por tanto, por el titular de esta clave. El segundo aspecto del algoritmo resuelve el problema de autenticación.
Estos algoritmos constan de dos etapas: una etapa de generación de firmas y una firma
etapa de verificación. La Figura de abajo muestra los pasos involucrados en la etapa de generación de firmas.

Alice ha generado un par de claves asimétricas y tiene un documento que quiere
firmar digitalmente. En el primer paso, Alice genera un hash criptográfico del documento,
digamos, el hash del mensaje SHA-256 del documento. Alice luego encripta el mensaje
digerir con su clave privada. El resultado de este cifrado es la firma digital del
documento. En el segundo paso, Alice concatena el documento y la firma digital
y transmite este documento concatenado al destinatario.
Como hemos señalado anteriormente, los algoritmos criptográficos de alta calidad como SHA-256 tienen un efecto de avalancha. Si un documento se modifica muy levemente, incluso en un solo bit, esto producirá un resumen del mensaje que cambia drásticamente. Este mismo efecto de avalancha ocurre cuando la clave privada se aplica al resumen del mensaje. Por último, ten en cuenta que el documento en sí mismo no necesita estar encriptado. En muchas aplicaciones importantes, no nos importa que el documento se transmita en texto plano, ya que nuestra única preocupación es detectar alteraciones
del documento y comprobar la autenticación del documento. Por supuesto, Alice también puede elegir cifrar el documento con su clave privada y luego cifrar con el el hash SHA-256 el mensaje del documento cifrado con su clave privada.
La segunda etapa de los algoritmos de firma digital es la verificación del documento
por un destinatario del mismo. La figura 5-3 muestra este proceso.

En la etapa de verificación, el destinatario del documento concatenado, digamos el Sr Smith, separa el documento y la firma. En el primer paso, El Sr Smith calcula el hash SHA-256 del mensaje del documento que se ha recibido. En el segundo paso, la firma
que se concatenó con el documento se descifra aplicando la clave pública de Alice a
la firma. Esto produce el hash del mensaje que fue calculado por el remitente del
documento. A continuación, se comparan los dos hashes de los mensajes. Si los hashes de los mensajes son iguales, entonces Smith puede concluir que el documento no ha sido manipulado mientras estaba en tránsito y que Alice ha firmado y entregado este documento ya que su clave privada coincide la clave pública que Smith ha utilizado. Si los hashes de los mensajes no coinciden, entonces hay tres posibilidades.
- El documento ha sido alterado mientras estaba en tránsito
- Alice no es la autora del documento
- Smith no posee la clave pública correspondiente a la clave privada de Alice.
infrastructura de clave publica
Como recordarás, cuando Smith recibe un mensaje (o documento) cifrado con un
clave privada, todo lo que puede inferir sobre la identidad del remitente es que esta entidad está en posesión de la clave privada que cifró el mensaje. Smith debe poseer
información exógena para asociar la identidad de Alice con la clave privada. Igualmente,
cuando Alice recibe un mensaje que ha sido encriptado con su clave pública, entonces en
ausencia de información exógena, sólo puede concluir que el mensaje ha sido cifrado por alguien que tenga su clave pública.
Una forma de asociar una identidad con una clave pública (e implícitamente su clave privada) es a través de una autoridad de certificación (CA). Esta es la forma en que las autoridades de certificación trabajan; En primer lugar, la autoridad certificadora obtiene información sobre la identidad de el solicitante que afirma poseer un par de claves público-privadas. El solicitante proporciona a la CA su clave pública. Luego, la CA solicita al solicitante que firme digitalmente un documento proporcionado por la CA. Una vez que el solicitante ha firmado el documento, la CA procede a verificar la firma del documento. Si la verificación tiene éxito, es prueba de que el solicitante está en posesión de la clave privada perteneciente a la clave pública que ha proporcionado a la CA. La CA luego emite un certificado X.509 al solicitante. Este certificado está firmado por la CA con su clave privada para probar la identidad del emisor del certificado y asegurar que
no ha sido alterado. El certificado emitido normalmente contiene información de identificación del solicitante, como el nombre, la dirección y otros datos distintivos, la clave pública generada por el solicitante, la fecha de vencimiento del certificado, etc.
Alice puede proporcionar prueba de la autoría de un documento de la siguiente manera.
En primer lugar, Alice cifrará su certificado con su clave privada y lo concatenará con el
documento que quiere entregar. Alice firmará digitalmente este documento concatenado y adjuntará la firma al documento concatenado. Esto permitirá al destinatario verificar de forma segura la identidad de la persona que ha firmado el documento descifrando el
certificado. De manera similar, cuando Smith cifra un documento con la clave pública de Alice, puede también encriptar su certificado con su clave privada y concatena el certificado encriptado con el documento. Alice ahora sabrá la identidad de la persona que le ha enviado el documento cifrado con su clave pública descifrando el certificado con la clave pública del Sr Smith.
ejemplo codigo python
En el siguiente ejemplo de Python, usaremos el paquete pycryptodome para dirigir a Alice y Smith a través de una secuencia de cifrado, descifrado, generación de firmas y verificación de firmas mediante RSA.
Debes revisar este código con cuidado para ver la mecánica del uso del par de claves asimétricas para cifrar y descifrar mensajes.
Si aún no lo has hecho, instala este paquete:
pip3 install pycryptodome
Y ahora el código:
#========================================
# RSA Public-key cryptography example
#========================================
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Hash import SHA256
from Crypto import Random
from hashlib import sha256
import binascii
#=====================================
# generate a RSA key-pair
#=====================================
def RSAKeyPair(keylength):
keyPair = RSA.generate(keylength)
return keyPair
# Alice generates a RSA key-pair
AliceKeyPair = RSAKeyPair(1024)
# Alice's public-key
pubKey = AliceKeyPair.publickey()
print(f"public-key: (n={hex(pubKey.n)}, e={hex(pubKey.e)})")
# Alice's public-key in PEM format
# PEM format Base64 encodes the key
pubKeyPEM = AliceKeyPair.publickey().exportKey()
print("PubKey PEM Format: " +pubKeyPEM.decode('ascii'))
# Alice's private key
print(f"Private key: (n={hex(pubKey.n)}, d={hex(AliceKeyPair.d)})")
# Alice's private key in PEM format
privKeyPEM = AliceKeyPair.exportKey()
print("PRIVATE KEY PEM FORMAT; " + privKeyPEM.decode('ascii'))
#======================================================
# Smith encrypts a message using Alice's public-key
# message must be a binary string
#======================================================
message = b"The quick brown fox jumped over the farmer's hedge"
cipher = PKCS1_OAEP.new(pubKey)
cipherText = cipher.encrypt(message)
print("CipherText: ", binascii.hexlify(cipherText))
#=======================================================
# Alice decrypts Smith's message using her private key
#=======================================================
decipher = PKCS1_OAEP.new(AliceKeyPair)
plainText = decipher.decrypt(cipherText)
print('Decrypted Text: ', plainText)
#==========================================================
# Alice signs a message by first generating the SHA-256
# digest of the message and then encrypting it with her
# private key.
# the string message is converted to a binary string
#==========================================================
message = b'let sleeping dogs lie, said the farmer'
hash = int.from_bytes(sha256(message).digest(), byteorder='big')
signature = pow(hash, AliceKeyPair.d, AliceKeyPair.n)
print("Alice's Signature:", hex(signature))
#============================================================
# Smith Verifies the signature by comparing the SHA-256 hash
# generated from the received message with the hash obtained
# by decrypting the signature received from Alice
#=============================================================
hashFromMessage = int.from_bytes(sha256(message).digest(), byteorder='big')
decryptedHash = pow(signature, AliceKeyPair.e, AliceKeyPair.n)
if (hashFromMessage == decryptedHash):
print("Signature is valid")
else:
print("signature is invalid")
.
Generación de ID únicos Globales
En una aplicación de blockchain, normalmente necesitamos valores universalmente únicos que identifiquen bloques y transacciones. Una forma de generar estos ID globales es generar un par de claves asimétricas y luego obtener el hash SHA-256 de la clave privada o pública. El resultado es el hash de 256 bits único global.
Esto significa que es computacionalmente inviable generar algún otro par de claves asimétricas que generará el mismo hash del mensaje. Del mismo modo, podemos aplicar la función hash criptográfica RIPEMD-160 a una clave pública o privada. El hash de mensaje de 160 bits resultante también es una identificación única global.