大家好,
如何简单地将一些二进制数据编码为ASN.1 DER编码的blob?我使用的是C/C++,我认为应该可以简单地在二进制blob前面加上一些适当的字节,这些字节表示数据是八位字节字符串类型,并且具有给定的长度(我猜是长度为1的序列)。
背景如果你感兴趣的话:
为什么我要这样滥用ASN.1?对于一个研究项目,我需要在具有关联X.509证书的数字签名中嵌入一些数据。(我正在使用Peter Gutmann的加密库中的createSignatureEx创建CMS / S/MIME-2/3 / PKCS-#7兼容的签名。我不会对我想要编码的数据进行签名,只是将其作为元数据添加到签名中以丰富它。)根据我的理解,带有任意扩展数据的严重签名需要使用ASN.1 DER对扩展数据进行编码。我的数据是二进制blob,只对我的应用程序有用,所以对我的数据的每个部分进行适当的ASN.1编码没有实际价值。我想,通过一些工作,我可以学习使用asn1c来做这件事,但它看起来相当复杂,而且我的截止日期已经到了。同样重要的是,这似乎没有必要,而且似乎这些信息对其他想要避免正确ASN.1编码之痛的开发人员很有用。
谢谢!
发布于 2010-09-04 00:15:34
我会使用ASN.1 Compiler。
人们滥用ASN.1,因为它是对数据结构进行编码的一种方式。任何时候,你有一个C/C++程序使用的数据结构,攻击者可以控制的问题,如:缓冲区溢出和整数溢出,发挥作用。ASN.1并不比XML、JSON或bencode更不安全,因为这些都可能是故障点。编码库本身可能会有问题,就像下面的nasty Microsoft vulnerability.,但无论使用哪种编码方法,这句话都是正确的。ASN.1是一个很好的选择,因为生成的消息非常小,而且它是我所知道的所有编码方法中最有效地利用空间的方法。
发布于 2010-09-09 06:37:19
您不能简单地将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站点上找到它。
发布于 2017-11-23 22:11:34
我建议使用Quick DER,并为它的der_pack()例程提供一个结构描述,您可以用它的asn2quickder编译器编译它。如果需要使用标准结构,您可以只使用#include <quick-der/rfc5280>并使用其预定义的数据。
您可以使用具有相同结构描述的der_unpack()进行解包。它将验证结构方面,但不会验证ASN.1语法可能包含的约束。当您使用放置和获取整数范围的实用程序函数时,将检查整数范围。
很抱歉推动我的onw库;但它实际上是为(开源) C/C++和Python开发人员编写的易于访问的ASN.1。
https://stackoverflow.com/questions/3637545
复制相似问题