Certificate ASN1。序列与集合

Certificate ASN1。序列与集合,certificate,rsa,x509,asn.1,Certificate,Rsa,X509,Asn.1,我正在实现一个ASN1解析器来解码x509证书。您可以使用序列和集合标记。我看不出为什么这两个不应该是同一件事 区别是什么,以及使用每一个的合适时间?序列是有序的,集合不是 什么时候一套合适?一个例子可能是,当编码大量数据时,在发送者处按正确的顺序将它们带到发送者处会比强制以任何顺序接受它们带来更多的工作。作为@ChristophSommer答案的补充 序列是有序的,集合不是 。。。这会产生不同,例如,当编码某个对象时。使用DER(可分辨编码规则)需要集合元素的可分辨顺序,而序列元素保持其原始顺

我正在实现一个ASN1解析器来解码x509证书。您可以使用序列和集合标记。我看不出为什么这两个不应该是同一件事


区别是什么,以及使用每一个的合适时间?

序列是有序的,集合不是

什么时候一套合适?一个例子可能是,当编码大量数据时,在发送者处按正确的顺序将它们带到发送者处会比强制以任何顺序接受它们带来更多的工作。

作为@ChristophSommer答案的补充


序列是有序的,集合不是

。。。这会产生不同,例如,当编码某个对象时。使用DER(可分辨编码规则)需要集合元素的可分辨顺序,而序列元素保持其原始顺序

适当的使用时间

正如Christoph的回答所指出的,对于顺序中出现顺序相关的条目,使用序列;对于顺序无关的条目,使用集合


此外,一个集合的条目通常被认为是唯一的,集合中没有两个相同的条目,而一个序列可能包含许多相同的条目。

“通常被认为是唯一的”——DER中是否允许重复的集合条目?如何定义构造类型的唯一性?@jamestheaweesomedude“DER中是否允许重复集合项?”-这是一个好问题。最初我会说“不”,但看看ITU-T Rec.X.680和ITU-T Rec.X.690,我只看到集合的公式,大致上是“零、一个或多个组件类型值的无序列表”;这将允许复制。。。我很惊讶。您(正确地)提到,DER明确地指定了集合元素的
可分辨顺序
——它们是如何排序的/这种顺序是什么?这可能是一条线索或一条线索,因为任何明确的排序顺序都会围绕着相同的项目,即使没有在规范中讨论,也至少会产生有趣的结果来检查实现,因为计算机代码的不屈性。“一组值的分量值的编码应按升序显示,编码作为八位字节字符串进行比较,较短的分量在其尾端用0个八位字节填充。”-我错过了一个“严格的”“在订单定义中;要求严格的升序将禁止重复…在一个软件实现中,我尝试了消除一组整数的重复元素,但没有消除一组整数序列的重复元素。(尽管我怀疑实现是劣质的。)诚然,
aab
aab
之间没有区别,所以排序本身就是一种排序。。。但我认为人们真的“应该”注意这一点,在编码过程中不要依赖于库中的重复数据消除功能,除非已经过测试。