首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析MagTek EMV TLV

解析MagTek EMV TLV
EN

Stack Overflow用户
提问于 2017-02-25 07:41:08
回答 2查看 1.8K关注 0票数 0

我正在使用一个项目中的MagTek DynaPro读取信用卡数据并将其输入到会计系统中(这不是我在这个项目上的第一篇文章)。我已经成功地利用Dukpt.NET来解密MSR数据,所以这是件好事(https://github.com/sgbj/Dukpt.NET)。因此,我开始获取EMV数据,并使用以下MagTek文档作为TLV结构参考:https://www.magtek.com/content/documentationfiles/d99875585.pdf(从第89页开始)。然而,我在读取数据时遇到了问题。

我试着用BerTlv.NET(https://github.com/kspearrin/BerTlv.NET)来处理数据解析,但是当我将TLV字节数组传递给它时,它总是抛出异常。具体来说,这就是我所得到的:

代码语言:js
复制
System.OverflowException : Array dimensions exceeded supported range.

我还尝试过通过其他一些实用程序来解析数据,但它们似乎也都抛出了错误。所以,我想我只能自己去解析它了,但是我不确定最有效的方法是什么。在某些情况下,我知道要读入多少字节才能获得数据长度,但在其他情况下,我不知道该如何处理。

此外,当破坏一些数据时,我会使用F9标记,并且在它和DFDF54将十六进制标记为8201B3。现在,考虑到整个消息长度的前两个字节是01B7,01B3是有意义的,但我不理解82。我不能假设这是"EMV应用程序交换配置文件“的标签,因为它列在F2标签。

此外,还有一些0的填充(我认为最多相当于8个字节)和末尾的4个字节的其他东西,它们在开始时被排除在两个字节的消息长度之外。我不确定传递到解析器中的数据是否会导致问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-26 20:45:49

参考规范截图1,根据EMV规范,您应该像下面这样阅读标签。

代码语言:javascript
复制
Eg tag 9F26 [1001 1111] the subsequent byte is also tag data - [0010 0110]
But when it is 9A [1001 1010], tag data is complete, length follows.

​规范还说检查标签的第二个字节的位8,看看标签的第三个字节是否如下所示,但实际上你不需要它。​

​在现实生活中,你会预先知道你会遇到的标签,所以你会逐个字节地解析数据,如果你得到9F,你会寻找下一个字节来获得完整的标签,然后是下一个字节的长度,如果是9A,下一个字节就是长度。

请注意,长度也是十六进制的,这意味着09表示9个字节,而as 10表示16个字节。对于10个字节,它是0A。

我现在祝福你飞起来!!

票数 3
EN

Stack Overflow用户

发布于 2021-02-25 21:50:07

虽然@adarsh-nanu的回答提供了确切的BER-TLV规范,但我认为@michael-mccauley遇到的是MagTek对TLV标签的无效使用。实际上,我在IDTech VIVOpay中遇到了这种情况,他们也使用了无效的标签。

我使用了自己的TLV解析例程,当不符合BER-TLV时,我特别调用了不一致的标记来强制设置长度。参见下面的示例代码:

代码语言:javascript
复制
int TlvTagLen(uchar *tag)
   {
   int len = 0;            // Tag length

   // Check for non-conforming IDTech tags 0xFFE0 : 0xFFFF
   if ((tag[0] == 0xFF) &&
       ((tag[1] >= 0xE0) && (tag[1] <= 0xFF)))
      {
      len = 2;
      }

   // Check if bits 0-4 in the first octet are all 1's
   else if ((tag[len++] & 0x1F) == 0x1F)
      {
      // Remaining octets use bit 7 to indicate the tag includes an
      // additional octet
      while ((tag[len++] & 0x80) == 0x80)
         {
         // Include the next byte in the tag
         }
      }

   return len;
   }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42450105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档