RSA公私钥结构语法:
RSAPublicKey::=SEQUENCE{
modulusINTEGER,--模值n
publicExponentINTEGER--公开指数e}
RSA私钥结构语法
RSAPrivateKey::=SEQUENCE{
versionVersion,--version是INTEGER类型的0
modulus INTEGER,--模值n
public ExponentINTEGER,--公开指数e
privateExponent INTEGER,--d
prime1 INTEGER,--p
prime2 INTEGER,--q
exponent1 INTEGER,--dmod(p-1)
exponent2 INTEGER,--dmod(q-1)
coefficient INTEGER--(inverseofq)modp}
在组织公私钥DER编码时需要注意:
1)上述TLV结构中:
V值长度<0x80,L表示数据的长度;
V值长度>=0x80的时候,L为0x8X,X表示的L长度要占用的字节数,X个字节用来表示V的长度。
2)RSA公钥N的第一个字节如果大于0x80,则需要在公钥值前面补00,这是因为modulus
为一个大整数,最高位为符号位,其为1时,就是负数,所以要在最高位填充0x00以保证不为负。所以公钥TLV应该是:02 81 81 00 [128字节个公钥值]。
3)RSA私钥的N,d,p,q,Dp,Dq,Mp也需要考虑(2)中的第一个字节如果大于0x80的情况。