Post Técnico
Como Descriptografar Dados de Cartão de Crédito, Parte I
Uma dúvida muito comum é: os dados de trilha que estou recebendo do meu leitor de cartão de crédito ID TECH estão criptografados. Como faço para descriptografá-los?
A resposta é: você precisa obter a chave de sessão adequada para a transação e, em seguida, utilizá-la para descriptografar o payload de dados via Triple-DES (ou AES, conforme aplicável).
O processo de descriptografia em si é surpreendentemente simples. Você provavelmente utilizará uma das diversas implementações de código aberto disponíveis para TDES ou AES (não há necessidade de implementar as rotinas criptográficas do zero), operando no modo CBC (Cipher Block Chaining), com um vetor inicial padrão composto inteiramente de bytes zero. Supondo que você possua a chave de descriptografia de 16 bytes correta, o processo de descriptografia é simples.
A parte mais complexa é derivar a chave. Para isso, você precisará compreender o ANSI X9.24-1, também conhecido como DUKPT.
Bem-vindo ao Mundo do DUKPT
É importante entender que, nos leitores de cartão de crédito, cada transação gera dados que serão criptografados com uma chave diferente. Essa chave é exclusiva para uma determinada transação (daí o acrônimo DUKPT: Derived Unique Key Per Transaction). Nenhuma chave é utilizada duas vezes. Como resultado, ataques de repetição são essencialmente impossíveis.
Para entender como o DUKPT funciona, é necessário conhecer um pouco sobre o conceito de Número de Série de Chave, ou KSN. O principal a saber é que o KSN é um valor de 10 bytes que muda a cada transação, pois os 21 bits inferiores compõem um contador.
Layout do Número de Série de Chave.
Lembre-se: toda transação de cartão criptografada inclui um KSN. O KSN tem sempre 10 bytes de comprimento. E é sempre transmitido em texto claro, pois o KSN, por si só, não revela informações sensíveis (mas é essencial para derivar uma chave de sessão).
Quando um leitor de cartão é configurado para criptografia na fábrica, ele recebe a injeção de uma chave de 16 bytes e um KSN inicial de 10 bytes. A chave injetada é derivada de uma chave ultrassecreta (que jamais é injetada) chamada BDK, ou Base Derivation Key. (Note que, como muitas chaves podem ser derivadas de um único BDK, é possível — e de fato comum — injetar centenas ou até milhares de leitores de cartão com chaves únicas originadas de um único BDK.) O próprio processo de derivação requer o uso de um KSN. Como o KSN contém informações sobre o número de série do dispositivo (além de diversas outras informações de "namespace"), um hash (ou chave) produzido a partir de uma combinação BDK+KSN específica será essencialmente exclusivo para aquele dispositivo. Além disso, o BDK original nunca pode ser recalculado a partir do hash (mesmo que se conheça o KSN), pois estamos falando de um hash unidirecional criptograficamente seguro.
Sempre que uma transação ocorre, o leitor de cartão (caso suporte DUKPT, como praticamente todos os leitores atuais) gera uma chave exclusiva a partir do valor atual do KSN e de algo chamado IPEK (ou Initial PIN Encryption Key). A chave de sessão de uso único resultante é então utilizada para criptografar as partes sensíveis dos dados da transação.
Uma vez criptografados, os dados da transação não são descriptografados novamente até chegar ao destino autorizado, que pode ser o emissor do cartão. A parte receptora (por exemplo, o emissor) utilizará sua própria cópia do BDK (mais o KSN da transação) para rederiver a chave de sessão da transação e recuperar os dados originais (descriptografados). Trata-se de um processo chamado simétrico, pois tanto a parte que criptografa quanto a que descriptografa precisam conhecer previamente o mesmo segredo (o BDK). Presume-se que você já terá fornecido à parte receptora o "segredo" necessário para que ambos possam descriptografar as mensagens.
O IPEK
O ponto de partida para obter uma chave de sessão DUKPT é sempre derivar o IPEK, ou chave inicial, o que só é possível se você conhecer o BDK original e o KSN. (Aqui, qualquer KSN do dispositivo em questão funcionará, pois o contador será zerado nesta etapa.)
Para derivar uma chave de criptografia PIN inicial (IPEK), é necessário executar os seguintes passos:
1. Se o seu BDK tiver 16 bytes, expanda-o para 24 bytes utilizando o método chamado EDE3. Isso significa simplesmente: copie os primeiros 8 bytes da chave e adicione-os ao final, criando uma chave de 24 bytes na qual os primeiros e os últimos 8 bytes são idênticos.
Se a sua chave original (em hex) tiver esta aparência:
Você quer que ela fique com esta aparência:
2. Mascare o KSN inicial de 10 bytes aplicando um AND com o valor hex 0xFFFFFFFFFFFFFFE00000. Chamaremos o resultado de "KSN mascarado."
3. Crie um valor de 8 bytes a partir do KSN mascarado, retendo apenas os primeiros 8 bytes (os mais à esquerda) do KSN mascarado de 10 bytes. Em outras palavras, elimine os dois bytes mais à direita.
4. Usando sua BDK expandida de 24 bytes como chave, faça a criptografia TDES dos 8 bytes do KSN mascarado obtidos no Passo 3. Utilize um vetor inicial de zeros para isso. (Observe que o encadeamento de blocos de cifra não é relevante aqui, pois os dados neste caso têm apenas um bloco de comprimento: 8 bytes.) Guarde os 8 bytes de cifra obtidos nesta etapa, pois eles se tornarão a metade esquerda do IPEK de 16 bytes.
5. Para obter a metade direita do IPEK, primeiro aplique XOR à sua BDK original de 16 bytes contra o valor hex 0xC0C0C0C000000000C0C0C0C000000000. (Se você estiver usando uma linguagem de programação que suporte aritmética de grandes inteiros, isso pode ser feito em uma única linha de código. Caso contrário, será necessário aplicar o XOR aos dois valores de forma incremental, trecho por trecho.)
6. Expanda via EDE3 o valor de 16 bytes obtido no Passo 5 para obter um valor de chave de 24 bytes.
7. Usando o valor de chave de 24 bytes do Passo 6, faça a criptografia TDES dos 8 bytes do KSN mascarado obtidos no Passo 3. Este é agora a metade direita do IPEK.
8. Concatene as metades esquerda e direita do IPEK. Você agora tem o IPEK final de 16 bytes.
Se você estiver implementando isso em código por conta própria, tente gerar um IPEK a partir de um valor de chave de teste 0123456789ABCDEFFEDCBA9876543210 e um KSN de 62994900000000000001. O IPEK resultante deverá ser B5610650EBC24CA3CACDD08DDAFE8CE3.
Gerenciamento de Chaves vs. Algoritmos de Criptografia
Você vai notar, aliás, que o Triple-DES (TDES) é amplamente utilizado no DUKPT. Em nenhum momento o AES é empregado (mesmo que o seu leitor de cartão esteja configurado para usar AES na criptografia). O padrão X9.24 requer TDES e, por vezes, DES simples. Tenha bem claro em mente que o processo de derivação de chaves do DUKPT é completamente separado do processo de criptografia/descriptografia dos dados de transação. Em um caso, você está derivando uma chave. No outro, você está usando essa chave para realizar a codificação em TDES ou AES. Nenhuma rotina de criptografia sabe ou se importa de onde veio sua chave, nem quais algoritmos foram usados para construí-la; o único fator relevante é que a própria chave funcione. Portanto, embora os dados que você precisa desbloquear possam ter sido criptografados com AES, a chave utilizada para desbloqueá-los será derivada usando DUKPT, que internamente utiliza TDES.
Onde Está o Código?
Na Parte II deste artigo, entraremos em detalhes sobre como usar um IPEK mais um KSN para derivar uma chave de sessão DUKPT real. Veremos o código-fonte completo para que você possa fazer tudo isso por conta própria. Se não quiser esperar até a próxima parte para ver o código-fonte, fique à vontade para conferir nossa popular Ferramenta de Criptografia/Descriptografia, que contém uma implementação JavaScript totalmente funcional dos algoritmos DUKPT sobre os quais falarei na Parte II (com implementações de código aberto de TDES e AES). Você pode usar a Ferramenta de Criptografia/Descriptografia para derivar chaves DUKPT (nas 3 variantes: PIN, Data e MAC), criptografar ou descriptografar dados (com TDES ou AES), gerar diversos tipos de hashes e muito mais. E o melhor: como a ferramenta é apenas uma página web, ela funciona em qualquer navegador (em qualquer plataforma) que suporte JavaScript.
Quer derivar uma chave de sessão DUKPT na variante de dados a partir de um KSN e um IPEK? Continuar para a Parte II deste artigo.
