ID TECH
Contatto
Tutti gli articoli tecnici

Post tecnico

Come decrittare 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 faccio a decifrarli?

La risposta è: occorre ottenere la chiave di sessione corretta per la transazione e utilizzarla per decrittare il payload dei dati tramite Triple-DES (o AES, a seconda dei casi).

Il processo di decrittazione in sé è sorprendentemente semplice. Potrete avvalervi di una delle numerose implementazioni open source esistenti di TDES o AES (non è necessario implementare autonomamente le routine crittografiche di base), operando in modalità CBC (Cipher Block Chaining) con un vettore iniziale predefinito composto da tutti byte zero. Disponendo della chiave di decrittazione a 16 byte corretta, il processo risulta semplice.

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

Benvenuti nel mondo del DUKPT

È fondamentale comprendere che nei lettori di carte di credito ogni transazione genera dati che vengono cifrati utilizzando una chiave diversa. La chiave è univoca 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 il DUKPT, è necessario conoscere il concetto di Key Serial Number, o KSN. L'aspetto principale da tenere a mente è che il KSN è un valore di 10 byte che cambia a 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, viene iniettato con una chiave a 16 byte e un KSN iniziale a 10 byte. La chiave iniettata è derivata da una chiave ultra-riservata (che non viene mai iniettata direttamente) chiamata BDK, o Base Derivation Key. (Poiché da un'unica BDK è possibile derivare numerose chiavi, è prassi comune — e ampiamente diffusa — iniettare centinaia o persino migliaia di lettori di carte con chiavi univoche generate da una singola 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 "namespace"), un hash (o chiave) prodotto da una determinata combinazione BDK+KSN sarà di fatto univoco per quel dispositivo. Inoltre, la BDK originale non può 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 il DUKPT, come avviene praticamente per tutti i lettori attuali) genera una chiave univoca a partire dal valore corrente del KSN e da un elemento denominato IPEK (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 ri-derivare la chiave di sessione relativa a quella transazione e recuperare i dati originali in chiaro. Si tratta di un processo cosiddetto simmetrico, poiché sia la parte che cifra sia quella che decifra devono già condividere lo stesso segreto (la BDK). Si presuppone che abbiate già fornito alla parte ricevente il "segreto" necessario affinché entrambe le parti 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 è sufficiente qualsiasi KSN del dispositivo in questione, poiché in questa fase il contatore verrà azzerato.)

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

1. Se il tuo BDK ha una dimensione di 16 byte, espandilo a 24 byte utilizzando il cosiddetto metodo EDE3. Ciò significa semplicemente: copia i primi 8 byte della chiave alla fine della chiave stessa, creando una chiave da 24 byte in cui il primo e l'ultimo gruppo di 8 byte sono identici.

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

Il risultato finale dovrà essere il seguente:

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

3. Ricava un valore di 8 byte dal KSN mascherato mantenendo solo 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 con TDES gli 8 byte del KSN mascherato ottenuti al Passaggio 3. A tal fine, utilizza un vettore iniziale composto interamente da zeri. (Si noti che in questo caso il cipher block chaining non è significativo, 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 utilizzi 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 l'operazione XOR tra i due valori in modo incrementale, pezzo per pezzo.)

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

7. Utilizzando il valore chiave di 24 byte del Passaggio 6, cifra con TDES gli 8 byte del KSN mascherato ottenuti al Passaggio 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 procedimento nel codice autonomamente, prova a generare un IPEK a partire da un valore chiave di test pari a 0123456789ABCDEFFEDCBA9876543210 e da un KSN di 62994900000000000001. L'IPEK risultante dovrebbe essere B5610650EBC24CA3CACDD08DDAFE8CE3.

Gestione delle chiavi vs. algoritmi di cifratura

Noterete, tra l'altro, che Triple-DES (TDES) viene utilizzato frequentemente in DUKPT. AES non viene mai impiegato in questo contesto (anche se il vostro lettore di carte è configurato per usare AES come metodo di cifratura). Lo standard X9.24 prevede l'uso di TDES e, in alcuni casi, del semplice DES. È importante tenere ben distinti nella propria mente il processo di derivazione delle chiavi DUKPT dalla fase di cifratura/decifratura dei dati di transazione. Nel primo caso si ricava una chiave; nel secondo la si utilizza per eseguire la codifica con TDES o AES. Nessuna routine di cifratura sa né si preoccupa di come sia stata ottenuta la chiave o di quali algoritmi siano stati usati 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 impiegata per farlo sarà derivata tramite DUKPT, che al suo interno utilizza 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 chiave di sessione DUKPT reale. Verranno mostrati esempi di codice sorgente che vi permetteranno di eseguire l'intera procedura in autonomia. Se non volete aspettare la prossima parte per consultare il codice sorgente, potete già dare 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 (con implementazioni open source di TDES e AES). Lo strumento di cifratura/decifratura permette di derivare chiavi DUKPT (in tutte e 3 le varianti: PIN, Data e MAC), cifrare o decifrare dati (con TDES o AES), generare diversi tipi di hash e molto altro ancora. Il vantaggio principale è che, trattandosi di una semplice pagina web, funziona su qualsiasi browser (e su qualsiasi piattaforma) che supporti JavaScript.

Volete derivare una chiave di sessione DUKPT nella variante data a partire da un KSN e un IPEK? Continuate con la Parte II di questo articolo.