C#解析TLV数据(der -> asn1)

TLV  = Tag + Length + Value

nuget BerTlv.NET

 static void GetEimConfig()
 {
     var data = DataUtil.HexToByte("BF 55 82 05 26 A0 82 05 22 30 82 05 1E 80 1D 31 2E 33 2E 36 2E 31 2E 34 2E 31 2E 35 34 39 31 36 2E 39 39 39 2E 31 30 30 2E 31 30 31 81 17 65 69 6D 2D 73 63 6D 2E 63 69 2E 63 73 2E 69 64 65 6D 69 61 2E 69 6F 82 01 01 A5 82 02 23 A1 82 02 1F 30 82 01 C4 A0 03 02 01 02 02 14 21 CE 61 84 05 91 F4 98 E4 D5 FE 0A ED 6D 3C 7E 54 E1 31 2E 30 0A 06 08 2A 86 48 CE 3D 04 03 02 30 74 31 0B 30 09 06 03 55 04 06 13 02 46 52 31 17 30 15 06 03 55 04 07 0C 0E 43 6F 6C 6F 6D 62 65 73 20 43 65 64 65 78 31 0F 30 0D 06 03 55 04 0A 0C 06 49 64 65 6D 69 61 31 13 30 11 06 03 55 04 0B 0C 0A 49 64 65 6D 69 61 20 52 26 44 31 26 30 24 06 03 55 04 03 0C 1D 31 2E 33 2E 36 2E 31 2E 34 2E 31 2E 35 34 39 31 36 2E 39 39 39 2E 31 30 30 2E 31 30 31 30 1E 17 0D 32 34 30 36 30 37 30 38 35 38 31 31 5A 17 0D 32 35 30 36 30 37 30 38 35 38 31 31 5A 30 74 31 0B 30 09 06 03 55 04 06 13 02 46 52 31 17 30 15 06 03 55 04 07 0C 0E 43 6F 6C 6F 6D 62 65 73 20 43 65 64 65 78 31 0F 30 0D 06 03 55 04 0A 0C 06 49 64 65 6D 69 61 31 13 30 11 06 03 55 04 0B 0C 0A 49 64 65 6D 69 61 20 52 26 44 31 26 30 24 06 03 55 04 03 0C 1D 31 2E 33 2E 36 2E 31 2E 34 2E 31 2E 35 34 39 31 36 2E 39 39 39 2E 31 30 30 2E 31 30 31 30 59 30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 86 48 CE 3D 03 01 07 03 42 00 04 20 CC 43 28 DC 39 6D 1D DD E8 C3 D0 B4 17 8F 62 5B A6 82 F0 51 38 F9 30 D8 DE D8 A1 05 D1 19 92 35 8F B1 74 93 8C 6E CD 77 93 F7 60 35 28 08 62 87 D9 09 54 92 ED 0F A4 98 53 1A D0 AA 6B 0E 0E A3 34 30 32 30 20 06 03 55 1D 0E 01 01 FF 04 16 04 14 91 3F 33 FA EB 13 98 F3 CC 52 32 C4 AC F1 C4 69 6F F0 B4 7C 30 0E 06 03 55 1D 0F 01 01 FF 04 04 03 02 07 80 30 0A 06 08 2A 86 48 CE 3D 04 03 02 03 49 00 30 46 02 21 00 E1 6E 62 66 56 07 B5 2B 9F 68 65 EA 4E 11 E7 81 9F F5 77 70 50 65 90 73 61 57 0A 89 02 17 A2 26 02 21 00 B0 E8 B0 11 28 99 26 79 92 99 E4 10 5C 9D 91 FA D2 A1 08 1A 86 AB ED 15 8F 12 56 C9 FA 88 20 7E A6 82 02 9E A1 82 02 9A 30 82 02 3F A0 03 02 01 02 02 09 09 18 2C 84 53 82 46 7D EF 30 0A 06 08 2A 86 48 CE 3D 04 03 02 30 52 31 15 30 13 06 03 55 04 03 0C 0C 4F 54 20 43 49 20 54 65 73 74 20 31 31 1E 30 1C 06 03 55 04 0A 0C 15 4F 62 65 72 74 68 75 72 20 54 65 63 68 6E 6F 6C 6F 67 69 65 73 31 0C 30 0A 06 03 55 04 0B 0C 03 43 44 4D 31 0B 30 09 06 03 55 04 06 13 02 55 53 30 1E 17 0D 31 36 30 36 31 35 32 30 30 31 32 37 5A 17 0D 32 36 30 36 31 33 32 30 30 31 32 37 5A 30 66 31 0B 30 09 06 03 55 04 06 13 02 55 53 31 1F 30 1D 06 03 55 04 07 0C 16 52 61 6E 63 68 6F 20 44 6F 6D 69 6E 67 75 65 7A 20 48 69 6C 6C 73 31 1E 30 1C 06 03 55 04 0A 0C 15 4F 62 65 72 74 68 75 72 20 54 65 63 68 6E 6F 6C 6F 67 69 65 73 31 16 30 14 06 03 55 04 03 0C 0D 4F 54 20 45 55 4D 20 54 65 73 74 20 31 30 59 30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 86 48 CE 3D 03 01 07 03 42 00 04 3C 71 3A FB DC 85 96 F7 89 48 2F C4 F9 D7 C3 A7 DA 37 E3 13 E3 67 9E 3E 84 D4 35 3C 5A 22 5D 9D 27 12 7F 02 BC 49 37 97 F3 61 D3 F4 9C 12 83 B4 62 EA DC DB E5 F1 0B 1D 65 F1 B5 40 A5 60 01 11 A3 81 E9 30 81 E6 30 22 06 03 55 1D 23 01 01 FF 04 18 30 16 80 14 B1 60 DB 71 FC 24 3D C8 5D D8 DC 24 26 E8 34 66 1F A9 BC 57 30 20 06 03 55 1D 0E 01 01 FF 04 16 04 14 3F 2C 30 2E D6 C9 AA 6B ED 80 E9 17 C9 83 F8 1F D6 41 24 B0 30 0E 06 03 55 1D 0F 01 01 FF 04 04 03 02 01 06 30 17 06 03 55 1D 20 01 01 FF 04 0D 30 0B 30 09 06 07 67 81 12 01 02 01 02 30 13 06 03 55 1D 11 04 0C 30 0A 88 08 2B 06 01 04 01 81 EF 6F 30 12 06 03 55 1D 13 01 01 FF 04 08 30 06 01 01 FF 02 01 00 30 4C 06 03 55 1D 1F 01 01 FF 04 42 30 40 30 1E A0 1C A0 1A 86 18 68 74 74 70 3A 2F 2F 6F 74 2E 63 6F 6D 2F 6D 79 63 72 6C 41 2E 63 72 6C 30 1E A0 1C A0 1A 86 18 68 74 74 70 3A 2F 2F 6F 74 2E 63 6F 6D 2F 6D 79 63 72 6C 42 2E 63 72 6C 30 0A 06 08 2A 86 48 CE 3D 04 03 02 03 49 00 30 46 02 21 00 96 56 8F 64 FC 35 75 D7 2E E6 CC E9 C3 B5 8A F2 C4 5C CC 05 E0 71 10 6A D8 A7 AC B5 2F 65 FF A9 02 21 00 AF A6 61 1B 34 C0 A9 9D 61 50 C4 B6 FD DB CE E4 35 A7 88 E1 D7 94 69 EA 35 15 87 B8 87 B7 B3 3C 87 02 07 80 88 14 06 6D 48 A5 37 D9 71 91 C7 39 4A DC 3D EC 65 19 D1 B0 BF 89");

     // BerTlv
     var tlvs = Tlv.ParseTlv(data);
     var root = tlvs.SingleOrDefault(t => t.HexTag == "BF55");
     var _A0 = root.Children.SingleOrDefault(t => t.HexTag == "A0");
     var _30 = _A0.Children.SingleOrDefault(t => t.HexTag == "30");
     var eimId = DataUtil.BytesToUTF8String((_30.Children.SingleOrDefault(t => t.HexTag == "80")).Value);
     var eimAddress = DataUtil.BytesToUTF8String((_30.Children.SingleOrDefault(t => t.HexTag == "81")).Value);
     Console.WriteLine($"BerTlv - eimId: {eimId}, eimAddress:{eimAddress}");

     // Asn1
     // 1. 初始化 Reader (使用 BER/DER 规则,APDU 通常遵循这些)
     AsnReader reader = new AsnReader(data, AsnEncodingRules.BER);

     // 2. 解析外部 Tag [APPLICATION 31] (BF 55)
     // 注意:BF 55 在 ASN.1 中是一个构造类型的 Tag
     var rootTag = new Asn1Tag(TagClass.ContextSpecific, 0x55, isConstructed: true);
     AsnReader rootContent = reader.ReadSequence(rootTag);

     // 3. 解析内部序列 [CONTEXT 0] (A0)
     AsnReader context0 = rootContent.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 0));

     // 4. 解析内部 Sequence (30)
     AsnReader seq = context0.ReadSequence();

     // 5. 提取具体字段
     // 字段 [0]: OID (80 ..) -> 对应 1.3.6.1.4.1.54916...
     string oid = seq.ReadCharacterString(UniversalTagNumber.UTF8String, new Asn1Tag(TagClass.ContextSpecific, 0));

     // 字段 [1]: Hostname (81 ..) -> eim-scm.ci.cs.idemia.io
     string host = seq.ReadCharacterString(UniversalTagNumber.UTF8String, new Asn1Tag(TagClass.ContextSpecific, 1));
     Console.WriteLine($"Asn1 - eimId: {oid}, eimAddress:{host}");
 }

image

 

posted @ 2026-02-26 16:59  CHHC  阅读(9)  评论(0)    收藏  举报