3.2 CER与DER
CER与DER(Canonical and Distinguished Encoding Rules)
3.2.1 更多限制规则的需求
在X.400 和X.500中应用接力传递消息,会使用到X.509数字签名(Digital Signature),其过程如下图所示:
Figure 3-25 接力传递消息
发送方发送v的编码结果c1(v),同时发送其数字签名σ(c1(v));中继收到消息后,解码得到v,保留签名,发送时重新编码发送结果为c2(v);接收方收到结果后,解码得到v,同时对c2(v)计算数字签名σ(c2(v)),通过比较σ(c1(v))与σ(c2(v))是否相同来确定消息内容是否被修改。
在上面的过程中,如果直接使用BER编码规则,比如存在BOOLEAN类型的值“TRUE”,则因为两次编码过程c1和c2可能对TRUE的编码结果不同,从而导致数字签名比较不通过。
通常,我们称不给因具体实现和编码过程动态因素留出自由发挥余地的编码规则为规范编码规则(Canonical)。从BER中派生出两种规范编码规则,分别为CER(Canonical Encoding Rules)和DER(Distinguished Encoding Rules)。这两种规则是BER规范的特例,因此BER解码器能解码这两种规则的传输语法,反之则不然。
这两套编码规则为抽象值和他们的编码提供了一一对应的关系。应用这个属性,接收应用层可以不用了解具体结构和类型,就能比较接收的八位组流。
这两套规则的主要区别在于:CER针对不定长格式,而DER针对定长格式。因此CER常应用在需要传输大量数据的应用的。
Table 3-1 CER、DER对BER的限制
CER | DER |
长度域Length L | |
primitive类型采用定长形式(有长、短两种情况); constructed类型采用不定长形式。 | 不管是primitive还是constructed类型,L都是定长形式的。 |
BOOLEAN | |
值“TRUE”的编码为:11111111。 | |
REAL | |
if the base component equals 10, a real value is encoded as a character string of NR3 format without spaces [ISO6093]; it has no “+" sign if the number is positive; the dot is the decimal separator; the mantissa must not begin nor end with zeros; it is followed by a dot and the E character; the exponent must not use the “+" sign nor begin with a 0 but for the null exponent denoted “+0" | |
| [X.509] forbids base-10-real values in the Directory applications |
if base = 2, a real value is binary-encoded with mantissa M and exponent E so that the mantissa equals 0 or is an odd number; the mantissa and the exponent are encoded on the minimum number of octets; the scale factor F equals 0 | |
BIT STRING | |
最后一个八位组中未使用的比特为0; 如果包含一个命名列表,最后的0比特不编码;如果该类型有SIZE约束,则按照需要补充并且编码最后的0比特;如果取值为空,则长度为1,值为全0的八位组。 | |
BIT STRING或者OCTET STRING或者CHARACTER STRING | |
如果小于1000个八位组,则采用primitive形式; 否则采用constructed形式;除最后一个外,其余子部分,每个为1000个八位组。 | 一律采用primitive形式。 |
GeneralString | |
escape sequences must only be used when the requested character set differs from the usual C0, C1 and G sets (see also the defect report http://www.furniss.co.uk/maint/asn/dr8825 1 005.htm) | |
GeneralizedTime或者UTCTime | |
秒不是必须的;秒片段中0有意义;如果没有秒片段,就没有小数点; 必须同步为Universal Time(即以z开头); GeneralizedTime类型,小数点必须使用。 | |
SEQUENCE或者SET | |
各个成员等于其未编码的值。 | |
SET | |
成员按照其Tag升序编码;如果模块声明包含AUTOMATIC TAGS,则按照描述的顺序编码; | |
当成员是一个无Tag的CHOICE,它要用其选项中最小Tag来参加排序(静态顺序) | 当成员是一个无Tag的CHOICE,它要用被选择项的Tag来参加培训(动态顺序) |
为了避免这种排序步骤,推荐用SEQUENCE替代SET。 | |
SET OF | |
按照编码的升序排列:这些编码作为OCTET STRING进行比较,比较需要的话,后面补充空八位组; 为了避免这种动态的排序,推荐用SEQUENCE OF替代SET OF。 | |
EXTERNAL、EMBEDDED PDV或者CHARACTER STRING | |
只有当抽象语法包含子类型约束避免传递表示上、下文标识的情况下,才能接力传递,如: EMBEDDED PDV (WITH COMPONENTS {..., identification (WITH COMPONENTS { ..., presentation-context-id ABSENT, context-negotiation ABSENT })}) 和字符抽象语法相关联的字符传输语法注册在{iso standard 10646 level-1(1)}都是规范的;此外,符合注册为level-2(2)或者level-3(3)抽象语法的值也能接力传递。 |
3.2.2 CER
CER比DER出现晚,它的Object Identifier为:{joint-iso-itu-t asn(1) ber-derived(2) canonical-encoding(0)},Object Description为:”Canonical encoding of a single ASN.1 type”。
CER十分适合使用潜在重要编码的应用中,如ODA(Office Document Architecture)。对编码器,如果编码数据比可用内存空间大,就有必要使用不定长方式,在完成全部编码前开始发送。因为很少有编译器能产生这种形式的编码,所以CER在实际应用中比较少,这也是为什么DER作为缺省规范规则的原因。
3.2.3 DER
DER的Object Identifier为:{joint-iso-itu-t asn(1) ber-derived(2) distinguished-encoding(1)},Object Description为:”Distinguished encoding of a single ASN.1 type”。
DER适合安全数据传输,特别是数字签名方面。在电子商务方面有独特的优势。适合传输平均大小的数据。因为采用定长编码,所以要求编码器有足够的内存空间。