问候,

如何简单地将一些二进制数据编码到ASN.1 DER-DER-DER-编码斑点中?我正在使用c/c ++,我认为应该可以简单地将二进制斑点以一些适当的字节前缀,这些字节表示数据是类型八位字字符串,并且具有给定的长度(并且按照长度为1 i的序列。猜测)。

如果您有兴趣,背景:

我为什么要以这种方式滥用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编译器.

人们滥用ASN.1,因为这是一种编码数据结构的方式。每当您有一个C/C ++程序使用攻击者控制类似问题的数据结构时;缓冲区溢出和整数溢出,开始发挥作用。 ASN.1并不比说XML或JSON或BENCODE更不安全,因为这些都是失败的点。编码库的自我可能存在问题, 讨厌的Microsoft漏洞。 但是,无论您使用的编码方法如何,此语句都是正确的。 ASN.1是一个不错的选择,因为结果消息非常小,它是我所知道的任何编码方法中最有效的空间使用。

其他提示

您不能仅仅将ASN.1的斑点附加到X.509证书上,并期望它成为证书的一部分。证书是ASN.1值的序列,因此它以序列标签和长度开始,该序列涵盖了所有证书。

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

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

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

我建议使用 快速der, ,并喂给它 der_pack() 常规的结构描述,您可以与其一起编译 asn2quickder 编译器。如果是使用标准结构的问题,您可能只能 #include <quick-der/rfc5280> 并使用其预定义的数据。

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

很抱歉推动我的ONW图书馆;但实际上是为了易于访问的ASN.1而编写的(开源)C/C ++和Python开发人员。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top