La criptografia és la disciplina que permet protegir informació en presència d'adversaris: persones o sistemes que intenten llegir-la, alterar-la o suplantar-la. Per a un desenvolupador o un perfil TI, la criptografia no és un luxe acadèmic: és la base de les contrasenyes que emmagatzemes, dels tokens de sessió que emets, del cadenat que veu l'usuari al navegador i de la signatura que garanteix que un document no ha estat manipulat. En aquesta primera lliçó definirem què és (i què no és) la criptografia, veurem els quatre objectius que persegueix, farem un repàs històric brevíssim i presentarem el cas pràctic que ens acompanyarà durant tot el curs: MediNube, una plataforma SaaS fictícia d'historials mèdics.

Contingut

  1. Els quatre objectius de la criptografia
  2. Una mica d'història (molt poca): de Cèsar a la criptografia moderna
  3. Panorama de la criptografia moderna: simètrica, asimètrica i hashes
  4. El cas MediNube: el nostre fil conductor
  5. Un aperitiu en Python: el xifratge Cèsar
  6. Mapa del curs

Els quatre objectius de la criptografia

Quan algú diu "criptografia", gairebé tothom pensa en "missatges secrets". Però mantenir alguna cosa en secret és només un dels quatre objectius fonamentals. Convé memoritzar-los des del primer dia, perquè cada eina criptogràfica que veurem al curs existeix per complir un o diversos d'ells:

Objectiu Pregunta que respon Exemple quotidià Exemple a MediNube
Confidencialitat Pot llegir això només qui ho ha de fer? Ningú més llegeix els teus missatges de WhatsApp L'historial de la pacient Ana Pérez només el veuen els metges autoritzats de Clínica Sol
Integritat Ha estat modificada la dada des que es va crear? La descàrrega d'un instal·lador no està corrupta ni troianitzada Ningú ha canviat la dosi d'un medicament en una recepta emmagatzemada
Autenticitat Qui ha generat realment aquesta dada o missatge? L'SMS del teu banc és realment del teu banc La petició a l'API de MediNube ve de l'app oficial de Clínica Sol, no d'un impostor
No repudi Pot l'autor negar després haver-ho fet? Una signatura electrònica en un contracte La doctora que va signar una recepta electrònica no pot negar haver-la emès

Alguns matisos importants:

  • La confidencialitat no implica integritat. Un missatge pot ser il·legible per a un atacant i, tot i així, ser modificable a cegues. Aquest matís, que sorprèn gairebé tots els principiants, el veurem en profunditat en parlar de xifratge autenticat (mòdul 2).
  • Autenticitat i no repudi s'assemblen, però no són el mateix. Si tu i jo compartim una clau secreta, jo puc verificar que un missatge ve de tu (autenticitat entre nosaltres)... però no puc demostrar-ho a un jutge, perquè jo també podria haver-lo creat. El no repudi exigeix que només l'autor pugui produir la prova, i això requereix signatures digitals (mòdul 4).
  • Hi ha objectius secundaris (disponibilitat, anonimat, frescor dels missatges...) que tocarem quan apareguin, però aquests quatre són el nucli.

Un esquema mental útil:

graph TD
    C[Criptografia] --> O1[Confidencialitat<br/>només ho llegeix qui ho ha de fer]
    C --> O2[Integritat<br/>no ha estat alterat]
    C --> O3[Autenticitat<br/>ve de qui diu que ve]
    C --> O4[No repudi<br/>l'autor no ho pot negar]

Allò que la criptografia NO resol

Igual d'important és saber què queda fora:

  • No substitueix el control d'accés. Xifrar la base de dades no serveix de res si l'aplicació desxifra i mostra les dades a qualsevol usuari que hagi iniciat sessió.
  • No arregla programari vulnerable. Una injecció SQL es salta tot el xifratge del món, perquè ataca l'aplicació que ja té les dades en clar.
  • No protegeix contra un extrem compromès. Si el portàtil del metge té programari maliciós, l'atacant veu el mateix que el metge.

La criptografia és una peça (imprescindible) d'un sistema segur, no el sistema sencer.

Una mica d'història (molt poca)

No cal ser historiador per usar bé la criptografia, però tres fites ajuden a entendre per què la criptografia moderna és com és:

  • El xifratge Cèsar (~50 aC). Juli Cèsar desplaçava cada lletra de l'alfabet un nombre fix de posicions (amb desplaçament 3, la A esdevé D). És trivial de trencar: només hi ha 25 desplaçaments possibles en l'alfabet anglès, es proven tots en segons. Lliçó: un espai de claus petit és una sentència de mort.
  • Enigma (Segona Guerra Mundial). Una màquina electromecànica alemanya amb un espai de claus enorme per a l'època. Va ser trencada a Bletchley Park (amb Alan Turing entre d'altres) combinant errors d'operació, patrons predictibles en els missatges i màquines de càlcul. Lliçó: la teoria no n'hi ha prou; l'ús incorrecte i els patrons del missatge trenquen sistemes "forts". En veurem ressons als modes d'operació (mòdul 2).
  • La criptografia moderna (des de ~1970). Amb la publicació de DES, el treball de Diffie i Hellman (1976) i RSA (1977), la criptografia va passar d'art militar secret a ciència pública: algorismes publicats, analitzats per milers d'experts i amb seguretat basada en matemàtiques, no en el secret del mètode. Aquesta idea —que l'algorisme sigui públic i només la clau sigui secreta— és el principi de Kerckhoffs, al qual dedicarem la lliçó 01-04.

Amb això n'hi ha prou. Aquest és un curs aplicat: ens interessa la criptografia que es desplega avui, no l'arqueologia.

Panorama de la criptografia moderna

Tota la criptografia que faràs servir com a desenvolupador es recolza en tres grans famílies de primitives. Aquí només les presentem; cadascuna té el seu mòdul complet més endavant.

graph TD
    M[Criptografia moderna] --> S[Simètrica<br/>una clau compartida]
    M --> A[Asimètrica<br/>parell de claus pública/privada]
    M --> H[Funcions hash<br/>sense clau: empremta digital]
    S --> S1[Xifratge: AES, ChaCha20]
    S --> S2[Autenticació: HMAC]
    A --> A1[Xifratge i intercanvi de claus]
    A --> A2[Signatures digitals]
    H --> H1[Integritat, contrasenyes,<br/>identificadors]
Família Idea central Fortalesa Limitació principal Es desenvolupa a
Simètrica Emissor i receptor comparteixen la mateixa clau secreta Molt ràpida, apta per a gigabytes de dades Com comparteixen la clau dues parts que mai s'han vist? Mòdul 2
Asimètrica Cada part té un parell de claus: una pública (es difon) i una privada (mai surt) Resol l'intercanvi de claus i permet signatures Lenta i amb missatges de mida limitada; gairebé sempre es combina amb la simètrica Mòdul 4
Hash Funció sense clau que redueix qualsevol dada a una "empremta" de mida fixa, impossible d'invertir Detecta qualsevol alteració; base de contrasenyes i signatures Per si sola no dona confidencialitat ni autenticitat Mòdul 3

A la pràctica real gairebé mai s'usa una família aïllada: TLS (el protocol darrere d'HTTPS, mòdul 5) combina les tres, i el "xifratge híbrid" (mòdul 4) és exactament aquesta combinació. Queda't amb la foto general; els detalls arribaran en ordre.

Un flux clàssic emissor/receptor amb criptografia simètrica, per fixar el vocabulari que farem servir sempre (text en clar, text xifrat, clau):

sequenceDiagram
    participant E as Emissor (Clínica Sol)
    participant R as Receptor (MediNube)
    Note over E,R: Tots dos comparteixen una clau secreta K
    E->>E: xifrar(text en clar, K) → text xifrat
    E->>R: envia el text xifrat (canal insegur)
    R->>R: desxifrar(text xifrat, K) → text en clar
    Note over E,R: Un espia del canal només veu el text xifrat

El cas MediNube: el nostre fil conductor

Durant tot el curs treballarem sobre un mateix escenari, perquè cada tècnica tingui un context realista.

MediNube és una plataforma SaaS (fictícia) que gestiona historials mèdics per a clíniques privades. Els seus clients són clíniques com Clínica Sol o Centre Mèdic Luna; els seus usuaris finals són metges, personal administratiu i, a través d'un portal, pacients com Ana Pérez. Tu acabes d'incorporar-te a l'equip com a desenvolupador/a responsable de revisar i construir la seva capa de seguretat.

Què necessita MediNube de la criptografia? Pràcticament tot el catàleg:

Necessitat de MediNube Objectiu(s) que cobreix On ho construirem
Que els historials emmagatzemats no siguin llegibles si roben els discos o les còpies de seguretat Confidencialitat Mòduls 2 i 6 (xifratge en repòs)
Que les contrasenyes de metges i pacients no es filtrin encara que robin la base de dades Confidencialitat (de la contrasenya) Mòdul 3
Tokens de sessió i de recuperació de contrasenya imprevisibles Autenticitat, imprevisibilitat Lliçó 01-03 i mòdul 6 (JWT)
Que una recepta electrònica emesa per un metge sigui verificable i no falsificable Integritat, autenticitat, no repudi Mòdul 4 (signatures)
Que la comunicació navegador ↔ API viatgi protegida Confidencialitat, integritat, autenticitat Mòdul 5 (TLS)
Guardar i rotar les claus de tot l'anterior sense desastres (Transversal) Mòdul 6

Advertiment important: MediNube gestiona dades sanitàries, una categoria especialment protegida pel RGPD. En aquest curs fem servir sempre dades fictícies i exemples didàctics. Un desplegament real d'un sistema així requereix, a més d'una bona criptografia, una revisió per part de professionals de seguretat i de compliment normatiu (RGPD, ENS, normativa sanitària aplicable). Cap exemple d'aquest curs s'ha de copiar a producció sense aquesta revisió.

Un aperitiu en Python: el xifratge Cèsar

Per motivar el que ve, implementem el xifratge Cèsar. Compte: això és una joguina didàctica; mai protegiries res real amb això. Precisament per això és útil: ens permet veure un xifratge complet (algorisme + clau) i comprovar com de fàcil és trencar-lo.

def xifrar_cesar(text: str, desplacament: int) -> str:
    """Xifra un text desplaçant cada lletra un nombre fix de posicions."""
    resultat = []
    for caracter in text:
        if caracter.isalpha():
            # base és el codi del punt de partida: 'A' o 'a'
            base = ord('A') if caracter.isupper() else ord('a')
            # Desplacem dins l'alfabet de 26 lletres amb mòdul (%)
            nou = (ord(caracter) - base + desplacament) % 26 + base
            resultat.append(chr(nou))
        else:
            resultat.append(caracter)  # espais, dígits, etc. no es toquen
    return "".join(resultat)


def desxifrar_cesar(text: str, desplacament: int) -> str:
    """Desxifrar és xifrar amb el desplaçament oposat."""
    return xifrar_cesar(text, -desplacament)


missatge = "Pacient Ana Perez cita el dilluns"
clau = 3
xifrat = xifrar_cesar(missatge, clau)
print(xifrat)                          # Sdflhqw Dqd Shuhc flwd ho glooxqv
print(desxifrar_cesar(xifrat, clau))  # Pacient Ana Perez cita el dilluns

Desgranem el codi pas a pas:

  • ord(caracter) retorna el codi numèric del caràcter (per exemple, ord('A') és 65) i chr() fa l'operació inversa. Els xifratges treballen amb números, no amb lletres; aquesta conversió lletra ↔ número és el primer pas de gairebé tot.
  • (ord(caracter) - base + desplacament) % 26 primer converteix la lletra en un índex de 0 a 25 (restant base), després suma el desplaçament, i el mòdul 26 (%) fa que, en passar-nos de la Z, tornem a la A, com en una roda.
  • La clau és el desplaçament (aquí, 3). L'algorisme (desplaçar lletres) pot ser públic; el que hauria de ser secret és la clau.

I trencar-lo? No cal ni conèixer la clau: només hi ha 25 desplaçaments possibles, així que un atacant els prova tots (atac de força bruta):

xifrat = "Sdflhqw Dqd Shuhc flwd ho glooxqv"
for clau_possible in range(1, 26):
    print(clau_possible, desxifrar_cesar(xifrat, clau_possible))
# A la línia 3 apareix el text llegible: clau trobada.

Aquest bucle de cinc línies il·lustra la idea més important de la lliçó 01-03: la seguretat depèn de la mida de l'espai de claus. 25 claus es proven en microsegons; 2^128 claus (l'habitual en criptografia moderna) no es poden provar ni amb tots els ordinadors del planeta. També avança la lliçó 01-04: encara que haguéssim mantingut en secret "fem servir Cèsar", un atacant ho dedueix en minuts; el secret de l'algorisme no protegeix res.

A partir del mòdul 2 deixarem les joguines i farem servir la llibreria cryptography (del projecte pyca), l'estàndard de facto en Python per a criptografia seriosa. En aquest primer mòdul ens n'hi ha prou amb la llibreria estàndard (base64, secrets, os.urandom).

Mapa del curs

Així encaixa tot el que ve:

  1. Mòdul 1 (aquest): fonaments i vocabulari — què és xifrar i què no ho és (01-02), d'on surt l'aleatorietat que alimenta tot (01-03) i les regles d'or que mai trencarem (01-04).
  2. Mòdul 2: criptografia simètrica — AES, ChaCha20, modes d'operació, xifratge autenticat i derivació de claus. Amb això xifrarem els documents de MediNube.
  3. Mòdul 3: hashes, HMAC i emmagatzematge segur de contrasenyes d'usuaris.
  4. Mòdul 4: criptografia asimètrica — RSA, corbes el·líptiques, signatures digitals (receptes electròniques), Diffie-Hellman i xifratge híbrid.
  5. Mòdul 5: PKI, certificats X.509 i TLS: el cadenat del navegador, per dins.
  6. Mòdul 6: criptografia en el desenvolupament real — gestió de claus i secrets, xifratge en repòs/trànsit, JWT, errors comuns i una mirada a la criptografia postquàntica.

Errors Comuns i Consells

  • Confondre "xifrar" amb "segur". Xifrar amb un algorisme feble (o fer servir bé un algorisme fort però amb claus mal gestionades) dona una falsa sensació de seguretat pitjor que no xifrar, perquè relaxa la resta de controls.
  • Creure que la confidencialitat inclou la integritat. Són objectius diferents i s'aconsegueixen amb mecanismes diferents. Grava-t'ho ja: t'estalviarà l'error més comú del mòdul 2.
  • Fer servir "encriptar". És un anglicisme estès; en aquest curs farem servir el terme normatiu xifrar/desxifrar. El que importa no és el purisme, sinó que "desxifrar" (amb clau) i "criptoanalitzar" o "trencar" (sense clau) són coses diferents, i el vocabulari precís ajuda a pensar amb precisió.
  • Començar a programar criptografia sense identificar l'objectiu. Abans de triar una eina, pregunta't sempre: necessito confidencialitat, integritat, autenticitat, no repudi... o diverses? L'eina surt de la resposta, no a l'inrevés.
  • Consell: quan llegeixis documentació de seguretat, tradueix mentalment cada mecanisme a "quin dels quatre objectius cobreix?". És un exercici que ordena les idees de forma sorprenent.

Exercicis

Exercici 1. Per a cada situació de MediNube, indica quin objectiu o objectius criptogràfics hi ha en joc: (a) un atacant intercepta el trànsit entre el navegador d'un metge i l'API i llegeix les dades d'Ana Pérez; (b) algú amb accés a la base de dades canvia "500 mg" per "5000 mg" en una recepta emmagatzemada; (c) una pacient afirma que ella mai va autoritzar compartir el seu historial amb una altra clínica, tot i que hi ha un registre que ho demostra; (d) una app falsa es fa passar pel portal de pacients de MediNube.

Exercici 2. Modifica el bucle de força bruta del xifratge Cèsar perquè, en lloc d'imprimir els 25 candidats, retorni automàticament el més probable. Pista senzilla: el text correcte en català contindrà gairebé amb tota seguretat la paraula " el " o una proporció alta de vocals. Implementa l'heurística que prefereixis.

Exercici 3. El xifratge Cèsar té 25 claus útils. Un "xifratge de substitució general" assigna a cadascuna de les 26 lletres qualsevol altra lletra diferent (una permutació de l'alfabet). (a) Quantes claus possibles té? (b) Vol dir aquest número que sigui segur? Raona la resposta (pista: pensa en les freqüències de les lletres en català).

Solucions

Solució 1. (a) Confidencialitat (lectura no autoritzada en trànsit; ho resoldrà TLS, mòdul 5). (b) Integritat (modificació de dades emmagatzemades; hashes i MAC, mòdul 3, i xifratge autenticat, mòdul 2). (c) No repudi: cal poder demostrar que la pacient va realitzar l'acció, de manera que no la pugui negar; requereix signatura digital (mòdul 4), no n'hi ha prou amb un registre a la base de dades (que MediNube podria haver fabricat). (d) Autenticitat (verificar la identitat del servei; certificats i TLS, mòdul 5).

Solució 2. Una heurística simple i efectiva: puntuar cada candidat pel nombre d'aparicions de paraules freqüents.

def trencar_cesar(xifrat: str) -> tuple[int, str]:
    paraules_frequents = [" el ", " la ", " de ", " que ", " en "]
    millor = (0, 0, xifrat)  # (puntuacio, clau, text)
    for clau in range(1, 26):
        candidat = desxifrar_cesar(xifrat, clau)
        puntuacio = sum(candidat.lower().count(p) for p in paraules_frequents)
        if puntuacio > millor[0]:
            millor = (puntuacio, clau, candidat)
    return millor[1], millor[2]

print(trencar_cesar("Sdflhqw Dqd Shuhc flwd ho glooxqv"))  # (3, 'Pacient Ana Perez cita el dilluns')

Recorrem les 25 claus, desxifrem amb cadascuna i comptem aparicions de paraules molt comunes en català; la clau correcta produeix text real i guanya la puntuació. En textos molt curts l'heurística pot fallar: comptar freqüències de vocals o de les lletres E/A és més robust.

Solució 3. (a) És el nombre de permutacions de 26 elements: 26! ≈ 4 × 10^26, un espai de claus d'uns 88 bits — enorme, inabastable per força bruta. (b) No és gens segur. La força bruta no és l'únic atac: cada lletra del text en clar se substitueix sempre per la mateixa lletra xifrada, així que les freqüències de l'idioma (en català la E i la A dominen) es conserven en el text xifrat. Amb una anàlisi de freqüències, un text d'unes poques frases es trenca a mà en minuts. Moralitat clau del curs: un espai de claus gran és necessari, però no suficient; l'algorisme no ha de filtrar patrons del missatge. Hi tornarem amb els modes d'operació del mòdul 2.

Conclusió

En aquesta lliçó has adquirit el mapa i el vocabulari del curs: la criptografia persegueix confidencialitat, integritat, autenticitat i no repudi; es recolza en tres famílies de primitives (simètrica, asimètrica i hash) que es combinen entre elles; i la seva història ensenya dues lliçons que continuen vigents — l'espai de claus ha de ser enorme i el mal ús trenca sistemes teòricament forts. També has conegut MediNube, la plataforma d'historials mèdics la capa de seguretat de la qual anirem construint, i has vist amb el xifratge Cèsar que un xifratge és sempre algorisme + clau... i que un espai de 25 claus no protegeix res.

Abans de xifrar res de veritat necessitem desfer una confusió que causa vulnerabilitats reals cada dia: la diferència entre codificar, ofuscar i xifrar. Base64 apareixerà per tot arreu en aquest curs i no xifra absolutament res. Això és exactament el que veurem en la lliçó següent.

© Copyright 2026. Tots els drets reservats