Декодировать данные EMV TLV

Я работаю над POS-приложением, которое поддерживает карты EMV. Я могу считывать данные карты с устройства чтения карт Verifone MX в формате TLV, но у меня возникают проблемы с декодированием данных TLV в читаемые данные.

Я могу разделить данные на теги TLV и их значения. Результирующее значение находится в шестнадцатеричном формате вместо декодированного текста.

Пример:

Это пример данных TLV (я получил этот образец данных TLV здесь

6F2F840E325041592E5359532E4444463031A51DBF0C1A61184F07A0000000031010500A564953412044454249548701019000

Когда я проверить это TLV в TLVUtil, я получаю данные в определенных тегах в читаемом формате (например, тег 50 здесь).

Самое близкое, что я мог получить в своем приложении, это:

Tag Value
50  56495341204445424954
4F  A0000000031010
61  4F07A0000000031010500A56495341204445424954870101
6F  840E325041592E5359532E4444463031A51DBF0C1A61184F07A0000000031010500A56495341204445424954870101
84  325041592E5359532E4444463031
87  1
90  
A5  BF0C1A61184F07A0000000031010500A56495341204445424954870101
BF0C 61184F07A0000000031010500A56495341204445424954870101

Я хотел бы знать, есть ли способ идентифицировать определенные теги, которые необходимо преобразовать из шестнадцатеричного в строку, или есть ли какой-либо парсер и декодер TLV, доступный в .Net, который может реплицировать TLVUtil.


person Rahul Vijayapuram    schedule 20.04.2016    source источник
comment
Вы уверены, что ваши данные не зашифрованы track1? Например, если вы запустите карту типа 4186 0000 0000 1234, сможете ли вы найти этот номер в данных? Если нет, то полезная нагрузка, вероятно, зашифрована, и данные не будут хорошо проанализированы.   -  person tgolisch    schedule 20.04.2016
comment
Помимо номера карты, считыватель возвращает другую информацию, такую ​​как имя держателя карты, банк-эмитент и т. д. Эта информация возвращается в шестнадцатеричном коде. Я хотел бы идентифицировать эти теги и выборочно преобразовать их.   -  person Rahul Vijayapuram    schedule 20.04.2016
comment
Пример кода Java, который вы можете попробовать выполнить в .Net ›› String sHex = 6F2F840E325041592E5359532E4444463031A51DBF0C1A61184F07A0000000031010500A564953412044454249548701019000; байт[] ba = новый байт[sHex.length()/2]; for (int i=0;i‹sHex.length()/2;i++) { ba[i] = (Integer.decode(0x+sHex.substring(i*2, (i+1)*2))) .байтовое значение(); } Список TLVList=новый TLVList(); список.распаковать(ба); if(list.hasTag(0x91)){ // вы можете получить необходимый тег, как показано ниже list.getString(0x91); }   -  person Ganesh Kumar    schedule 12.11.2019


Ответы (4)


Есть только несколько тегов, которые нужно преобразовать в строку. Обычно теги, которые помещаются на экран POS, персонализированы в шестнадцатеричном эквиваленте читаемой строки.

  • 5F20 : имя держателя карты

  • 50 : ярлык приложения.

  • 5F2D : языковые настройки

Вы должны знать, какие теги могут быть преобразованы.

person Ahmet Arslan    schedule 20.04.2016
comment
Да, я знаю несколько тегов, которые необходимо расшифровать. Не могли бы вы привести список таких тегов. Кроме того, я хотел бы знать, есть ли способ прагматически определить теги, которые необходимо преобразовать, вместо жесткого кодирования тегов. - person Rahul Vijayapuram; 20.04.2016
comment
Невозможно идентифицировать эти теги, вы должны жестко закодировать эти теги. У меня нет такого списка. - person Ahmet Arslan; 20.04.2016

Полный список тегов EMV доступен в книге спецификаций EMVCo 4.3 3 — вы можете скачать отсюда — https://www.emvco.com/download_agreement.aspx?id=654 Представление данных зависит от поля. Проверьте «Приложение A — Словарь элементов данных».

Подробная информация о кодировании указана в разделе 4.3.

Прочтите оба раздела и ваша проблема решится.

person Adarsh Nanu    schedule 20.04.2016

Как мне кажется, программно можно выделить что-то вроде,

Тег состоит из одного байта (5A - номер панорамы) или содержит 2 байта (5F20 - ИМЯ ДЕРЖАТЕЛЯ КАРТЫ), И

длина 1 байт или 2 байта И

Тег является примитивным или сконструированным. Подробнее вы можете прочитать здесь

и если вы знаете список, вы можете получить что-то полезное Здесь, определяет формат тега, который вы ищете.

Здесь вы можете жестко закодировать формат, так как он хорошо определен.

Надеюсь, поможет.

person Arjun    schedule 21.04.2016

Эти данные, начинающиеся с 6F, представляют собой информацию управления файлами (FCI), на которую отвечает карта EMV после команды SELECT. В этом видео также есть пример, расшифрованный и объясненный. https://youtu.be/iWg8EBhsfjY

Это легко проверить

person Derick Beng    schedule 11.06.2017