ID TECH
Contatto
Tutti gli articoli tecnici

Post tecnico

Strumenti per l'integrazione di dispositivi di pagamento: strumento Encrypt/Decrypt

ID TECH mette a disposizione una serie di eccellenti utility gratuite per chiunque sia coinvolto nello sviluppo di applicazioni di pagamento utilizzando i nostri prodotti. In alcuni post recenti ho parlato di Parsomatic, il nostro parser di dati gratuito (implementato come modulo web), e di UDemo, l'app di test per Universal SDK compatibile con tutti i nostri prodotti non legacy (implementata in C# per Windows). Sarebbe un'omissione da parte mia non invitarvi anche a provare il nostro Strumento di Cifratura/Decifratura, che potete aprire nel browser facendo clic su questo link.

Lo Strumento di Cifratura/Decifratura è 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 esaminarne la logica direttamente nel browser (utilizzando, ad esempio, gli ottimi strumenti per sviluppatori di Chrome).

Come si può vedere dallo screenshot precedente, il pulsante in alto dello Strumento di Cifratura/Decifratura mostra un menu a discesa con alcune delle operazioni disponibili. Una richiesta che riceviamo frequentemente dai clienti è: "Come posso decifrare i dati di traccia provenienti dal mio lettore?" (riferendosi alle informazioni di traccia della carta di credito che possono comparire nei dati MagStripe o far parte di un tag EMV). Tali dati sono tipicamente cifrati con AES o con crittografia Triple DES (sebbene ID TECH supporti anche altri algoritmi). La decifratura può risultare un po' complessa, non tanto per l'operazione di decifratura 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 . In DUKPT (Derived Unique Key Per Transaction), viene derivata una nuova chiave per ogni transazione, in modo che nessuna chiave possa essere riutilizzata (prevenendo così gli attacchi di tipo 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). È importante tenere presente che il KSN è pubblico (in uno scenario di decifratura reale verrà trasmesso insieme ai dati cifrati alla parte che dovrà decifrarli). Al momento della transazione, il KSN viene combinato, tramite un apposito algoritmo, con la chiave del lettore originale chiave di cifratura in modo tale da derivare una chiave nuova e univoca (utilizzando hash a senso unico, in modo che, qualora una chiave specifica venisse compromessa, non possa essere utilizzata 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 al contempo non privo di complessità implementative. Ecco perché lo abbiamo già implementato per voi. (Nota: il programma UDemo citato nel mio precedente articolo include anche una funzione di decifratura che esegue l'elaborazione 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, occorre selezionare "Encrypt or decrypt data" come mostrato nella schermata precedente, quindi fare clic sul pulsante Derive . . . che comparirà a schermo. 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 generare l'Initial PIN Encryption Key, o IPEK, iniettata nel lettore al momento della sua configurazione iniziale). A scopo di test e 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 (anche se può essere facilmente sostituito).

Dopo aver inserito un KSN a 10 byte (in formato esadecimale, 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 . Verrà calcolata una chiave a 16 byte, che apparirà nella schermata principale. Se si desidera seguire la procedura in autonomia, si consiglia di 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 derivata pari a 1A994C3E09D9ACEF3EA9BD4381EFA334.

Con la chiave così ottenuta, è possibile decifrare un blocco di dati grezzi pari a:

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 bit della chiave fosse stato errato, avremmo ottenuto dati incomprensibili durante la decifratura. (Provate: eseguite questo esempio nello strumento e modificate casualmente un bit nella chiave.)

Questo è solo un piccolo assaggio 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), consultate il mio precedente articolo in due parti sull'argomento, a partire da qui.

Hai domande sull'iniezione delle chiavi? Sulla crittografia? Su MSR o EMV? Contatta i nostri esperti. Chiamaci in qualsiasi momento al 1-800-984-1010.