ID TECH
Contato
Todos os posts técnicos

Post Técnico

Como Descriptografar Dados de Cartão de Crédito, Parte I

Uma dúvida muito frequente é: 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 correta 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 de criptografia principais do zero), operando no modo CBC (Cipher Block Chaining), com um vetor inicial padrão composto inteiramente por bytes zero. Supondo que você tenha a chave de descriptografia de 16 bytes correta, o processo é simples.

A parte mais complexa é derivar a chave. Para isso, você precisará compreender o padrão ANSI X9.24-1, também conhecido como DUKPT.

Bem-vindo ao Mundo do DUKPT

É importante entender que, em 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, é preciso conhecer um pouco sobre o conceito de Número de Série da Chave, ou KSN. O principal a saber é que o KSN é um valor de 10 bytes que muda a cada transação, uma vez que os 21 bits inferiores compõem um contador.

Layout do Número de Série da Chave.

Lembre-se: toda transação de cartão criptografada vem acompanhada de 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 nenhuma informação sensível (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 nunca é injetada diretamente) chamada BDK, ou Base Derivation Key. (Observe que, como muitas chaves podem ser derivadas de um único BDK, é possível — e, na prática, 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 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 trata-se de um hash criptograficamente seguro e unidirecional.

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 resultante, de uso único, é então utilizada para criptografar as partes sensíveis dos dados da transação.

Uma vez criptografados, os dados da transação nunca são descriptografados até chegarem 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 seu 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 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 funciona, pois o contador será zerado nesta etapa.)

Para derivar uma chave inicial de criptografia de PIN (IPEK), é necessário seguir os seguintes passos:

1. Se o seu BDK tiver 16 bytes, expanda-o para 24 bytes usando o método chamado EDE3. Isso significa simplesmente: copie os primeiros 8 bytes da chave para o final da chave, criando uma chave de 24 bytes em que os primeiros e os últimos 8 bytes são iguais.

Se a sua chave original (em hexadecimal) for assim:

O resultado deve ficar assim:

2. Mascare o seu KSN inicial de 10 bytes aplicando a operação AND com o valor hexadecimal 0xFFFFFFFFFFFFFFE00000. O resultado será chamado de "KSN mascarado."

3. Crie um valor de 8 bytes a partir do KSN mascarado, retendo apenas os primeiros 8 bytes (ou seja, os mais à esquerda) do KSN mascarado de 10 bytes. Em outras palavras, descarte os dois bytes mais à direita.

4. Usando o seu BDK expandido de 24 bytes como chave, cifre com TDES os 8 bytes do KSN mascarado obtidos no Passo 3. Utilize um vetor de inicialização composto inteiramente por zeros. (Observe que o encadeamento de blocos de cifra não é relevante aqui, pois os dados neste caso correspondem a apenas um bloco: 8 bytes.) Guarde o cifrador de 8 bytes obtido nesta etapa, pois ele se tornará a metade esquerda do IPEK de 16 bytes.

5. Para obter a metade direita do IPEK, primeiro aplique XOR entre o seu BDK original de 16 bytes e o valor hexadecimal 0xC0C0C0C000000000C0C0C0C000000000. (Se 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 de forma incremental, trecho por trecho.)

6. Aplique a expansão EDE3 ao 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, cifre com TDES os 8 bytes do KSN mascarado obtidos no Passo 3. Este será a metade direita do IPEK.

8. Concatene as metades esquerda e direita do IPEK. Você agora possui o IPEK final de 16 bytes.

Se estiver implementando isso em código, 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

Vale observar, aliás, que o Triple-DES (TDES) é amplamente utilizado no DUKPT. O AES nunca é empregado em nenhum momento (mesmo que o seu leitor de cartão esteja configurado para usar AES na criptografia). O padrão X9.24 exige o uso de TDES e, em alguns casos, do 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 da transação. Em um caso, você está derivando uma chave. No outro, você está usando essa chave para realizar a codificação com TDES ou AES. Nenhuma rotina de criptografia sabe ou se importa de onde veio a sua chave, nem quais algoritmos foram utilizados 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 por meio do DUKPT, que internamente utiliza TDES.

Onde está o Código?

Na Parte II desta publicação, entraremos em detalhes sobre como usar um IPEK em conjunto com um KSN para derivar uma chave de sessão DUKPT real. Apresentaremos o código-fonte completo para que você possa realizar todo o processo por conta própria. Se não quiser esperar até a próxima parte para ver o código-fonte, sinta-se à vontade para conferir nossa popular Ferramenta de Criptografia/Descriptografia, que contém uma implementação JavaScript totalmente funcional dos algoritmos DUKPT que abordarei 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, Dados e MAC), criptografar ou descriptografar dados (com TDES ou AES), gerar diferentes tipos de hashes e muito mais. O melhor de tudo é que, por se tratar apenas de uma página web, a ferramenta funcionará em qualquer navegador (em qualquer plataforma) que suporte JavaScript.

Deseja derivar uma chave de sessão DUKPT na variante de dados a partir de um KSN e de um IPEK? Continue para a Parte II deste artigo.