2012-05-30 18 views
7

Disculpas por la naturaleza de ensayo de esta pregunta. He estado luchando para hacer frente a esto y he intentado resumir mi comprensión de lo que se necesita, con las preguntas específicas que tengo. this question en relación con la lectura de datos de una tarjeta DTCO europea, recibí consejos que implicaban seguir el algoritmo en la captura de pantalla siguiente (del Apéndice 11 de this document) pero no estoy seguro de cómo realizar los dos pasos resaltados .Necesito consejos sobre el algoritmo criptográfico

  1. veo que sesión es un segmento de la matriz que contiene el certificado, pero ¿qué significa para abrirlo con la clave pública? Puedo realizar con éxito el paso anterior leyendo CA_Certificate desde la tarjeta y emitiendo GESTIONAR ENTORNO DE SEGURIDAD APDU usando CAR'(vea el primer paso del algoritmo) de él. Pero al haber seleccionado la clave pública de esa manera, ¿qué clave pública utilizo en el paso abierto Iniciar sesión? El MSE selecciona uno pero yo no lo tengo; Solo tengo la clave pública europea de ERCA, pero ¿es esa la misma clave que he seleccionado en la tarjeta? No tengo ninguna clave privada, pero las necesitaría.

  2. En el paso para comprobar que Hash (C') = H', ¿cómo debo calcular el hash? Parece que hay tantas formas diferentes (¿Formatea la palabra correcta?) De hacer encriptación/descifrado/hash que estoy bastante confundido.

enter image description here

Todo lo que realmente necesito para ser capaz de hacer para leer los datos que necesito es autenticar usando EXTERNO AUTHENTICATE, inmediatamente después de una entrada GET que devuelve un desafío de 8 bytes. Supongo que necesito usar eso para calcular el cifrado para EXTERNAL AUTHENTICATE. Encontré el código de muestra a continuación (see full post) y, aunque parece estar en algún lenguaje de scripts similar a C (estoy usando C#) y para un tipo diferente de tarjeta inteligente, parece bastante similar a lo que debo usar.

// 
// Authenticate against CardOS card 
// 

var card = new Card(_scsh3.reader); 
var crypto = new Crypto(); 

var key = new Key(); 
key.setComponent(Key.DES, 
    new ByteString("01010101010101010101010101010101", HEX)); 

// Get challenge 
var challenge = card.sendApdu(0x00, 0x84, 0x00, 0x00, 8, [0x9000]); 

// Crypto.DES_MAC_EMV is a CBC generated Retail-MAC 
var cipher = crypto.sign(key, Crypto.DES_MAC_EMV, challenge); 

card.sendApdu(0x00, 0x82, 0x00, 0x81, cipher); 

print("Card returns " + card.SW.toString(16) + " - " + card.SWMSG); 

Las diferencias son

  1. El parámetro P2 adicional que indica que gestionan entorno de seguridad se ha hecho, presumiblemente con la CAR' de Card_Certificate, que no funciona para mí, aunque lo hace con el CAR' de CA_Certificate.

  2. Lc de 0x80 en lugar del 0x81 en el código de muestra.

  3. Cualquier cifrado que calcule para usar aquí tendría que tener 128 bytes de longitud, mientras que no está claro la longitud de la cifra en la muestra.

+0

Puede encontrar http://s.tk/crypto un sitio útil – Cheekysoft

Respuesta

3

Esta respuesta también es un poco largo, porque un malentendido tiene que ser explicado. El extracto de texto anterior trata de la autenticación mediante un par de claves asimétricas. Como no se puede probar nada más allá de poseer la contraparte privada de una clave pública, se requieren credenciales adicionales. El emisor del certificado generalmente afirma haber verificado su identidad y esto está documentado por la firma del certificado (la firma solo es útil si la clave pública del emisor es bien conocida por Internet o porque ya está almacenada en la tarjeta). Normalmente, una tarjeta inteligente proporciona el comando "Realizar operación de seguridad" en el modo "Verificar certificado" para tal fin: verifica la firma del emisor, desempaqueta la clave pública contenida en el certificado o la entrega junto con la tarjeta y la conserva para invertir una propiedad privada operación clave asumida a seguir pronto.

Su fragmento de código trata de la autenticación mediante una clave simétrica, también llamada clave secreta. Se supone que este secreto solo lo conocen las personas autorizadas. El 0x81 que usted considera como LC es en realidad P2, lo que significa "por favor tome la clave local n. ° 1" para verificar el cálculo de MAC usando esta clave secreta. De hecho, tomar un número aleatorio de 8 bytes como entrada para computar un MAC (minorista o lo que sea) típicamente (es decir, aplicando esquemas de relleno estándar) da como resultado un resultado de 16 bytes. Por cierto, la clave DES en el ejemplo es horrible. El bit menos significativo de cada byte es el bit de paridad, por lo que la clave consta de cero bytes solamente.

Ambos esquemas no tienen nada en común más allá del propósito de realizar una autenticación de alguna manera.

Para obtener más información, consulte ISO 7816-8 (para realizar operaciones de seguridad), ISO 7816-4 (para autenticación externa, obtener desafío y la mayoría de los demás comandos de tarjeta inteligente). Estos son difíciles de obtener sin gastar dinero (las versiones anteriores se pueden encontrar en www) y son bastante difíciles de leer y difíciles de entender. Se encuentran más explicaciones en Rankl/Effing "Handbuch der Chipkarten", pero la traducción en inglés "Smart Card Handbook" es especial a veces. Para material certificado, recomendaría Schneier, Applied Cryptography, que también tiene cientos de referencias adicionales.

+0

Buena respuesta. Solo le sugiero que proporcione enlaces para esta información ya que ha dado bastante en esta respuesta y al aficionado le gustaría leer más sobre las cosas que ha mencionado. –

+0

Gracias por esta respuesta detallada. Resulta, y lo supimos solo ayer, que no tenemos necesidad de hacer nada de esto. La aplicación que se nos encargó reemplazar no tiene acceso a la información segura en la tarjeta, pero usa un número de serie abierto no relacionado con la aplicación (cardExtendedSerialNumber de EF ICC) para identificar qué tarjeta está en qué lector y utiliza esto con el usuario ingresado número de tarjeta específico de la aplicación para crear una tabla que se puede usar para dirigirse al lector que contiene una tarjeta específica. Nos han dicho que simplemente hagamos lo mismo. –

+0

Tal vez su respuesta ayude a otra persona a luchar como lo estaba yo en el futuro. Creo que haré algo de lectura en las referencias que mencionas como un ejercicio de aprendizaje personal en cualquier caso. –

4

No hagas esto tú solo, muchas cosas pueden salir mal. La biblioteca de crypto castillo hinchable admite firmas ISO 9706-2. Funciona tanto en C# como en java.

El comienzo del documento this deja en claro qué está pasando. Originalmente lo que recibe de la tarjeta es

x_c = sign || c_n || c_ar 

de signos es una firma RSA en la salida de un relleno de función hash de codificación// en su mensaje (en este caso parece que el mensaje es un certificado). c_n es el resto del mensaje y c_ar es el identificador de la autoridad de certificación que creó el signo de firma.

La función de codificación utilizada es μ (m) = 6A || m [1] || hash (m) || BC

donde || es concatenación, 6A es solo los bytes 0x6A, del mismo modo para 0xBC. Hash es una función hash, y m 1 es la primera k - longitud de la función hash - 16 bits del mensaje. m [2] es el resto del mensaje y está almacenado como c_n.

DES no se incluye aquí.

lo que se supone que hacer aquí es

  1. sale el mensaje/certificado mediante la concatenación de \ m 1 y C_n
  2. cálculo μ (m [1] || C_n)
  3. Compruebe que signo es la firma RSA en μ (m [1] || C_n) por la autoridad de certificación indica en c_ar
+0

Hmm, sé que hubo algunas cosas mal con BC con respecto a esto, no estoy seguro de que la recuperación de mensajes funcione de la caja. –

Cuestiones relacionadas