Как я могу проверить правильность ИНИЦИАЛИЗИРОВАННОГО ОБНОВЛЕНИЯ и ВНЕШНЕГО АУТЕНТИФИКАЦИИ?

Я отправил 80 50 00 00 08 00 00 00 00 00 00 00 00 [Команда инициализации обновления ] через opensc-tool на мою карту Java и получил 00 00 11 60 01 00 8A 79 0A F9 FF 02 00 11 79 11 36 5D 71 00 A5 A5 EC 63 BB DC 05 CC [Init Response] как ответ от карты.

Как вы видите:

В команду отправляю 00 00 00 00 00 00 00 00 как Host Challenge, и в ответ:

00 00 11 60 01 00 8A 79 0A F9 = Ключевые данные диверсификации

FF 02 = Ключевая информация

00 11 79 11 36 5D 71 00 = Вызов карты

A5 A5 EC 63 BB DC 05 CC = Криптограмма карты

Теперь я хочу проверить, исправна ли криптограмма карты или нет. Как я могу это сделать? например я шифрую 00 00 00 00 00 00 00 00 на этом сайте по алгоритму криптографии 3DES [с ключами моей карты = 4041...4F], но вывод не равен криптограмме карты, которую я написал выше. Зачем?

И следующий вопрос: если я хочу отправить команду EXTERNAL AUTHENTICATION на карту, каково ее поле данных (после указанного выше ОБНОВЛЕНИЯ ИНИЦИАЛИЗАЦИИ)?

Обновить:

Это вывод GPJ:

C:\Users\ghasemi\Desktop\gpj-20120310>GPJ
C:\Users\ghasemi\Desktop\gpj-20120310>java -jar gpj.jar
Found terminals: [PC/SC terminal ACS CCID USB Reader 0]
Found card in terminal: ACS CCID USB Reader 0
ATR: 3B 68 00 00 00 73 C8 40 12 00 90 00
.
.
.
DEBUG: Command  APDU: 00 A4 04 00 08 A0 00 00 00 03 00 00 00
DEBUG: Response APDU: 6F 10 84 08 A0 00 00 00 03 00 00 00 A5 04 9F 65 01 FF 90 00
Successfully selected Security Domain OP201a A0 00 00 00 03 00 00 00

DEBUG: Command  APDU: 80 50 00 00 08 7F 41 A9 E7 19 37 83 FA
DEBUG: Response APDU: 00 00 11 60 01 00 8A 79 0A F9 FF 02 00 1B 9B 95 B9 5E 5E BC BA 51 34 84 D9 C1 B9 6E 90 00
DEBUG: Command  APDU: 84 82 00 00 10 13 3B 4E C5 2C 9E D8 24 50 71 83 3A 78 AE 75 23
DEBUG: Response APDU: 90 00
DEBUG: Command  APDU: 84 82 00 00 08 13 3B 4E C5 2C 9E D8 24
DEBUG: Response APDU: 90 00

C:\Users\ghasemi\Desktop\gpj-20120310>

Так:

Host_Challenge :: 7F41A9E7193783FA

Diversification_Data :: 0000116001008A790AF9

Key_Information :: FF02

Sequence_Counter :: 001B

Card_Challenge :: 9B95B95E5EBC

Card_Cryptogram :: BA513484D9C1B96E

Host_Cryptogram[16,24] = 13 3B 4E C5 2C 9E D8 24

Теперь давайте сделаем нашу Host_Cryptogram вручную:

Derivation_data=derivation_const_ENC|sequence_counter|0000 0000 0000 0000 0000 0000

Derivation_Data = 0182001B000000000000000000000000

k_ENC :: 404142434445464748494A4B4C4D4E4F

IV = 00 00 00 00 00 00 00 00

S_ENC = encrypt(TDES_CBC, K_ENC, IV, derivation_data)

Так:

Я использовал http://tripledes.online-domain-tools.com/ и его вывод для вышеуказанных значений был:

S_ENC = 448b0a5967ca246d058703ff0c694f15

А также:

Padding_DES = 80 00 00 00 00 00 00 00
Host_auth_data = sequence_counter | card_challenge | host_challenge | padding_DES
IV = Card_Cryptogram :: BA513484D9C1B96E
host_cryptogram = encrypt(TDES_CBC, S_ENC, IV, host_auth_data)

Так:

Host_Authentication_Data : 001B9B95B95E5EBC7F41A9E7193783FA8000000000000000

Я снова использовал http://tripledes.online-domain-tools.com/

а также:

Host_Cryptogram : 3587b531db71ac52392493c08cff189ce7b9061029c63b62

Так:

Host_Cryptogram[16,24] = e7b9061029c63b62

Почему эти двунаправленные [вывод вручную и GPJ] дают нам две основные криптограммы?

1 ответ

Решение

От отправленной вами команды INITIALIZE UPDATE вы получаете

host_challenge = 00 00 00 00 00 00 00 00

В ответ на команду INITIALIZE UPDATE вы получаете

diversification_data = 00 00 11 60 01 00 8A 79 0A F9
key_information = FF 02
sequence_counter = 00 11
card_challenge = 79 11 36 5D 71 00
card_cryptogram = A5 A5 EC 63 BB DC 05 CC

Ключевая информация указывает на SCP02 (02). Данные диверсификации ключа могут быть использованы для получения специфичного для карты K_ENC. Давайте предположим, что у нас есть K_ENC, как это

K_ENC = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Затем мы можем получить ключ шифрования сеанса следующим образом

derivation_const_ENC = 01 82
derivation_data = derivation_const_ENC | sequence_counter |  00 00 00 00 00 00 00 00 00 00 00 00

IV = 00 00 00 00 00 00 00 00
S_ENC = encrypt(TDES_CBC, K_ENC, IV, derivation_data)

Далее мы можем собрать данные аутентификации, используемые для вычисления криптограммы хоста:

padding_DES = 80 00 00 00 00 00 00 00
host_auth_data = sequence_counter | card_challenge | host_challenge | padding_DES

Затем мы можем использовать ключ шифрования сеанса для шифрования данных аутентификации:

IV = 00 00 00 00 00 00 00 00
host_cryptogram = encrypt(TDES_CBC, S_ENC, IV, host_auth_data)

Последние 8 байтов зашифрованных данных аутентификации являются фактической криптограммой хоста, которую мы отправляем на карту:

EXTERNAL_AUTHENTICATE_data = host_cryptogram[16, 24]

Теперь мы можем собрать команду EXTERNAL AUTHENTICATE:

EXTERNAL_AUTHENTICATE = 84 82 03 00 08 | EXTERNAL_AUTHENTICATE_data

Затем мы можем вычислить ключ S_MAC (аналогично полученному выше S_ENC) и MAC для этой команды и добавить его к данным команды, чтобы получить полную команду EXTERNAL AUTHENTICATE, которую можно отправить на карту:

EXTERNAL_AUTHENTICATE = 84 82 03 00 10 | EXTERNAL_AUTHENTICATE_data | MAC

Обновить

Использование http://tripledes.online-domain-tools.com/ для воспроизведения результатов GPJ

Ваш K_ENC 404142434445464748494A4B4C4D4E4F, Онлайн-инструменты не поддерживают 2-key-3DES надлежащим образом, поэтому сначала необходимо преобразовать ключ в его 3-ключную форму:

K_ENC = 404142434445464748494A4B4C4D4E4F4041424344454647

Используйте этот ключ и нулевой IV для шифрования данных деривации (0182001B000000000000000000000000). Ты получаешь

S_ENC = fb063cc2e17b979b10e22f82110234b4

В 3-клавишной записи это

S_ENC = fb063cc2e17b979b10e22f82110234b4fb063cc2e17b979b

Используйте этот ключ и нулевой IV для шифрования данных аутентификации хоста (001b9b95b95e5ebc7f41a9e7193783fa8000000000000000):

HOST_CRYPTOGRAM = 773e790c91acce3167d99f92c60e2afd133b4ec52c9ed824
Другие вопросы по тегам