Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析MagTek EMV TLV_C#_Emv_Tlv - Fatal编程技术网

C# 解析MagTek EMV TLV

C# 解析MagTek EMV TLV,c#,emv,tlv,C#,Emv,Tlv,我正在与MagTek DynaPro合作一个项目,读取信用卡数据并将其输入会计系统(这不是我在这个项目上的第一篇文章)。我已经成功地利用了Dukpt.NET来解密MSR数据,所以这很好()。因此,我开始着手获取EMV数据,并使用以下MagTek文档作为TLV结构参考:(从第89页开始)。但是,我在读取数据时遇到了问题 我尝试使用BerTlv.NET()来处理数据解析,但当我将TLV字节数组传递给它时,它总是抛出异常。具体来说,我得到的是: System.OverflowException : A

我正在与MagTek DynaPro合作一个项目,读取信用卡数据并将其输入会计系统(这不是我在这个项目上的第一篇文章)。我已经成功地利用了Dukpt.NET来解密MSR数据,所以这很好()。因此,我开始着手获取EMV数据,并使用以下MagTek文档作为TLV结构参考:(从第89页开始)。但是,我在读取数据时遇到了问题

我尝试使用BerTlv.NET()来处理数据解析,但当我将TLV字节数组传递给它时,它总是抛出异常。具体来说,我得到的是:

System.OverflowException : Array dimensions exceeded supported range.
我还尝试通过其他一些实用程序来解析数据,但它们似乎也都会抛出错误。所以,我想我只能试着自己来解析它,但我不确定哪种方法最有效。在某些情况下,我知道要读入多少字节才能获得数据长度,但在其他情况下,我不知道会发生什么

另外,当中断一些数据时,我得到F9标记,在它和DFDF54标记之间,十六进制读取为8201B3。现在,考虑到完整消息长度的前两个字节是01B7,01B3是有意义的,但我不理解82。我不能假设这是“EMV应用程序交换配置文件”的标记,因为它列在F2标记下


此外,还有一些零的填充(我认为最多值八个字节)和结尾的四个字节的其他内容,这些内容在一开始就被排除在两个字节的消息长度之外。我不确定传递到解析器的数据是否会导致问题。

参考规范屏幕截图1,根据EMV规范,您应该阅读如下标签

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


我现在祝福你飞翔

参考规范屏幕截图1,根据EMV规范,您应该阅读如下标签

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


我现在祝福你飞翔

虽然@adarsh nanu的回答提供了准确的BER-TLV规范,但我相信@michael mccauley遇到的是MagTek对TLV标签的无效使用。事实上,我在IDTech VIVOpay的这个场景中无意中发现了他们也使用了无效的标签

我自己滚动了TLV解析例程,并专门调用了不符合项的标记,以强制设置长度,而不符合BER-TLV。请参见下面的示例代码:

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;
   }
int-TlvTagLen(uchar*tag)
{
int len=0;//标记长度
//检查是否存在不合格的IDTech标签0xFF0:0xFFFF
如果((标记[0]==0xFF)&&

((tag[1]>=0xE0)和&(tag[1]虽然@adarsh nanu的答案提供了确切的BER-TLV规范,但我相信@michael mccauley遇到的是MagTek对TLV标签的无效使用。实际上,我在IDTech VIVOpay的这个确切场景中遇到了一些问题,他们也使用了无效的标签

我推出了自己的TLV解析例程,并专门调用了不一致标记,以在不符合BER-TLV的情况下强制设置长度。请参见下面的示例代码:

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;
   }
int-TlvTagLen(uchar*tag)
{
int len=0;//标记长度
//检查是否存在不合格的IDTech标签0xFF0:0xFFFF
如果((标记[0]==0xFF)&&

((标记[1]>=0xE0)和&(标记[1]好的,所以我只是一块一块地仔细检查和挑选TLV数据。结果表明,响应不是BER-TLV的标准,甚至不是MagTek自己的文档中规定的格式。我经过了大量耐心之后才找到了所有的片段,并且有一些标签似乎没有用任何EMV标准定义。现在我只有了解如何区分芯片读取和条带读取等。谢谢。Michael,你是如何将数据分开的?我一直在尝试解密DFDF59,但使用DUKTPDUPKT无法正确输出与解析无关。DUPKT用于使用从BDK派生的一次性密钥加密数据,您将派生sam在另一端加密密钥,并使用它解密数据。一旦你有了清晰的数据,你可以像上面提到的那样放入解析规则。为了确保你的DUPKT实现是正确的,我建议测试各种各样的数据,看看你是否能够在另一端无任何问题地解密。在生产环境中调试它DUKPT与Magtek MSR合作,目前正在尝试使用DFDF56(KSN)解密标记DFDF59(加密数据),第2轨道的等效数据或清晰的PAN似乎不存在,有什么建议吗?好的,所以我只是一块一块地仔细检查并挑选TLV数据。结果表明,响应不是BER-TLV的标准,甚至不是MagTek自己文档中规定的格式。我在经过大量耐心之后才能够找到所有的片段,而且还有ta似乎没有任何EMV标准定义的gs。现在我只需要弄清楚如何区分芯片和条带读取等。谢谢。Michael how