Нужен совет по криптографическому алгоритму

Приносим извинения за эссеистический характер этого вопроса. Я изо всех сил пытался справиться с этим и попытался обобщить свое понимание того, что необходимо, с конкретными вопросами, которые у меня есть.

В этом вопросе, касающемся считывания данных с карты европейской компании DTCO, мне дали совет, который заключался в следовании алгоритму на скриншоте ниже (из Приложения 11 этого документа) но я не понимаю, как выполнить два выделенных шага.

  1. Я вижу, что Знак— это сегмент массива, содержащий сертификат, но что значит открыть его открытым ключом? Я могу успешно выполнить предыдущий шаг, прочитав CA_Certificate с карты и выпустив из нее MANAGE SECURITY ENVIRONMENTAPDU, используя CAR´ (см. первый шаг алгоритма). Но выбрав открытый ключ таким образом, какой открытый ключ я использую на этапе open Sign. MSE выбирает один, но у меня его нет; У меня есть только европейский публичный ключ от ERCA, но тот ли это ключ, который я выбрал в карте? У меня нет закрытых ключей, но они мне нужны.

  2. На этапе проверки того, что Hash(C´) = H´, как мне вычислить хэш? Кажется, существует так много разных способов (правильно ли слово «форматирует»?) Шифрования/дешифрования/хеширования, что я совершенно запутался.

enter image description here

Все, что мне действительно нужно сделать, чтобы прочитать данные, которые мне нужны, это аутентифицироваться с помощью EXTERNAL AUTHENTICATEсразу после GET CHALLENGE, который возвращает 8-байтовый вызов. Я предполагаю, что мне нужно использовать это для вычисления шифра для EXTERNAL AUTHENTICATE.Я нашел пример кода ниже ( см. полный пост ), и хотя он выглядит на каком-то C-подобном языке сценариев (я использую C#) и для другого типа смарт-карты он кажется очень похожим на то, что Я должен использовать.

//
// 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);

Отличия:

  1. Дополнительный параметр P2, указывающий, что было выполнено MANAGE SECURITY ENVIRONMENT, предположительно, с CAR´из Card_Certificate, что у меня не работает, хотя работает с CAR´из CA_Certificate.

  2. Lcиз 0x80 вместо 0x81 в примере кода.

  3. Любой шифр, который, по моим расчетам, будет использоваться здесь, должен иметь длину 128 байт, хотя длина шифра в образце неизвестна.

7
задан Community 23 May 2017 в 12:01
поделиться