Я пишу программное обеспечение для персонализации платежного чипа, реализующего протокол Global Platform Secure Channel 2. У меня есть инструмент от поставщика чипа, который может войти в систему на карте, но я не могу дублировать эти вычисления, чтобы придумать свой собственный логин. Инструмент поставщика имеет только один заводской ключ или, возможно, набор ключей из трех одинаковых частей. Это все, что знает инструмент поставщика, и он может войти в карту:
cm> auth
=> 80 50 00 00 08 A0 13 2D 8B C1 E6 6E 9A 00 .P.....-...n.. host challenge: A0132D8B C1E66E9A
(122317 usec) vv indicates SCP02
<= 00 00 00 00 00 00 00 00 00 00 FF 02 00 13 BA 2A ...............* seq num: 0013 card challenge: BA2A16C9DC0E
16 C9 DC 0E 30 11 F0 19 01 0D BF 2B 90 00 ....0......+.. card cryptogram: 3011F019 010DBF2B
Status: No Error
=> 84 82 00 00 10 29 FD 73 3D 5A 91 6C 6F EA A6 56 .....).s=Z.lo..V host cryptogram: 29FD733D5A916C6FEAA656B82A6B8928
B8 2A 6B 89 28 .*k.(
(75647 usec)
<= 90 00 ..
Status: No Error
Судя по общедоступной Спецификации Global Platform Card, мое программное обеспечение должно использовать константу 182 ( или, может быть, 181, я пробовал и то, и другое), и счетчик последовательности (здесь "0013"), дополненный нулями до 16 байтов, чтобы создать сеансовый ключ. Затем ему необходимо объединить вызов хоста, порядковый номер, вызов карты и заполнение «8000 ...», чтобы получить открытый текст для подписи. Подпишите это сеансовым ключом, и результат должен совпадать с криптограммой карты. Как только я смогу продублировать вычисления инструмента поставщика, я смогу использовать тот же код на своей личной машине. Очень просто.
Работая в .Net 4.5 TripleDESCryptoServiceProvider и MACTripleDES, я получаю значения, которые не совпадают. Я не хочу интегрировать Bouncy Castle только для того, чтобы посмотреть, улучшит ли это ситуацию. Вычисление моего ключа проверяется на интернет-калькуляторах, но, конечно же, я не вижу сеансового ключа карты. Онлайн-калькуляторы подписи не согласуются с моим кодом, но они также не согласуются с примерными данными. Все, что я знаю, это то, что подпись получается неправильной или, по крайней мере, отличной от рабочего инструмента.
Итак, я думаю, вопрос в том, есть ли где-нибудь примеры этого вычисления? Конечно, сначала я спросил поставщика чипов.