Introducció

La criptografia asimètrica, també coneguda com a criptografia de clau pública, és un tipus de criptografia que utilitza un parell de claus: una clau pública i una clau privada. Aquest mètode permet una comunicació segura sense la necessitat de compartir prèviament una clau secreta.

Conceptes Clau

  • Clau Pública: Utilitzada per xifrar dades. Aquesta clau és accessible a qualsevol persona.
  • Clau Privada: Utilitzada per desxifrar dades. Aquesta clau és mantinguda en secret pel propietari.
  • Xifratge: El procés de convertir dades en un format inintel·ligible utilitzant la clau pública.
  • Desxifratge: El procés de convertir les dades xifrades de nou en el seu format original utilitzant la clau privada.

Funcionament

La criptografia asimètrica es basa en problemes matemàtics que són fàcils de calcular en una direcció però difícils de revertir sense informació addicional (la clau privada). A continuació es mostra un exemple bàsic de com funciona aquest tipus de criptografia:

  1. Generació de Claus:

    • Es genera un parell de claus: una clau pública i una clau privada.
    • La clau pública es distribueix a qualsevol persona que vulgui enviar un missatge segur.
    • La clau privada es manté en secret pel destinatari.
  2. Xifratge:

    • L'emissor utilitza la clau pública del destinatari per xifrar el missatge.
    • El missatge xifrat es pot enviar de manera segura a través d'un canal insegur.
  3. Desxifratge:

    • El destinatari utilitza la seva clau privada per desxifrar el missatge.
    • Només el destinatari amb la clau privada pot desxifrar el missatge i llegir el contingut original.

Exemple Pràctic

Suposem que Alice vol enviar un missatge segur a Bob. Bob genera un parell de claus (clau pública i clau privada) i comparteix la seva clau pública amb Alice.

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Random import get_random_bytes

# Generació de claus per a Bob
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()

# Alice xifra el missatge amb la clau pública de Bob
message = b'Hola Bob, aquest és un missatge segur.'
cipher_rsa = PKCS1_OAEP.new(RSA.import_key(public_key))
ciphertext = cipher_rsa.encrypt(message)

# Bob desxifra el missatge amb la seva clau privada
cipher_rsa = PKCS1_OAEP.new(RSA.import_key(private_key))
plaintext = cipher_rsa.decrypt(ciphertext)

print(plaintext.decode('utf-8'))

Explicació del Codi

  1. Generació de Claus:

    • RSA.generate(2048): Genera un parell de claus RSA de 2048 bits.
    • key.export_key(): Exporta la clau privada.
    • key.publickey().export_key(): Exporta la clau pública.
  2. Xifratge:

    • PKCS1_OAEP.new(RSA.import_key(public_key)): Crea un objecte de xifratge amb la clau pública.
    • cipher_rsa.encrypt(message): Xifra el missatge utilitzant la clau pública.
  3. Desxifratge:

    • PKCS1_OAEP.new(RSA.import_key(private_key)): Crea un objecte de desxifratge amb la clau privada.
    • cipher_rsa.decrypt(ciphertext): Desxifra el missatge utilitzant la clau privada.

Avantatges i Desavantatges

Avantatges

  • Seguretat: No cal compartir la clau privada, reduint el risc de compromís.
  • Autenticació: Permet verificar la identitat de l'emissor mitjançant signatures digitals.

Desavantatges

  • Rendiment: Els algoritmes asimètrics són més lents que els simètrics.
  • Complexitat: La gestió de claus és més complexa.

Exercicis Pràctics

Exercici 1: Generació de Claus

Genera un parell de claus RSA de 2048 bits i mostra la clau pública i privada.

Exercici 2: Xifratge i Desxifratge

Utilitza les claus generades en l'exercici anterior per xifrar i desxifrar un missatge.

Exercici 3: Signatura Digital

Implementa una signatura digital utilitzant RSA per verificar la integritat i autenticitat d'un missatge.

Solucions

Solució Exercici 1

from Crypto.PublicKey import RSA

# Generació de claus
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()

print("Clau Privada:", private_key.decode('utf-8'))
print("Clau Pública:", public_key.decode('utf-8'))

Solució Exercici 2

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

# Claus generades prèviament
private_key = key.export_key()
public_key = key.publickey().export_key()

# Xifratge
message = b'Hola, aquest és un missatge segur.'
cipher_rsa = PKCS1_OAEP.new(RSA.import_key(public_key))
ciphertext = cipher_rsa.encrypt(message)

# Desxifratge
cipher_rsa = PKCS1_OAEP.new(RSA.import_key(private_key))
plaintext = cipher_rsa.decrypt(ciphertext)

print(plaintext.decode('utf-8'))

Solució Exercici 3

from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256

# Generació de claus
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()

# Missatge a signar
message = b'Hola, aquest és un missatge signat.'
h = SHA256.new(message)

# Signatura
signature = pkcs1_15.new(RSA.import_key(private_key)).sign(h)

# Verificació de la signatura
try:
    pkcs1_15.new(RSA.import_key(public_key)).verify(h, signature)
    print("La signatura és vàlida.")
except (ValueError, TypeError):
    print("La signatura no és vàlida.")

Conclusió

La criptografia asimètrica és una eina poderosa per a la seguretat de la informació, permetent xifrar dades i verificar la identitat dels emissors sense la necessitat de compartir claus secretes. Tot i que és més lenta i complexa que la criptografia simètrica, els seus avantatges en termes de seguretat i autenticació la fan indispensable en moltes aplicacions modernes.

© Copyright 2024. Tots els drets reservats