Cuando se usa cifrado, no basta con un algoritmo robusto y una longitud de clave aceptable. Existen otros dos parámetros muy importantes que suelen olvidarse: el modo de cifrado y la parametrización del vector de inicialización (Initialization Vector, IV). Estos valores son críticos a la hora de proteger datos con una longitud fija, como un número de identificación personal (Personal Account Number – PAN).

El cifrado de datos y el problema con la generación de patrones

Los algoritmos de cifrado de bloques y de flujo (empleados para cifrar datos de longitud fija y variable, respectivamente) funcionan de una manera muy sencilla: reciben los datos a proteger y la clave para cifrarlos/descifrarlos, y emplean una rutina que cambia el orden de los datos (algoritmo de cifrado). Este conjunto se denomina un criptosistema:

No obstante, este modelo tiene una vulnerabilidad crítica: cuando se ejecutan rutinas de cifrado sobre un conjunto de datos limitado en tamaño y relativamente similares, empleando el mismo algoritmo y la misma clave, se pueden generar patrones que pueden ser usados como parte de un ataque (criptoanálisis). En el siguiente ejemplo, se presenta una rutina de cifrado de un bloque de cinco números de PAN consecutivos:

  • Algoritmo: TripleDES
  • Clave: 59c5b527f37ff7fbbd5b2478 (doble longitud – 128 bits incluyendo bits de paridad)
  • Modo de cifrado: ECB
  • Padding: Ninguno
  • Datos a cifrar: 16 caracteres decimales = 53 bits
  • Formato de criptograma: Hexadecimal
46565432898765203A70F5A513753CDE9CE209796E5DD990
46565432898765213A70F5A513753CDE41CBFF4CACA02930
46565432898765223A70F5A513753CDE4906E893316D0F31
46565432898765233A70F5A513753CDE9FEA240365279BFD
46565432898765243A70F5A513753CDE353E392C6BEAE5CF

Como se puede observar, en este proceso se identifica un patrón en la primera mitad del resultado, causado por el método que emplea TripleDES para cifrar los datos (divide los datos a cifrar en bloques de 64 bits y luego cifra/descifra/cifra cada bloque con las claves asociadas):

En este caso, cuando los datos son limitados, como en el caso de un PAN (cuya longitud es fija – 16 caracteres en la mayoría de los casos y sus dígitos iniciales son ampliamente conocidos ya que están asociados con las marcas de pago: 4 para Visa, 5 para MasterCard, etc.) y la clave de cifrado y el algoritmo son los mismos, este reuso de elementos afectará el criptograma final creando patrones, como se demostró arriba, afectando la seguridad provista por el cifrado. Debido a este problema (entre otros muchos), se pudo romper el cifrado de la máquina alemana ENIGMA.

Modos de cifrado

El caso explicado arriba es el mas simple de todos: Se toma un texto en claro, se divide en varios bloques de un tamaño fijo y cada bloque se cifra con la clave proporcionada, por lo que dos bloques de texto idénticos darán como resultado el mismo criptograma. Este modo de cifrado se denomina Electronic Code Book (ECB):

Para evitar este problema, se añadió un dato adicional al proceso de cifrado denominado vector de inicialización (Initialization Vector – IV). Este nuevo elemento se adiciona al criptosistema para añadir una capa de aleatoriedad en el proceso, evitando que dos bloques de datos iguales generen la misma salida. Obviamente, la clave de este proceso está en garantizar que el IV sea lo más aleatorio posible y que no sea reutilizado. Adicionalmente, es importante aclarar que el IV no debe ser necesariamente un dato secreto.

Dependiendo del formato y del momento en el cual el IV es usado, el NIST definió cinco (5) modos de cifrado para algoritmos de cifrado de bloques, listados en el documento NIST SP 800-38A Recommendation for Block Cipher Modes of Operation: Methods and Techniques:

  1. Electronic Codebook (ECB), en el que cada bloque de texto se cifra de forma independiente con la misma clave.
  2. Cipher Block Chaining (CBC), en el cual se combina un IV aleatorio con el primer bloque de texto en claro y su salida se combina con el siguiente bloque a cifrar.
  3. Cipher Feedback (CFB), en el cual el vector de inicialización es cifrado antes de ser combinado con el primer bloque de texto a cifrar y dicha salida es combinada con el siguiente bloque a cifrar.
  4. Output Feedback (OFB), similar a CFB, solo que el IV cifrado es combinado de forma independiente con cada bloque de texto en claro antes de ser cifrado.
  5. Counter (CTR), en el cual, en vez de usar un IV aleatorio se usa un contador que es incrementado durante el cifrado de cada bloque.

A continuación se presenta un ejemplo visual de la operación de CBC:

Las indicaciones para la generación segura del IV se describen en el Appendix C: Generation of Initialization Vectors del documento del NIST SP 800-38A.

Mediante el uso del vector de inicialización se evita la creación de patrones en los criptogramas generados, garantizando que cada criptograma es diferente sin importar que los bloques de texto en claro sean iguales:

Si se repite el proceso de cifrado del bloque de cinco números de PAN consecutivos empleados anteriormente, pero esta vez usando CBC y un IV diferente por cada operación de cifrado, se obtienen los siguientes resultados:

  • Algoritmo: TripleDES
  • Clave: 59c5b527f37ff7fbbd5b2478 (doble longitud – 128 bits incluyendo bits de paridad)
  • Modo de cifrado: CBC
  • Padding: Ninguno
  • Datos a cifrar: 16 caracteres decimales = 53 bits
  • Formato de criptograma: Hexadecimal
PANIVCriptograma
4656543289876520671b89995b7be45b8bc804dd3c0e395601525f6103e75974
4656543289876521309bf68859959c0cf2ff5fadd0cc5332453edc8743d19a1a
4656543289876522b991e9fed507d47979b5cc461a4c883e124d93371bf13183
46565432898765238623008e355c4725b6e57d387f34c2673c805cac92f049bd
4656543289876524661ee80ae9ad932a04ac1af1c9e221e8a06e0c555fe4ae99

Como se puede observar, mediante el uso de un IV aleatorio en cada ronda de cifrado, los datos resultantes (criptograma) son diferentes. Incluso,  si se cifra el mismo dato pero con diferente IV, el resultado va a variar, garantizando que no existirán patrones:

PANIVCriptograma
4656543289876520671b89995b7be45b8bc804dd3c0e395601525f6103e75974
465654328987652010b57a092c1766871884560ef41e4584d4a7baa5441a4ece

Recomendaciones del QSA

Para garantizar que las técnicas de criptografía empleadas para la protección de datos sensibles sean seguras, os recomiendo tener en cuenta los siguientes puntos:

  • Emplear un algoritmo de cifrado robusto con una longitud de clave aceptable, con base en las mejores prácticas de la industria. En este caso, evitar el uso de TripleDES y usar AES para el cifrado de bloques.
  • Emplear un modo de cifrado seguro. Como se comentó arriba, el uso de ECB puede dar pie al compromiso de los datos protegidos debido a la generación de patrones en los criptogramas. No obstante, se ha comprobado que otros modos de cifrado también son vulnerables, como es el caso de CBC, comprometido en ataques como Padding Oracle Attack. Por esta razon, se sugiere emplear modos más seguros y recientes, como es el caso de Galois/Counter Mode (GCM).
  • Usar los vectores de inicialización (IV) de forma segura: Para que un IV proporcione el nivel de seguridad esperado, se debe generar de forma segura (lo más aleatorio posible) y no ser reutilizado. El reuso del IV fue lo que dió paso al compromiso de Wired Equivalent Privacy, un protocolo de seguridad para la protección de redes inalámbricas. En ese caso, se empleaba una implementación débil del algoritmo de cifrado (RC4) junto con IVs cortos y reutilizados.
  • Si existen repositorios de datos sensibles cifrados con algoritmos considerados débiles y con ECB, se recomienda proceder con la migración de dicha información hacia un algoritmo robusto con un modo de cifrado fuerte.

Personalmente, recomiendo el uso de AES de 256 bits en modo GCM, empleando módulos de seguridad de hardware (HSMs) confiables.

Posted by David Acosta

Qualified Security Assessor (QSA) para PCI DSS, PCI PIN, PCI 3DS, P2PE y PCI TSP. CISSP, CISA, CISM, CRISC, C|EH, C|HFI.

Deja un comentario