Aclaro que este post esplica de forma educativa y didactica
Como funciona el IRD y la tarjeta de DIRECTV
TODO PARA LEER
Dentro de la KnowledgeTest DirecTV Cero
Cero-conocimiento protocolos permiten que las operaciones de identificación, el intercambio de claves criptográficas y otros servicios básicos que se apliquen sin "filtrar" información secreta durante la "conversación" y con menores necesidades de cálculo que el uso de protocolos similares de clave pública. Es por estas razones que el conocimiento cero protocolos parecen muy atractivos, especialmente para su uso en las tarjetas inteligentes.
La F, H y tarjetas HU han utilizado la misma prueba de conocimiento cero (ZKT) para probar la autenticidad de su documento de identidad CAM a la IRD. La característica clave de un ZKT es que permite un probador (en este caso, la tarjeta de acceso) para convencer al verificador (en este caso, el IRD) que conoce un secreto - sin revelar ninguna información sobre el propio secreto! Como cuestión de hecho, el verificador no necesita ni siquiera saber el secreto para autenticar a un probador en particular! En el sistema de DirecTV, una prueba de conocimiento cero es usado por el IRD para verificar (con un alto nivel de confianza) que el ID de CAM presenta una tarjeta de acceso es una auténtica ID CAM.
El objetivo de este artículo es describir cómo el ZKT DirecTV se lleva a cabo. No hay información aquí que le ayudará a conseguir "la televisión en abierto", lo que es información estrictamente educativos para los interesados en la criptografía y las matemáticas de la autenticación y verificación.
Introducción
En lugar de proporcionar una introducción general a los distintos tipos de ZKTs (ver el final de este artículo para obtener referencias de buenas introducciones generales), este artículo se centra en el algoritmo ZKT particular utilizado por DirecTV: una variante de la Feige-Fiat-Shamir (FFS ) la prueba del protocolo de identidad que utiliza algoritmos hash para reducir la comunicación entre la tarjeta de acceso y el IRD.
Lo primero es lo primero. La tarjeta de acceso tiene una identidad. Este es el ID de la CAM, impreso en el reverso de cada tarjeta, y es de 40 bits (5 bytes) almacenada en EEPROM en 8374h-8378h (al menos en la tarjeta H). Junto con el ID de la CAM es una de 512 bits (64 bytes) "secreto" almacenados en la EEPROM a 8478h-84B7h que está directamente relacionado con el ID de la CAM. (Nota: aunque es posible acceder al informe completo de 40-bit ID CAM y secreta de 512 bits en una tarjeta de H, no hay forma de conocimiento público para hacer esto en una tarjeta HU).
Tal vez se pregunte cómo el IRD es capaz de verificar un secreto sin conocer realmente cuál es el secreto. Esto se puede hacer porque el IRD tiene suficiente información para poder verificar que la tarjeta de algoritmos en efecto, conocer el secreto que va junto con el ID de la CAM. Con el fin de describir cómo ocurre esto, tenemos que explicar algunos detalles del fondo. El ID de CAM, C, se utiliza para la construcción de dos números, S y V. S es el número secreto (generado con la información que no está disponible) y V es un número de verificación directamente relacionados con S. Por desgracia, es muy difícil de calcular S, incluso si ambos C y V son de fácil acceso. Esto se debe a S se basa en un número N de 512 bits, que es el producto de dos números primos grandes, P y Q (N = P * Q). N es constante y se puede encontrar tanto en la ROM de la tarjeta de H (en 11C3h-1202h) y en el firmware del IRD. Es computacionalmente muy costoso para tratar de factorizar un número de 512 bits, tales como N. Obviamente NDS conoce la factorización de N, y por lo tanto puede generar el valor correcto de S para un ID de CAM dado.
Para el cálculo de S, V se calcula primero. Esto se hace pasando repetidamente la de 40 bits ID CAM a través de una función hash unidireccional. El inverso multiplicativo de V (V ^ -1 mod N) tiene que tener una raíz cuadrada. Cuando un mod número N tiene una raíz cuadrada es un "residuo cuadrático. Hay un montón de residuos cuadráticos, pero no están todos los números. Se cree que el quinto byte CAM ID es un número que se proporciona para asegurarse de que el hash de los cinco bytes ID CAM produce un residuo cuadrático. Esto es importante porque S debe ser una raíz cuadrada módulo N de V ^ -1 para satisfacer la ecuación:
V ^ -1 = S ^ 2 mod N
Así que después de una apropiada V se encuentra, V ^ -1 se calcula. Esto es fácil de hacer con el algoritmo de Euclides extendido. Entonces S se calcula mediante el descubrimiento de una raíz cuadrada de V ^ -1 módulo N. Si N es un producto de dos números primos, un residuo cuadrático módulo N contará con cuatro raíces cuadradas:
x,-x, f * x mod N, (-f * x) mod N, donde f = (P ^ (Q-1) - Q ^ (P-1)) mod N
Cualquiera de una de las cuatro raíces cuadradas módulo n es suficiente para S. Cuando P y Q se sabe que hay un algoritmo para encontrar todas estas raíces. Por otro lado, si usted puede encontrar todas estas raíces se pueden encontrar P y Q.
El IRD también tiene la capacidad para el cálculo de V, debido a la identificación de CAM y N. Esto es importante, ya que utiliza V para verificar que la tarjeta sabe S. Dado que V es un hash de un sentido de la identificación de CAM, es muy difícil (si no imposible) de encontrar otro ID CAM que produce el resultado el mismo hash. También significa que no es posible inventar un solo S al azar y tratar de encontrar su juego ID CAM o de encontrar otro ID CAM que funciona con el mismo S.
A pesar de que es fácil de determinar V y S se determina a partir de V, es muy difícil de determinar a partir de S V si la factorización de N (los valores de P y Q) no se conocen. De hecho, se reduce a tan duro como el factoring N sí mismo.
Entonces, ¿cómo el uso del IRD V para verificar que la tarjeta de acceso en realidad sabe S?
El protocolo ZKT utilizados en el sistema DirecTV funciona así:
1) La tarjeta de acceso calcula un número aleatorio R.
2) La tarjeta de acceso envía H (R ^ 2 mod n), donde H es una función hash unidireccional.
3) En función de lo que el IRD pedido, la tarjeta de acceso envía R o R * S mod N.
Si el IRD pidió R, el IRD se calcula H (R ^ 2 mod N) y lo compara con el valor enviado por la tarjeta de acceso en el paso 2. Si el resultado no es lo mismo, tiene que estar "llame a la ext. 745".
Si el IRD pidió R * S N mod, el IRD se calcula:
((((R * S mod N) * (R * S mod N)) mod N) * V) mod N
y puesto que V = S ^ N -2 mod, la anterior se reduce a R ^ 2 mod N. Esta se pasa a través de la función hash H y se compara con el valor enviado por la tarjeta de acceso en el paso 2. Si el valor no es lo mismo, tiene que estar "llame a la ext. 745".
S sólo entra en juego si el IRD pide la tarjeta de acceso para el valor de R * S mod N. Entonces, ¿por qué el IRD siempre piden justos R? Para evitar las trampas. Una tarjeta de acceso falso podía engañar mediante el envío de H (R ^ 2 * V ^ -1 mod N) en el paso 2, y luego, cuando el IRD pide R * S N mod, la tarjeta sólo enviaría R. Pero si después de enviar H (R ^ 2 * V ^ -1 mod N), el IRD pide a la I, la tarjeta tendría que ser capaz de responder con R * V ^ (-1 / 2) mod N para pasar la prueba. Informática V ^ (-1 / 2) mod N es tan difícil de encontrar ya que S sí mismo.
Es trivial para responder a una de las preguntas formuladas por el IRD, pero muy difícil de ser capaz de responder tanto a menos que sepa el valor correcto de S. Una parte importante del protocolo es no ser capaz de predecir si el IRD pedirá R o R * S mod N después del paso 2 se ha enviado. Si la hora de decidir qué enviar durante el paso 2, sabía lo que el IRD se va a pedir, sería fácil de engañar. Esta es otra razón se consulta la tarjeta de forma continua. Cuando se le preguntó muchas veces, es muy poco probable que adivinar lo que el IRD se pida.
Teoría de ¡Basta ya!
Tiempo para algunos detalles. Cuando el IRD verifica la identidad de una tarjeta de acceso, siempre utiliza los siguientes tres paquetes en el orden indicado. (Ahora es un buen momento para señalar que el ASIC no está involucrado con el procedimiento ZKT en absoluto, y que la tarjeta de F contiene el algoritmo exacto igual que las tarjetas H y HU).
Paso 1) IRD pide la tarjeta de acceso para calcular un nuevo centro de I número al azar y elige una de las dos identidades (más sobre esto más adelante)
IRD-> tarjeta: 48 4A 10 01 01
Tarjeta-> IRD: 4A
IRD-> tarjeta: 01
Tarjeta-> IRD: 90 20
Paso 2) IRD pide la tarjeta de acceso para enviar un hash de 64 bits de R ^ 2 mod N
IRD-> tarjeta: 48 5A 10 01 08
Tarjeta-> IRD: 5A
Tarjeta-> IRD: XX XX XX XX XX XX XX XX
Tarjeta-> IRD: 90 20
Paso 3) IRD pide la tarjeta de acceso de R o R * S mod N
a) IRD pide R
IRD-> tarjeta: 48 5A 10 02 40
Tarjeta-> IRD: 5A
Tarjeta-> IRD: envía el valor de R (512 bits/64 bytes)
Tarjeta-> IRD: 90 20
b) IRD pide R * S N mod
IRD-> tarjeta: 48 5A 11 02 40
Tarjeta-> IRD: 5A
Tarjeta-> IRD: envía el valor de R * S N mod (512 bits/64 bytes)
Tarjeta-> IRD: 90 20
El primer paso produce una nueva de 512-bit pseudo-números aleatorios que se generen por la rutina en 8C61h ("Compute64ByteTableAt80h" y se almacena en 832Ch ("TableWrittenByIns4A". El número generado se basa únicamente en la mesa de 8 bytes en el 8468h ("TableWrittenByIns5A" y la estática (pero diferente para cada tarjeta) de 8 bytes en la tabla de 8470h ("TableUsedByZKT", que son presumiblemente "semilla" de los valores de la PRNG. El byte de datos solo se envía con cada paquete de INS 4A determina cuál de las dos "identidades" de usar. En todos los casos vistos hasta la fecha, el bit 4 del byte de datos no se ha establecido, lo que indica la identidad primaria se utiliza. Por lo tanto, el valor de N almacenados en 11C3h-1202h se utiliza y está directamente relacionado con el secreto principal almacenada en el 8478h-84B7h. En el caso de que el N primaria resulta vulnerada (es decir, factor, posiblemente permitiendo identidades arbitraria que se genere), el IRD puede ser instruido para cambiar el valor de la alternativa N almacenado en 1203h-1242h y el secreto alternativa almacenados en 84B8h- 84F7h. Cualquier intento de factoring N se necesita un factor en realidad dos distintas N, la que se almacena en 11C3h-1202h que está siendo utilizada activamente, así como el de 1203h-1242h, ya que es trivial para el IRD para comenzar la autenticación utilizando este valor alternativo de N.
El segundo paso lleva a cabo un complejo hash unidireccional, lo que resulta en un valor de byte de 64 bits / 8 que se envían al IRD. El primer conjunto de cálculos, realizados por la rutina en la 124Dh ("CalledByIns5A", las causas de RAM 80h-BFh ser llenado con el valor de R ^ 2 mod N (tenga en cuenta que "CalledByIns5A" también se utiliza para calcular R * S mod N, ver más abajo). Después de que la memoria RAM 80h-BFh está lleno de este valor, el 8 bytes en el 8514h ("KeyTableUsedByIns5A", que contiene 'EQUIPO NDR) se copian en lugares RAM 55h-5 canales. La rutina en el complejo 0F68h ("ComputeBufferAt61h-6 canales" se llama entonces a generar los bytes a 61h-68h que se envían en respuesta a este paquete. La tabla de 12 bytes en 0F5Ch se utiliza para inicializar el contenido de 61h-6 canales, y en la parte final de la rutina en la 0FACh donde los 6 valores de 16 bits en 0F5Ch se suman a los seis valores de 16 bits de 61h-6 canales . El cálculo de búfer en 61h-6 canales parece basarse únicamente en el cálculo de R ^ 2 mod N, 'EQUIPO NDR "los bytes, el valor de N en 11C3h o 1203h (en función del INS 4A byte), los 12 bytes en 0F5Ch y los 16 bytes en 0FC6h. Posiciones de memoria 6DH-72h se utilizan durante el proceso de cálculo, pero estos lugares se inician al comienzo de la rutina (en 0FD6h), por lo que en realidad no son otra fuente de entrada a la función hash. Tenga en cuenta que este código se inicia la rutina de la etiqueta "Ins5ASignatreProcessing" en el HCDT desmontaje.
El tercer paso es más complicado. El código comienza por llamar a la rutina para calcular el 512-byte pseudo-números aleatorios que se almacena en 80h-BFh. Si estos cálculos no se traduce en exactamente el mismo número que se almacena en la memoria EEPROM en 832Ch por la instrucción del INS más reciente 4A, 64 bytes de ceros se devuelven. De lo contrario, la mesa de 8 bytes en el 8468h ("TableWrittenByIns5A" se actualiza por la exclusiva-or'ing el contenido existente de la tabla con los primeros 8 bytes de ese número al azar. Esto actualiza la semilla para el PRNG para la siguiente llamada a los resultados del INS 4A en un nuevo número. A continuación, la rutina en la 124Dh ("CalledByIns5A" es llamada para calcular R * S mod N. Finalmente, dependiendo de si InsParam1 es par o impar, o el tampón a 80h-BFh se envía (que contiene R * S mod N) o el número aleatorio en sí mismo (R, en 832Ch) es enviado.
Una cosa es darse cuenta si usted decide ver el código de la tarjeta de H en cualquier detalle es que la gran cantidad invertida se almacenan en la tarjeta (se supone que para que el "INC DPTR" la instrucción se puede utilizar, ya que no hay DEC " DPTR "de instrucciones). Esto significa que los módulos primarios N almacenados en 11C3h es realmente este número 512-bit:
01000139E8D702774A4F84F01DE67272169C9D1ED1CD618F69FF614957EF836E
E34A11FEDB0609618CADE18BE7CE38E6F7563AC204E0286DA53B5A47490AB5B1
Para ayudar a aquellos que quieran profundizar en los algoritmos ZKT en la tarjeta H, aquí están algunas etiquetas de mejora (en la medida de nuestra capacidad :-) que mejoren la amplia disponibilidad de tarjetas H Equipo de Documentación (HCDT) el desmontaje:
Código:
-------------------------------------------------- ----------------------
Dirección HCDT-Nueva etiqueta de etiqueta
8C61 Compute64ByteTableAt80h Compute512BitRandomNum
89F5-Ins4A ZKTRequest Ins4A-ZKTStep1
8A10-Ins5A ZKTResponse Ins5A-ZKTStep2And3
8A60 Calcular y Write5AZKTTable UpdateZKTRandomNumSeed
8A75 Ins5ASignatreProcessing SendZKTHashValue
12DE Routine_12DE Subtract512BitNFromBuffer
1314 Routine_1314 Add512BitNToBuffer
12FA Routine_12FA Add512BitNToBuffer2 *
12AD Routine_12AD Do512BitModulus
124D Routine_124D Do512BitMultiplyModN
127B Routine_127B Do512BitMultiply
0F68 ComputeBufferAt61h-6 canales DoZKTHash
8468 TableWrittenByIns5A VariableRandomNumSeed
8470 TableUsedByZKT StaticCardSpecificRandomSeed
832c TableWrittenByIns4A ZKTRandomNumber
8478 64byteTable_8478 PrimaryZKTSecret
84B8 64byteTable_84B8 AlternateZKTSecret
11C3 64ByteTable_11C3 PrimaryModulusN
1203 64ByteTable_1203 AlternateModulusN
8514 ZKTHashInputTable KeyTableUsedByIns5A
* Al igual que 1314, excepto que comienza en el byte 1 byte en lugar de 0.
-------------------------------------------------- ------------------------------
Entonces, ¿cómo moverse por la ZKT así que usted puede poner lo que CAM ID que desee en su tarjeta de H, como su identificación HU CAM o algún tipo de identificación compuesto por CAM?
Factor de lectura acerca de los algoritmos N. similar a la utilizada en la tarjeta de H indica con alta probabilidad de que N es probablemente un factor de dos números primos grandes, comúnmente llamado P y Q. Encontrar P y Q es muy difícil de hacer para un gran número, pero ha sido hecho por una serie de este tamaño con (supuestamente) la fortaleza criptográfica similar. Se tomó unos meses con más de 300 ordenadores ... además de un análisis final en una máquina con 2GB de RAM más. Por lo tanto, es posible factor de estas cifras, sólo se necesita un montón de recursos.
Buscar S dada S ^ 2 mod N. Desafortunadamente, esto se reduce a tan duro como el factoring N.
Predecir si el valor solicitado en el tercer paso será pedir R o R * S mod N. Sabiendo esto le permitirá pasar valores especiales para que los ZKT pasará, aun sin conocer S. Esto puede ser posible en algunos IRD. Parece que el algoritmo utiliza información almacenada en la EEPROM del IRD a las semillas de su generador de números aleatorios. Al escribir la protección de la EEPROM, debería ser posible obtener la misma secuencia de peticiones en el siguiente reinicio, a menos que sea a partir de datos de otra fuente (se desconoce en este momento). IRD, que pueden restablecer sus memorias EEPROM puede tener una ventaja si esta semilla también se resetea - como propietarios IRD puede ser capaz de usar la misma secuencia (que sólo requiere almacenar un bit por cada iteración).
Predecir lo que el R próxima tendrá lugar en tres pasos. Conocer la R utilizadas en R * S N mod le permitirá determinar S. Si pudiera predecir R en la tarjeta de HU, podría determinar su tarjeta de S. El H se puede hacer para enviar parte de los datos utilizados para la semilla aleatoria generador generador mediante el envío de comandos falsos (ver el desmontaje con un tráfico de "señuelo" instrucciones), que puede permitir R para predecir (o al menos que sea más sencillo para hacerlo). El HU no proporciona la misma información cuando se envían las instrucciones de señuelo, y puede que ni siquiera utilizan el mismo generador de pseudo-números aleatorios. El algoritmo se ve bastante simple en la superficie, lo que puede ser posible predecir R, e incluso es posible la tarjeta HU utiliza el mismo algoritmo, pero su predicción sería algo para un matemático para analizar.
Romper el algoritmo de hash de sentido único. Se parece a una modificación de uno de los algoritmos Message Digest (al menos para un ojo no entrenado). Se trata de un hash de 96 bit. Sin embargo, incluso si se había roto, es poco probable que usted encontrará varios identificadores de medicina complementaria y alternativa válida que hash para la misma firma.
Ejecutar a un hombre-en-the-middle (también conocido como el Gran Maestro de Ajedrez táctica). Se ha comprobado que es posible hacer que el IRD que su tarjeta de identificación de H CAM es el de una tarjeta de HU (suponiendo que tiene tanto una H y una HU). Esto se hace mediante el uso de un PC con tres puertos de serie y un software personalizado. Un puerto serie está conectado al IRD a través de un emulador de tipo "temporada" de interfaz, un puerto conectado a un programador de tarjeta inteligente con una tarjeta de H en el mismo, y un puerto conectado a un programador de tarjeta inteligente con una tarjeta de HU en ella. El software controla la comunicación de la IRD, y pasa el ID CAM (INS 2A) y ZKT (Ins 4A, 5A y complementos INS 58) paquetes de la HU y el envío de los resultados de la IRD en lugar de los resultados de la tarjeta de H. Cualquier otros paquetes son enviados y procesados por la tarjeta de H como de costumbre. Una aplicación más avanzada podría ser diseñado como un tablero especial que tenía dos tarjetas (una para la tarjeta de H y uno para el HU) con un pequeño microcontrolador para dirigir los paquetes a la interfaz apropiada.
Modificar el firmware del IRD. Si usted tuviera la capacidad de leer, desmontar, comprender, modificar y escribir de nuevo el firmware del IRD, se podría modificar para que nunca se molestó con la ZKT. No es probable que una cantidad considerable de la reutilización del código en un IRD, incluso entre diferentes fabricantes, ya que gran parte del código es probablemente facilitada por NDS (como los algoritmos ZKT).
Algunas ideas que no va a funcionar
Set R a un montón de ceros y luego enviar H (0) en el paso dos anterior. No se puede hacer esto varias veces, el control del IRD para esto, y niega que el primer byte del hash si detecta H (0) dos veces seguidas. Tampoco se puede enviar R o R * S mod N con todo ceros en los bytes de alto. En otras palabras, una comprobación se realiza para ver si el paso tres devuelve un número menor que aproximadamente la raíz cuadrada de N. Niega el primer byte del hash si lo es. (Usted puede pensar que se podría negar el mismo byte en dos ocasiones, pero algunos otros indicadores se establece cuando usted hace esto ...)
Seguir enviando los mismos valores de R y R * S mod N. El IRD mantiene un registro de los últimos R y R * S mod N. Si la nueva R coincide con la última investigación enviada por la tarjeta, que se detecta. Lo mismo ocurre con el mod * R S N valor. Usted tendría que alternar entre al menos dos diferentes de R y dos diferentes R * S mod N. Y puede ser que algunos IRD almacenar incluso más que el último valor, que requieren más de dos combinaciones válidas.