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
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.
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.
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
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.
Lc de 0x80 en lugar del 0x81 en el código de muestra.
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.
Puede encontrar http://s.tk/crypto un sitio útil – Cheekysoft