Publicación técnica
Herramientas para la integración de dispositivos de pago: herramienta de cifrado/descifrado
ID TECH pone a disposición varias utilidades gratuitas excelentes para cualquier persona involucrada en el desarrollo de aplicaciones de pago con nuestros productos. En publicaciones recientes, hablé sobre Parsomatic, nuestro analizador de datos gratuito (implementado como formulario web), y UDemo, la aplicación de prueba del Universal SDK que funciona con todos nuestros productos no heredados (implementada en C# para Windows). Sería un error no animarte también a probar nuestra herramienta de cifrado/descifrado, que puedes cargar en tu navegador haciendo clic en este enlace.
La herramienta de cifrado/descifrado es una potente aplicación HTML de una sola página y autónoma, con una implementación nativa en JavaScript de cifrado AES, Triple DES, derivación de claves DUKPT, hash SHA, HMAC y mucho más. Toda la lógica está contenida en una sola página (no hay componentes del lado del servidor), lo que significa que puedes descargar el archivo HTML e inspeccionar la lógica directamente en tu navegador (usando, por ejemplo, las excelentes herramientas para desarrolladores de Chrome).
Como puedes ver en la captura de pantalla anterior, el botón superior de la herramienta de cifrado/descifrado muestra un menú desplegable con algunas de las acciones que puedes realizar con ella. Una pregunta frecuente de nuestros clientes es: «¿Cómo puedo descifrar los datos de pista que provienen de mi lector?» (refiriéndose a la información de pista de la tarjeta de crédito que puede aparecer en datos de banda magnética o formar parte de una etiqueta EMV). Estos datos suelen cifrarse con AES o con cifrado Triple DES (aunque ID TECH también admite otros algoritmos). Descifrar dichos datos puede resultar algo complicado, no por la operación de descifrado en sí, sino por cómo se generan y se utilizan las claves.
En la mayoría de los escenarios con tarjetas de crédito del sector, el lector cifra los datos sensibles de la tarjeta utilizando una clave de un solo uso, exclusiva de cada transacción. Este es el llamado esquema DUKPT . En DUKPT (Derived Unique Key Per Transaction), se deriva una nueva clave para cada transacción, de modo que ninguna clave pueda utilizarse dos veces (lo que evita ataques de repetición). El lector parte de una clave única de 128 bits y, cada vez que se lee una tarjeta, se incrementa un contador. Ese contador forma parte de un valor llamado Key Serial Number (KSN). Ten en cuenta que el propio KSN es público. (Se enviará, junto con los datos cifrados, a la parte que realiza el descifrado, en un escenario real). En el momento de la transacción, el KSN se combina, mediante un algoritmo especial, con la clave de cifrado original del lector de forma que se deriva una nueva clave única (mediante hashes unidireccionales, de modo que si alguna clave es robada, no pueda usarse para calcular otras claves). El algoritmo en cuestión está definido por ANSI X.9-24. Es un esquema de gestión de claves simétricas bastante ingenioso, pero también algo complicado de implementar. Por eso lo hemos hecho por ti. (Nota: el programa UDemo mencionado en mi última publicación también contiene una función de descifrado que realiza la magia de DUKPT, aunque no incluye código fuente).
Para descifrar datos de pista cifrados, necesitas el KSN de la transacción, una BDK y los datos cifrados. Con la herramienta de cifrado/descifrado, elegirías «Encrypt or decrypt data» como se muestra en la captura anterior, y luego harías clic en el pequeño botón Derivar . . . que aparece. Esto abre un pequeño cuadro de diálogo donde introduces el KSN (diez bytes hexadecimales) y una Base Derivation Key de 16 bytes (que representa la clave original utilizada para crear la Initial PIN Encryption Key, o IPEK, inyectada en el lector durante su fabricación). Para pruebas y desarrollo, la mayoría utiliza la denominada clave de prueba estándar ANSI (con valor 0123456789ABCDEFFEDCBA9876543210) como BDK. Ese valor es el BDK predeterminado en la herramienta de cifrado/descifrado (aunque puede sustituirse fácilmente).
Tras introducir un KSN de 10 bytes (como bytes hexadecimales, con o sin espacios), puedes seleccionar la variante de clave que deseas generar (PIN, Data o MAC) y luego hacer clic en el botón grande Derivar clave . Se calculará una clave de 16 bytes (que aparecerá en la pantalla principal). Si quieres seguir el ejemplo en casa, introduce un KSN de 62 99 49 01 19 00 00 00 00 02 (y acepta la BDK predeterminada), luego haz clic en Derivar clave y comprueba que has obtenido un valor de clave de datos derivada de 1A994C3E09D9ACEF3EA9BD4381EFA334.
Con la clave así obtenida, es posible descifrar un bloque de datos en bruto de:
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
Como se muestra a continuación en Output, los datos descifrados comienzan con «%B42» (observa el tooltip, que contiene una lectura ASCII de los datos descifrados) y contienen los datos de la tarjeta del Sr. George W. Bush, Jr.:
Si tan solo un bit de la clave hubiera sido incorrecto, habríamos obtenido datos irreconocibles durante el descifrado. (Pruébalo: ejecuta este ejemplo en la herramienta y cambia aleatoriamente un bit de la clave).
Esto es solo una pequeña muestra de lo que puede hacer la herramienta de cifrado/descifrado. Para más detalles sobre cómo funciona DUKPT (y cómo descifrar datos de tarjetas de crédito), no dejes de consultar mi publicación anterior en dos partes sobre el tema, empezando aquí.
¿Tienes preguntas sobre inyección de claves? ¿Cifrado? ¿MSR o EMV? Ponte en contacto con nuestros expertos. Llámanos en cualquier momento al 1-800-984-1010.
