我在一个项目中与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字节数组传递给它时,它总是抛出异常。具体来说,这就是我得到的:
System.OverflowException : Array dimensions exceeded supported range.
我还尝试通过其他一些实用程序运行数据来解析它,但它们似乎都会抛出错误。所以,我想我已经尝试自己解析它,但我不确定最有效的方法来完成它。在某些情况下,我知道要读取多少字节来获取数据长度,但在其他情况下,我不知道会发生什么。
另外,当打破一些数据时,我会看到 F9 标签,在它和 DFDF54 标签之间,十六进制读取为8201B3。现在,考虑到完整消息长度的前两个字节是01B7,01B3是有意义的,但我不理解82.我不能假设它是" EMV应用程序的标签交换简介"因为那些列在 F2 标签下。
此外,还有一些零填充(我认为最多可达8个字节)和最后四个字节的其他内容,从一开始就排除在双字节消息长度之外。我不确定传入解析器的数据是否会导致问题。
答案 0 :(得分:1)
参考规格截图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个字节,其中10表示16个字节。对于10个字节,它是0A。
我现在祝福你飞翔!!
答案 1 :(得分:0)
虽然@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;
}