PKCS#1中介绍了哈希算法的OID等的ASN.1结构,因为使用ASN.1的解码工具(比如:ASN1View)时,会自动显示出各OID的含义,所以这里就不说明了。下面就只简单摘抄一下RSA公私钥的ASN.1的结构。
ASN.1的编码回头会专门介绍,为了便于理解:SEQUENCE,暂时就理解为C语言里面的结构体就好;INTEGER,理解为正数类型就好。
ASN.1抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。
RSA公钥:
RSAPublicKey :: = SEQUENCE{
modulus INTEGER, ------ n(模长,正整数)
publicExponent INTEGER ------ e (指数,3~n-1范围内的正整数)
}
RSA公钥的ASN.1结构,可以表述为:名为RSAPublicKey的这个结构呢,就可以用来表述一个RSA公钥了。它有两个INTEGER型变量:modulus和publicExponent。
RSA私钥:
RSAPrivateKey :: = SEQUENCE{
version Version,
modulus INTEGER, ------ n
publicExponent INTEGER, ------ e
privateExponent INTEGER, ------ d
prime1 INTEGER, ------ p
prime2 INTEGER, ------ q
exponent1 INTEGER, ------ d mod (p -1)
exponent2 INTEGER, ------ d mod (q -1)
coefficient INTEGER, ------- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos ------ OPTIONAL(当version为0时,不存在;当 version为1时,必须有)
}
Version :: = INTEGER{ two-prime(0), multi(1)}
版本号的ASN.1结构可以表述为:名为Version的结构体,用于描述版本信息。它类似于枚举类型,其变量类型为INTEGER,取值为0或1。
OtherPrimeInfos :: = SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo
OtherPrimeInfos 是由 OtherPrimeInfo组成的数组
OtherPrimeInfo :: = SEQUENCE {
prime INTEGER, --- ri
exponent INTEGER, --- di
coefficient INTEGER --- ti
}
推荐一篇专门介绍ASN.1编码的文章:《ASN.1/BER/DER 编码子集入门指南》