我在文档中发现他们指的是 SIMPLE-TLV 和 BER-TLV 。我查看了大多数EMV和GP文档,但他们没有提到不同之处。
谁能帮助我了解两者的区别?
最佳答案
ISO / IEC 7816-4中用于智能卡的数据字段
BER编码
这是ISO / IEC 7816-4使用的更常见的BER encoding的规范:
请注意,在当前标准中,ISO / IEC 7816仅允许使用最多5个长度的字节(指定大小最大为2 ^ 32-1字节)。也不支持不定长度编码。这些限制特定于智能卡。请注意,在更高版本的ISO / IEC 7816-4中引入了4和5字节长度的编码。较早的卡/读卡应用程序可能仅支持3个长度的字节(即,值大小最大为64KiB字节,而不是4GiB)。
BER TLV规范更加广泛(这就是为什么SIMPLE-TLV被称为“简单”)的原因。由于互联网上有大量可用信息,因此我不会过多地讨论细节。仅举几个区别,标签具有语法含义,可能包含多个字节,并且长度编码相当复杂。
通常,BER仅应用作ASN.1结构的编码,并使用ASN.1语法定义该结构。但是ISO 7816-4搞砸了,仅直接指定BER标签字节。
请注意,有时指定了DER而不是BER。在这种情况下,您应该仅使用最小字节数作为长度字段的大小-例如在以下示例中,单个字节的长度为05
。 BER编码的ISO / IEC规范基本上是美国特定X.690标准的副本,也反射(reflect)在国际标准ISO / IEC 8825-1(均为付费软件)中。
SIMPLE-TLV编码
在ISO / IEC 7816-4中的BER规范之后是SIMPLE-TLV规范。 SIMPLE-TLV特定于ISO 7816-4。
请注意,该标准忘记直接指定字节序。但是,您可以在ISO / IEC 7816-4中采用大端编码。
样品
以下示例均用于传达相同的标签号(用于定义字段)和值,但其中一个示例为BER定义了标签号31。
SIMPLE-TLV示例
0F 05 48656C6C6F // tag number 15, length 5 then the value
0F FF0005 48656C6C6F // tag number 15, length 5 (two bytes), then the value
BER-TLV示例:
4F 05 48656C6C6F // *application specific*, primitive encoding of tag number 15, length 5 then the value
4F 8105 48656C6C6F // the same, using two bytes to encode the length
4F 820005 48656C6C6F // the same, using three bytes to encode the length
4F 83000005 48656C6C6F // the same, using four bytes to encode the length
4F 8400000005 48656C6C6F // the same , using five bytes to encode the length
5F0F 05 48656C6C6F // **invalid** encoding of the same, with two bytes for the tag, specifiying a tag number 15 which is smaller than 31
5F1F 05 48656C6C6F // application specific, primitive encoding of **tag number 31**
在具有两个字节标签编码的最后一个示例中,第一个字节为40十六进制,其中最左边的前3个位010指定应用程序特定的编码,在其上加上魔术值1F(31)表示另一个字节将跟随标签号,同样为1F,因此值为31。
差异性
应注意以下差异: