ID TECH
Contatto
Tutti gli articoli tecnici

Post tecnico

Come decifrare i dati delle carte di credito, Parte I

Una domanda ricorrente è: i dati di traccia che ricevo dal mio lettore di carte di credito ID TECH sono cifrati. Come posso decifrarli?

La risposta è: è necessario ottenere la chiave di sessione appropriata per la transazione, quindi utilizzarla per decifrare il payload dei dati tramite Triple-DES (o AES, a seconda dei casi).

Il processo di decifratura in sé è piacevolmente semplice. Nella maggior parte dei casi si utilizzerà una delle numerose implementazioni open source di TDES o AES già disponibili (non è necessario implementare da zero le routine crittografiche di base), operando in modalità CBC (Cipher Block Chaining) con un vettore iniziale predefinito composto da tutti byte zero. Avendo a disposizione la corretta chiave di decifratura a 16 byte, il processo risulta semplice.

La parte più complessa riguarda la derivazione della chiave. A tal fine, è necessario comprendere lo standard ANSI X9.24-1, noto anche come DUKPT.

Benvenuti nel mondo di DUKPT

È importante capire che nei lettori di carte di credito, ogni transazione genera dati che vengono cifrati utilizzando una chiave diversa. La chiave è unica per ogni singola transazione (da cui l'acronimo DUKPT: Derived Unique Key Per Transaction). Nessuna chiave viene mai utilizzata due volte. Di conseguenza, gli attacchi di tipo replay sono sostanzialmente impossibili.

Per capire come funziona DUKPT, è necessario conoscere il concetto di Key Serial Number, o KSN. L'aspetto fondamentale da sapere è che il KSN è un valore di 10 byte che cambia ad ogni transazione, poiché i 21 bit meno significativi costituiscono un contatore.

Struttura del Key Serial Number.

Da ricordare: ogni transazione con carta cifrata include un KSN. Il KSN ha sempre una lunghezza di 10 byte e viene sempre trasmesso in chiaro, poiché il KSN, di per sé, non rivela alcuna informazione sensibile (pur essendo indispensabile per derivare una chiave di sessione).

Quando un lettore di carte viene configurato per la cifratura in fabbrica, vi vengono iniettati una chiave di 16 byte e un KSN iniziale di 10 byte. La chiave iniettata è derivata da una chiave ultra-segreta (che non viene mai iniettata direttamente) denominata BDK, o Base Derivation Key. (Si noti che, poiché da un'unica BDK è possibile derivare numerose chiavi, è pratica comune iniettare centinaia o persino migliaia di lettori di carte con chiavi univoche che derivano tutte da un'unica BDK.) Il processo di derivazione richiede a sua volta l'utilizzo di un KSN. Poiché il KSN contiene informazioni sul numero di serie del dispositivo (oltre a numerose altre informazioni di tipo "namespace"), un hash (o chiave) prodotto da una determinata combinazione BDK+KSN sarà essenzialmente univoco per quel dispositivo. Inoltre, la BDK originale non può mai essere ricavata a ritroso dall'hash (anche conoscendo il KSN), poiché si tratta di un hash crittograficamente sicuro e unidirezionale.

Ogni volta che viene effettuata una transazione, il lettore di carte (se supporta DUKPT, come praticamente tutti i lettori di carte oggi in commercio) genera una chiave univoca a partire dal valore KSN corrente e da un elemento denominato IPEK (o Initial PIN Encryption Key). La chiave di sessione monouso risultante viene quindi utilizzata per cifrare le parti sensibili dei dati della transazione.

Una volta cifrati, i dati della transazione non vengono mai decifrati fino al raggiungimento della destinazione autorizzata, che può essere l'emittente della carta. La parte ricevente (ad esempio, l'emittente) utilizzerà la propria copia della BDK (insieme al KSN della transazione) per derivare nuovamente la chiave di sessione e recuperare i dati originali (in chiaro) della transazione. Si tratta di un processo cosiddetto simmetrico, poiché sia la parte che cifra sia quella che decifra devono già conoscere lo stesso segreto (la BDK). Si presuppone che la parte ricevente sia già stata fornita del "segreto" necessario affinché entrambe possano decifrare i messaggi.

L'IPEK

Il punto di partenza per ottenere una chiave di sessione DUKPT è sempre la derivazione dell'IPEK, ovvero la chiave iniziale, operazione possibile solo se si conosce la BDK originale e il KSN. (In questo caso, qualsiasi KSN del dispositivo in questione è utilizzabile, poiché in questa fase il contatore verrà azzerato.)

Per derivare una chiave di cifratura PIN iniziale (IPEK), è necessario eseguire le seguenti operazioni:

1. Se la BDK ha una dimensione di 16 byte, espanderla a 24 byte utilizzando il cosiddetto metodo EDE3. Questo significa semplicemente: copiare i primi 8 byte della chiave in coda alla chiave stessa, creando una chiave di 24 byte in cui il primo e l'ultimo blocco di 8 byte sono identici.

Se la tua chiave originale (in esadecimale) si presenta così:

L'obiettivo è che si presenti così:

2. Maschera il tuo KSN iniziale di 10 byte eseguendo un'operazione AND con il valore esadecimale 0xFFFFFFFFFFFFFFE00000. Il risultato verrà chiamato "KSN mascherato."

3. Ricava un valore di 8 byte dal KSN mascherato mantenendo soltanto i primi 8 byte (quelli più a sinistra) del KSN mascherato di 10 byte. In altre parole, elimina i due byte più a destra.

4. Utilizzando il tuo BDK espanso di 24 byte come chiave, cifra in TDES gli 8 byte del KSN mascherato ottenuto al Passo 3. A tal fine, imposta un vettore iniziale composto da tutti zeri. (Si noti che il concatenamento a blocchi cifrati non è significativo in questo caso, poiché i dati consistono in un unico blocco di 8 byte.) Conserva il cifrario di 8 byte ottenuto in questo passaggio, poiché diventerà la metà sinistra dell'IPEK a 16 byte.

5. Per ottenere la metà destra dell'IPEK, esegui prima un'operazione XOR tra il tuo BDK originale di 16 byte e il valore esadecimale 0xC0C0C0C000000000C0C0C0C000000000. (Se stai utilizzando un linguaggio di programmazione che supporta la matematica a grandi interi, questa operazione può essere eseguita in una sola riga di codice. In caso contrario, sarà necessario eseguire lo XOR tra i due valori in modo incrementale, pezzo per pezzo.)

6. Espandi con EDE3 il valore di 16 byte ottenuto al Passo 5, per ricavare un valore di chiave di 24 byte.

7. Utilizzando il valore di chiave di 24 byte del Passo 6, cifra in TDES gli 8 byte del KSN mascherato ottenuto al Passo 3. Questo costituisce ora la metà destra dell'IPEK.

8. Concatena le metà sinistra e destra dell'IPEK. A questo punto disponi dell'IPEK finale di 16 byte.

Se stai implementando questo processo nel codice, prova a generare un IPEK partendo da un valore di chiave di test pari a 0123456789ABCDEFFEDCBA9876543210 e da un KSN di 62994900000000000001. L'IPEK risultante dovrebbe essere B5610650EBC24CA3CACDD08DDAFE8CE3.

Gestione delle chiavi e algoritmi di cifratura

Noterai che Triple-DES (TDES) viene utilizzato frequentemente in DUKPT. AES non viene mai impiegato (anche se il lettore di carte è configurato per utilizzare AES nella cifratura). Lo standard X9.24 prevede l'uso di TDES e, in alcuni casi, del semplice DES. È fondamentale tenere ben distinto il processo di derivazione delle chiavi DUKPT dal processo di cifratura/decifratura dei dati di transazione. Nel primo caso si deriva una chiave; nel secondo si utilizza quella chiave per la codifica TDES o AES. Nessuna routine di cifratura sa né si preoccupa dell'origine della chiave o degli algoritmi utilizzati per costruirla: l'unica cosa che conta è che la chiave funzioni. Pertanto, anche se i dati da sbloccare sono stati cifrati con AES, la chiave utilizzata per sbloccarli sarà derivata tramite DUKPT, che internamente si avvale di TDES.

Dov'è il codice?

Nella Parte II di questo articolo, entreremo nel dettaglio su come utilizzare un IPEK insieme a un KSN per ricavare una vera chiave di sessione DUKPT. Vedremo il codice sorgente effettivo, così potrete replicare l'intero processo autonomamente. Se non volete aspettare la prossima puntata per vedere il codice sorgente, date un'occhiata al nostro popolare Strumento di Cifratura/Decifratura, che contiene un'implementazione JavaScript completamente funzionale degli algoritmi DUKPT di cui parlerò nella Parte II (completa di implementazioni open-source di TDES e AES). Lo strumento di Cifratura/Decifratura consente di derivare chiavi DUKPT (in tutte e 3 le varianti: PIN, Data e MAC), cifrare o decifrare dati (con TDES o AES), generare vari tipi di hash e molto altro ancora. Il vantaggio principale è che, trattandosi di una semplice pagina web, funziona in qualsiasi browser (su qualsiasi piattaforma) che supporti JavaScript.

Volete derivare una chiave di sessione DUKPT in variante dati a partire da un KSN e un IPEK? Continua alla Parte II di questo articolo.