asn1对OID的编码有一些规定,形如a.b.c.d.e的OID被编码的时候,完全可以按照der的编码规则将整个oid的类型设定为object,然后将每一个点分数字的类型设定为integer,最终编码为[obj|length[[int|lena[a]]][int|lenb[b]][int|lenc[c]]...],可是asn1标准并没有如此编码,而是使用了"more bit"这种方式,这样就少了很多的层次,不必为每一个点分数字进行asn1编码,具体说来就是将一个点分数字拆分为7bit一组的序列,然后除了最后一个的最高位填入0之外其余的最高位都填1,然后将它们合并在一起,最终将每一个经过这样处理的点分数字连接在一起,可以减少编码的长度,起码每个点分数字的type和length都省略了,唯一的不足是8bit的点分数字要编码为16bits。
以上仅仅是对oid编码的规定之一,还有一个很有意思的就是由于OID的前两极的标识数字都不是很大,因此更好的办法就是将OID的前两级编码到一个7bit的数中(由于标识more bit需要最高位,所以只剩下7位可以存数据),第一级OID只有3个,分别是itu-t(0),iso(1),joint-iso-itu-t(2),并且第二级OID标识最多也就23,挂于joint-iso-itu-t之下,现在需要一个算法,将第一级和第二级的OID标识编码到一个7bit的数里面,这就需要用一种平坦的方式来索引前两级的数据,构造一组虚拟的标识,为了对待三个一级OID标识更公平,最好是将127个“位置”平均分到三个一级标识,于是就将127除以3,结果是40,于是头40个虚拟标识分给itu-t,中间40个分给iso,后面的47个分给joint-iso-itu-t,这样,前两级是a.b的OID的a和b就被编码成了40*a+b,如此也就节省了一个编码byte。本质上这种编码的思想是在分级的标识上构造一组平坦的虚拟标识。
实际上为何不采用x86的页表的形式(或者说是trie树的形式)来进行编码呢,将127,也就是7个bit分成3个段,0-x为第一级索引,x+1-6位第二级索引...事实上这个想法是很不错的,但是看一下真实的情况,由于第二级最大的OID标识数是23,二进制为10111,又因为只能使用7个bit,则唯一的方案就是0-1bit为第一级索引,2-6bit为第二级索引,5个bit最大只能表示32,因此joint-iso-itu-t下还剩下9个可用的位置,虽然说root下面还有一个位置,而该位置下能挂32个二级位置,但是OID是国际机构的人定义的,这就存在很大的不稳定性,虽说7bit数能包容的总的虚拟位置是一定的,但是怎样对应这些平坦虚拟位置的真实分级位置却存在很大的人为因素,在root下增加一个节点的可能性不大,那意味的一个新的顶级机构的产生,但是在已经存在的机构下产生一个分支却是正常的,故joint-iso-itu-t下增加新节点的可能性要比root下增加新节点的可能性大得多,asn1的编码方案为joint-iso-itu-t留下了11个空闲位置,而类似trie树的编码方案只留下了确定的9个位置,孰优孰劣?看看同样都是二级标识,joint-iso-itu-t下面有23个节点,而itu-t下面却只有3个,然后就知道这样人为因素很大的系统是多么不适合在计算机中普遍使用的trie树了,trie树在不平衡的时候可以平衡化调整,可是OID树能调整吗?...
下面的perl代码展示了OID的编码过程:
sub der_it
{
local($v)=@_;
local(@a,$i,$ret,@r);
@a=split(//s+/,$v);
$ret.=pack("C*",$a[0]*40+$a[1]);
shift @a;
shift @a;
foreach (@a)
{
@r=();
$t=0;
while ($_ >= 128)
{
$x=$_%128;
$_/=128;
push(@r,((($t++)?0x80:0)|$x));
}
push(@r,((($t++)?0x80:0)|$_));
$ret.=pack("C*",reverse(@r));
}
return($ret);
}
分享到:
相关推荐
OID 编码规则 OID(Object Identifier)是一种用于标识对象的标识符,广泛应用于网络通信、加密和身份验证等领域。...这些 OID 编码规则都是基于 ASN.1 编码标准的,用于标识不同类型的对象和数据。
GB/T 16263.1-2006是中国的一个国家标准,它引用了ASN.1作为数据编码规范。ASN.1的强大之处在于它提供了一种独立于特定编程语言或计算机平台的方式来描述数据结构,使得不同系统间的通信变得更加高效和准确。 ASN.1...
asn1view的界面设计直观易用,即使是对ASN.1编码不熟悉的用户也能很快上手。通过这个工具,用户可以快速定位并解析ASN.1编码中的特定字段,帮助排查问题,或者验证数据是否符合预期的编码规范。此外,asn1view可能还...
asn1.js库提供了对ASN.1编码数据的解析功能,帮助开发者理解并操作这些复杂的数据结构。 在提供的压缩包文件中,我们可以看到以下几个关键文件: 1. **sha256sums.asc**:这通常包含文件的SHA-256校验和,用于验证...
下面是对ASN.1编码的详细解释: 1. **ASN.1基本概念** - **定义**:ASN.1是一种高级的二进制数据表示法,它允许数据以一种标准的、独立于特定计算机语言或平台的方式进行编码。 - **语法**:ASN.1定义了数据类型...
4. **对象标识符(OID)**:OID是ASN.1中的一种特殊类型,用于唯一标识一个实体,如标准、对象类或属性。OID遵循分层的树状结构,便于管理和分配。 5. **约束和可选字段**:在定义序列和集合时,可以添加约束条件,...
ASN1(Abstract Syntax Notation One)是一种用于编码结构化数据的标准,广泛应用于网络协议、数据库、数字证书等场景。ASN1编码格式提供了高效且可扩展的数据表示方式,它定义了数据类型、编码规则以及数据结构的...
总的来说,OID编解码工具是一个实用的辅助工具,它简化了对OID编码的理解和操作,提高了工作效率,尤其是在处理asn.1编码和网络管理场景时。对于那些需要频繁处理OID的IT专业人员来说,这是一个不可或缺的工具。
ASN.1是一种数据表示、编码、传输和解码的标准方法,广泛应用于通信领域,如电信、网络协议、安全协议等。 #### 编解码基础知识 在通信系统中,数据通常需要被编码为二进制形式以便在网络上传输,接收端则需要将...
Asn1Editor可以解析并显示OID的层次结构,帮助用户追踪到对应的国际标准或组织定义。 3. **可视化呈现**:该工具以树状结构展示ASN.1数据,便于直观地查看复杂的数据结构,包括嵌套的元素和序列。 4. **编辑和调试...
ASN.1(Abstract Syntax Notation One)是一种标准的符号表示法,常用于定义数据结构,特别是在通信协议、数据库模式和软件接口中。此工具也能够处理Base64编码的文件,这是一种常见的数据编码方式,将二进制数据...
4. **OID(对象标识符)支持**:BERViewer.OID可能是一个包含OID信息的文件,OID是唯一标识ASN.1定义的命名空间的一种方式,常用于证书、标准规范和其他需要唯一标识的实体。 使用这样的工具,IT专业人士可以轻松地...
ASN.1(Abstract Syntax Notation One)是一种标准的表示法,用于定义数据的结构和编码规则,常在通信协议、数据库、软件工程等领域使用。它提供了抽象语法的规范表示,以便于不同系统间的互操作性。BER(Basic ...
- **OID.txt**: 这个文件可能包含了对象标识符(OID)的列表,OID是ASN.1中用于唯一标识各种数据类型的编码,它们在证书和其他ASN.1编码的数据中广泛应用。 通过Asn1Editor,用户可以方便地浏览和编辑这些复杂的asn...
ASN.1 (Abstract Syntax Notation dot one),抽象记法 1。数字 1 被 ISO 加在 ASN 的后边, 是为了保持 ASN 的开放性,可以让以后功能更加强大的 ASN 被命名为 ASN.2 等,但至今 也没有出现。
ASN1(Abstract Syntax Notation One,抽象语法标记一)是一种标准化的数据表示语言,用于定义数据结构和信息的编码方式,广泛应用于通信协议、数据库、软件工程等领域。它为各种复杂数据类型提供了一种统一的表示...
ASN1 (Abstract Syntax Notation One) 是一种标准的数据表示法,用于在不同系统之间交换结构化信息,特别是在通信协议和数据库中。它定义了一种独立于机器和编程语言的二进制编码规则,使得不同平台的系统能够理解...
ASN.1(抽象语法标记一号)是用于定义数据结构的标准语法,它在多个领域,特别是通信协议和数据编码中广泛使用。在Z39.50标准中,ASN.1被用来规范信息检索服务的数据交换协议单元(APDUs)。Z39.50是一种图书馆和...
而BERViewer.OID文件可能包含了OID(对象标识符)的数据库,对象标识符是一种唯一的数字串,用于唯一地标识ASN.1定义的类型、值或实体,它们在ASN.1编码中扮演着重要的角色。 总的来说,了解和使用像BERViewer这样...
ASN.1(Abstract Syntax Notation One)是一种标准的表示数据的语法,用于在不同系统之间交换结构化信息,尤其在通信协议、数据库和软件工程中广泛应用。它定义了一种二进制编码规则(BER,Basic Encoding Rules),...