2

.NET 的 System.DirectoryServices.Protocols 程序集指定了一个轻量级 ASN.1 BER 编码器,但文档不是很好:BerConverter.

您可以通过指定格式字符串和要编码的对象列表来调用它。

  • INTEGERs 可以用格式字符编码ie
  • OCTET STRINGs 可以用o字符编码
  • SEQUENCEs 可以用{和编码}
  • 等等

我真的很想使用这个简单的转换器,所以我不必承担额外的依赖。接受依赖是不可取的,因为 C# 可以从 Powershell 调用,并且分发一个与 C# 做一些花哨的脚本是很好的,只要它不需要 .NET 不包含的程序集。

但是,BerConverter 似乎没有办法指定 Application 或 Context-Specific 标签,这些标签通常用于消除 ASN.1 中的歧义,例如当构造类型的组件被标记为OPTIONAL

因此,我可以对以下内容进行编码:

BerConverter.Encode("{i{i}}", 1, 2);

这使:

30 84 00 00 00 0c 02 01 01 30 84 00 00 00 03 02 01 02

但是,如果第二个序列需要[Application 1]或者61......我不确定在格式字符串中放入什么以在编码中发出它。

BerConverter 甚至有这个能力吗?

4

1 回答 1

1

我不知道为什么我不直接这样做,而是使用反编译器来查看代码。我发现它BerConverter.Encode()基于ber_printf(),它有更好的文档。

从文档:

字符: 't'

描述:

标记。下一个参数是一个ber_tag_t,它指定要覆盖写入BerElement的下一个元素的标记。这适用于调用。

因此,我能够将代码更改为:

BerConverter.Encode("{it{i}}", 1, 0x61, 2)

这允许我将标签值设置为0x61并发出代码:

30 84 00 00 00 0c 02 01 01 61 84 00 00 00 03 02 01 02

于 2016-10-28T15:18:41.920 回答