Post tecnico
Strumenti per l'integrazione di dispositivi di pagamento: lo strumento Encrypt/Decrypt
ID TECH mette a disposizione una serie di eccellenti utility gratuite per chiunque sia coinvolto nello sviluppo di applicazioni di pagamento che utilizzano i nostri prodotti. In alcuni articoli recenti ho parlato di Parsomatic, il nostro parser di dati gratuito (implementato come modulo web), e di UDemo, l'app di test per SDK universale compatibile con tutti i nostri prodotti non legacy (implementata in C# per Windows). Sarebbe un'omissione non segnalarvi anche il nostro strumento Encrypt/Decrypt, che potete aprire nel browser facendo clic su questo link.
Lo strumento Encrypt/Decrypt è una potente applicazione HTML autonoma a pagina singola, con un'implementazione JavaScript nativa di crittografia AES, Triple DES, derivazione delle chiavi DUKPT, hashing SHA, HMAC e molto altro ancora. Tutta la logica è contenuta in un'unica pagina (senza componenti lato server), il che significa che è possibile scaricare il file HTML ed esaminare la logica direttamente nel browser (utilizzando, ad esempio, gli eccellenti strumenti per sviluppatori di Chrome).
Come si può vedere dallo screenshot precedente, il pulsante in alto dello strumento Encrypt/Decrypt apre un menu a discesa che mostra alcune delle operazioni disponibili. Una delle richieste più frequenti che riceviamo dai clienti è: "Come posso decrittografare i dati di traccia provenienti dal mio lettore?" (con riferimento alle informazioni di traccia della carta di credito che possono essere presenti nei dati MagStripe o far parte di un tag EMV). Tali dati sono tipicamente cifrati con AES o con la crittografia Triple DES (sebbene ID TECH supporti anche altri algoritmi). L'operazione può risultare leggermente complessa, non tanto per la decrittografia in sé, quanto per il modo in cui le chiavi vengono generate e utilizzate.
Nella maggior parte degli scenari con carte di credito nel settore, il lettore cifra i dati sensibili della carta utilizzando una chiave monouso univoca per ogni transazione. Si tratta del cosiddetto schema DUKPT . Nel DUKPT (Derived Unique Key Per Transaction), una nuova chiave viene derivata per ogni transazione, in modo che nessuna chiave possa essere utilizzata due volte (prevenendo così gli attacchi di replay). Il lettore viene inizializzato con una chiave univoca a 128 bit e, ogni volta che viene letta una carta, un contatore si incrementa. Il contatore è contenuto in un valore denominato Key Serial Number (KSN). Va tenuto presente che il KSN stesso è pubblico (verrà inviato, insieme ai dati cifrati, alla parte incaricata della decifratura, in uno scenario di decifratura reale). Al momento della transazione, il KSN viene combinato, tramite un algoritmo specifico, con la chiave di cifratura originale del lettore in modo tale da derivare una chiave nuova e univoca (utilizzando hash a senso unico, in modo che, qualora una determinata chiave venisse sottratta, non possa essere impiegata per calcolare nessun'altra chiave). L'algoritmo in questione è definito dallo standard ANSI X.9-24. Si tratta di uno schema di gestione delle chiavi simmetriche piuttosto ingegnoso, ma anche abbastanza complesso da implementare. Ecco perché lo abbiamo già fatto per voi. (Nota: il programma UDemo menzionato nel mio post precedente include anche una funzione di decifratura che gestisce la logica DUKPT, sebbene non sia fornito di codice sorgente.)
Per decifrare i dati di traccia cifrati, sono necessari il KSN della transazione, un BDK e i dati cifrati. Utilizzando lo strumento Encrypt/Decrypt Tool, è necessario selezionare "Encrypt or decrypt data" come mostrato nella schermata sopra, quindi fare clic sul pulsante Derive . . . che comparirà. Si aprirà una piccola finestra di dialogo in cui inserire il KSN (dieci byte in formato esadecimale) e una Base Derivation Key a 16 byte (che rappresenta la chiave originale utilizzata per creare la Initial PIN Encryption Key, o IPEK, iniettata nel lettore al momento della produzione). Per i test e lo sviluppo, la maggior parte degli utenti utilizza la cosiddetta chiave di test standard ANSI (con valore 0123456789ABCDEFFEDCBA9876543210) come BDK. Tale valore è il BDK predefinito nello strumento Encrypt/Decrypt Tool (anche se può essere facilmente modificato).
Dopo aver inserito un KSN a 10 byte (come byte esadecimali, con o senza spazi), è possibile selezionare la variante di chiave che si desidera generare (PIN, Data o MAC), quindi fare clic sul pulsante Derive Key pulsante. Verrà calcolata una chiave a 16 byte (che apparirà nella schermata principale). Se stai seguendo questa procedura in autonomia, potresti voler inserire un KSN pari a 62 99 49 01 19 00 00 00 00 02 (accettando il BDK predefinito), quindi fare clic su Derive Key e verificare di aver ottenuto un valore di chiave dati derivata pari a 1A994C3E09D9ACEF3EA9BD4381EFA334.
Con la chiave così ottenuta, è possibile decifrare un blocco di dati grezzi nel seguente formato:
DA 7F 2A 52 BD 3F 6D D8 B9 6C 50 FC 39 C7 E6 AF 22 F0 6E D1 F0 33 BE 0F B2 3D 6B D3 3D C5 A1 F8 08 51 2F 7A E1 8D 47 A6 0C C3 F4 55 9B 1B 09 35 63 BE 7E 07 45 90 72 AB F8 FA AB 53 38 C6 CC 88 15 FF 87 79 7A E3 A7 BE
Come mostrato di seguito nella sezione Output, i dati decifrati iniziano con '%B42' (si noti il tooltip, che contiene una lettura ASCII dei dati decifrati) e includono i dati della carta di un certo George W. Bush, Jr.:
Se anche solo un singolo bit della chiave fosse stato errato, avremmo ottenuto dati incomprensibili durante la decifratura. (Provalo tu stesso: esegui questo esempio nello strumento e modifica casualmente un bit nella chiave.)
Questo è solo un piccolo esempio di ciò che lo strumento Encrypt/Decrypt è in grado di fare. Per ulteriori dettagli sul funzionamento di DUKPT (e su come decifrare i dati delle carte di credito), ti consiglio di leggere il mio precedente post in due parti sull'argomento, a partire da qui.
Hai domande sull'iniezione delle chiavi? Sulla cifratura? Su MSR o EMV? Mettiti in contatto con i nostri esperti. Chiamaci in qualsiasi momento al 1-800-984-1010.
