Ваша команда EXTERNAL AUTHENTICATE неверна.Выглядит так, как будто вы копируете значение M_IFD в неправильную позицию (по одному).Следовательно, вы отсекаете последний байт E_IFD и в конце получаете нулевой байт:
00 82 0000 28 EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1 CED0EA4979A35978 00 28
^^ ^^
Last byte of E_IFD missing (only 31 bytes here) <--/ |
Additional zero byte here? <--/
Кроме того, ваши значения (более или менее) соответствуют значениям моего тестового стенда MRTD.Вы не исправили биты четности K_ENC и K_MAC, но это не будет иметь никакого значения, если вы не будете (в будущем) использовать криптографическую библиотеку, которая фактически проверяет биты четности ключей DES.Ваша текущая крипто-библиотека, кажется, игнорирует их и дает ожидаемый результат.
ОБНОВЛЕНИЕ (итоги обсуждения в комментариях ниже)
Кроме того, вы проверили, что номер документа, датаРождение и дата истечения точно соответствуют форме, используемой в машиночитаемой зоне?И номер документа, и дата истечения срока в вашем вопросе не кажутся приемлемыми значениями для реального паспорта.
Наконец, как объяснил Мартен, слово состояния 6300 указывает на то, что аутентификация не удалась.Вы не можете ожидать, что документ покажет дополнительную информацию о том, почему именно аутентификация не удалась.Это, конечно, не недостаток спецификаций ИКАО, а необходимость с точки зрения безопасности.Представьте, например, что паспорт сможет сообщить, что дата рождения, которую вы указали в качестве ввода, была неверной.Тогда злоумышленник сможет перебором только ту часть клавишного ввода.