2

问候,

如何简单地将一些二进制数据编码为 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 来做到这一点,但它看起来很复杂,而且我已经到了最后期限。同样重要的是,

谢谢!

4

3 回答 3

1

我会使用ASN.1 Compiler

人们滥用 ASN.1,因为它是一种编码数据结构的方式。任何时候你有一个 C/C++ 程序使用攻击者控制的数据结构,比如:缓冲区溢出和整数溢出,开始发挥作用。ASN.1 并不比 XML 或 JSON 或 bencode 更不安全,因为这些都是可能的故障点。编码库本身可能存在问题,例如这个令人讨厌的 Microsoft 漏洞。但是无论您使用哪种编码方法,这句话都是正确的。ASN.1 是一个很好的选择,因为生成的消息非常小,而且它是我所知道的任何编码方法中最有效地利用空间的方法。

于 2010-09-03T16:15:34.257 回答
1

您不能只将 ASN.1 的 blob 附加到 X.509 证书并期望它成为证书的一部分。该证书是一个 ASN.1 值序列,因此它以一个 SEQUENCE 标记和一个长度开始,其中包含所有证书。

如果您想在证书结构中添加一个字段(这可能意味着它不再是有效的证书,但它仍然可能是有效的 ASN.1 结构),那么您必须将该封闭序列的长度更改为以及附加您的数据。

是的,04 08 01 23 45 67 89 ab cd ef 是八位字节字符串的有效 DER 编码。开头的 04 是 OCTET STRING 的标记,08 是字符串的长度。请注意,最多 127 的长度被编码在一个字节中,并且更大的长度使用更长的编码。

有关 ASN.1 的良好介绍——尤其是其在加密消息中的使用——请参阅“ASN.1、BER 和 DER 子集的外行指南”,您应该可以在 rsa.com 上找到它地点。

于 2010-09-08T22:37:19.243 回答
0

我建议使用Quick DER,并为其der_pack()例程提供可以使用其asn2quickder编译器编译的结构描述。如果它是使用标准结构的问题,您可能可以只#include <quick-der/rfc5280>使用它的预定义数据。

您可以使用der_unpack()相同的结构描述进行解包。它将验证结构方面,尽管不是 ASN.1 语法可能包含的约束。当您使用放置和获取整数范围的实用函数时,会检查整数范围。

很抱歉推我的 onw 库;但它实际上是为了方便(开源)C/C++ 和 Python 开发人员访问 ASN.1 而编写的。

于 2017-11-23T14:11:33.617 回答