问候,
如何简单地将一些二进制数据编码为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编码痛苦的开发人员有用。
谢谢!
答案 0 :(得分:1)
我会使用ASN.1 Compiler。
人们滥用ASN.1,因为它是一种编码数据结构的方法。只要你有一个C / C ++程序使用数据结构,攻击者就可以控制这些问题;缓冲区溢出和整数溢出,发挥作用。 ASN.1并不比XML或JSON或bencode更不安全,因为这些都是可能的失败点。编码库本身可能存在问题,例如nasty Microsoft vulnerability.但是无论您使用何种编码方法,此语句都是正确的。 ASN.1是一个很好的选择,因为结果消息非常小,并且它是我所知道的任何编码方法的空间的最有效利用。
答案 1 :(得分:1)
您不能只将一小块ASN.1附加到X.509证书,并期望它成为证书的一部分。证书是值的ASN.1 SEQUENCE,因此它以SEQUENCE标记和长度开始,其中包含所有证书。
如果要在证书结构中添加一个字段(这可能意味着它不再是一个有效的证书,但它仍然可以是一个有效的ASN.1结构),那么你将不得不改变它的长度封闭序列以及附加数据。
是,04 08 01 23 45 67 89 ab cd ef是八位字符串的有效DER编码。开头的04是OCTET STRING的标签,08是字符串的长度。请注意,最多127个长度在一个字节中编码,较长的长度使用较长的编码。
有关ASN.1的详细介绍 - 尤其是它在加密消息中的使用 - 请参阅“ASA.1,BER和DER子集的Layman指南”,您应该可以在rsa.com网站。
答案 2 :(得分:0)
我建议使用Quick DER,并为其der_pack()
例程提供一个结构描述,您可以使用其asn2quickder
编译器进行编译。如果是使用标准结构的问题,您可能只需#include <quick-der/rfc5280>
并使用其预定义数据。
您可以使用der_unpack()
进行拆包,并使用相同的结构说明。它将验证结构方面,但不是ASN.1语法可能包含的约束。当您使用放置和获取它们的实用程序函数时,将检查整数范围。
很抱歉要推送我的onw库;但它实际上是为了(开源)C / C ++和Python开发人员易于访问的ASN.1而编写的。