C++ 如何简单地创建ASN.1 DER编码的blob

C++ 如何简单地创建ASN.1 DER编码的blob,c++,c,security,blob,asn.1,C++,C,Security,Blob,Asn.1,您好 我如何简单地将一些二进制数据编码成ASN.1 DER编码的blob?我使用的是C/C++,我想应该可以简单地在二进制blob前面加上一些适当的字节,表示数据是八位字节字符串类型,并且具有给定的长度(我猜是长度为1的序列) 背景如果您感兴趣: 为什么我要这样滥用ASN.1?对于一个研究项目,我需要在一个数字签名中嵌入一些数据,该数字签名具有一个关联的X.509证书。(我正在使用Peter Gutmann的cryptlib库中的createSignatureEx来创建符合CMS/s/MIME-

您好

我如何简单地将一些二进制数据编码成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编码带来的痛苦的开发人员很有用

谢谢

我会使用


人们滥用ASN.1,因为它是一种对数据结构进行编码的方法。任何时候,只要有一个C/C++程序使用攻击者控制的数据结构,就会出现如下问题:;缓冲区溢出和整数溢出,开始发挥作用。ASN.1并不比XML、JSON或bencode更不安全,因为这些都是可能的故障点。编码库本身可能会有问题,就像这样,但无论使用何种编码方法,此语句都是正确的。ASN.1是一个很好的选择,因为生成的消息非常小,而且它是我所知道的任何编码方法中最有效的空间利用方式。

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

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

是,04 08 01 23 45 67 89 ab cd ef是八位字节字符串的有效DER编码。开头的04是八位字节字符串的标记,08是字符串的长度。请注意,长度高达127的代码是在一个字节中编码的,长度越大,使用的编码就越长

有关ASN.1的详细介绍,特别是它在加密消息中的使用,请参阅“ASN.1、BER和DER子集的外行指南”,您应该可以在rsa.com网站上找到它。

我建议使用,并提供其
deru pack()
例程,其结构描述可使用其
asn2quickder
编译器编译。如果是使用标准结构的问题,您可能只需要
#包含
并使用其预定义的数据

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


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

很有趣。我可以看到正确编码所提供的保护价值。但这只是一个研究项目,我需要在昨天完成。如果可以的话,我尽量避免使用asn1c来编写所有的样板代码等。如果我使用asn1c,我会将其编码为二进制blob(八进制字符串)。请不要在震惊中摔倒;我是一名安全研究人员,但这只是需要完成的。@Paul作为一名安全研究人员,我不知道你想完成什么。@Paul,听起来你想写一个ASN.1 fuzzer,祝你一天内完成。如果您攻击一个应用程序,那么您需要了解所有ASN.1结构,比如专门针对X.509.Ah的处理。不,我不是想攻击什么东西。我只是想用一些额外的数据来增强数字签名,我声称这些数据提供了安全价值(我不能说更多)。模糊可能会用来发现有效的输入,但今天早些时候我在编译器上做了一个快速的旋转,我想我会这样做。最初我只是将其编码为一个八位组字符串,然后也许稍后我会变得更有趣,并正确地编码我的结构。关于如何清理asn1c的subversion输出有什么建议吗?它生成了60个文件,我希望不要将它们全部签入。顺便说一句,使用asn1c(正是我要求如何避免这样做的:)是我最终选择的路径,它比我预期的要简单,但仍然需要几个小时(当我做一些更详细的事情时,还需要几个小时)。因此,如果没有更好的答案出现,我将接受这个答案。如果我正确理解的第5.10节,对于短blob,我可以通过前缀“04 08”将它们编码为八位字节流。大概这只适用于长度为127左右的水滴。他们说“0123456789ab-cd-ef”DER的原始编码为“04080123456789 ab-cd-ef”。有人能证实我的理解吗?这足以生成有效的ASN.1流吗?对于长度高达64k或32k的BLOB,这种情况如何变化?ans.1不使用字节边界。例如,如果您有一个结构,并且一个元素是由6个元素组成的枚举,那么它将只占用3位。如果下一个元素i