【发布时间】:2011-04-07 22:38:07
【问题描述】:
您好,
如何将一些二进制数据简单地编码为 ASN.1 DER 编码的 blob?我正在使用 C/C++,我认为应该可以简单地在二进制 blob 前面加上一些适当的字节,这些字节表示数据的类型是八位字节字符串并且具有给定的长度(并且在长度为 1 的序列中)猜)。
感兴趣的背景:
我为什么要以这种方式滥用 ASN.1?对于一个研究项目,我需要在具有关联 X.509 证书的数字签名中嵌入一些数据。 (如果重要的话,我在 Peter Gutmann 的 cryptlib 库中使用 createSignatureEx 来创建符合 CMS / S/MIME-2/3 / PKCS-#7 的签名。我没有对要编码的数据进行签名,只是将其添加为元数据到签名以丰富它。)据我了解,具有任意扩展数据的严重签名需要使用ASN.1 DER对扩展数据进行编码。我的数据是二进制 blob,仅对我的应用程序有用,因此对数据的每个部分进行正确的 ASN.1 编码没有真正的价值。我想通过一些工作我可以学会使用 asn1c 来做到这一点,但它看起来很复杂,而且我快到最后期限了。同样重要的是,这似乎是不必要的,而且这些信息似乎对其他想要避免正确 ASN.1 编码的痛苦的开发人员有用。
谢谢!
【问题讨论】:
-
如果我正确理解了luca.ntop.org/Teaching/Appunti/asn1.html 的第 5.10 节,对于短 blob,我可以通过前缀“04 08”将它们编码为八位字节流。据推测,这只适用于长度为 127 左右的 blob。他们说“01 23 45 67 89 ab cd ef”DER 原始编码为“04 08 01 23 45 67 89 ab cd ef”。谁能验证我的理解?这足以制作有效的 ASN.1 流吗?对于长度不超过 64k 或 32k 的 blob,这种情况有何变化?
-
ans.1 不使用字节边界。例如,如果你有一个结构并且一个元素是 6 个元素的枚举,它只会占用 3 位。如果下一个元素是字节,则 5 位将占用该字节的剩余空间。
-
如果你一天之内需要它,你可以构建一个基于变异的模糊器。因此,获取一个真正的 ASN.1 编码结构并对其进行迭代并开始将半字节设置为 0x0 或 0xF,您可以尝试一次执行一个字节或 2 位,甚至只是翻转每个位。这取决于您的测试工具有多快……Peach 是一个非常酷的项目。