1、RSA 私钥 DER 结构语法
RSAPrivateKey ::= SEQUENCE {
version Version, -- 当前的RSA版本,一般是 0x00
modulus INTEGER, -- n 是 RSA 合数模 n
publicExponent INTEGER, -- e 是 RSA 的公开幂 e
privateExponent INTEGER, -- d 是 RSA 的私有幂 d
prime1 INTEGER, -- p 是 n 的素数因子 p
prime2 INTEGER, -- q 是n 的素数因子q
exponent1 INTEGER, -- d mod (p-1) 等于d mod ( p − 1)
exponent2 INTEGER, -- d mod (q-1) 等于d mod ( q − 1)
coefficient INTEGER, -- (inverse of q) mod p 是 CRT 系数 q–1 mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
注:-- 在 ASN.1 中表示注释
DER 是一个 TLV 编码,数据结构 SEQUENCE 是总的 TAG 且其 TAG=0x30。
1.1、长度的表示方法有 2 种情况
1.1.1、数据长度 L < 0x80 的时候,Length 即为数据的长度;
1.1.2、数据长度 L >= 0x80 的时候,Length 为0x8x,表示后面跟的 x 标识 Length 所占字节长度。例如 82 01 20,0x82 表示 82 后面 2 个字节为长度的字节长度,数据长度为 0x0120。
1.2、Version 的 TAG 为 0x02,在 RSA 私钥的 DER 编码中,除了 SEQUENCE 的 TAG 为 0x30,其余的为 0x02,目前的 Version 值为 0。
1.3、modulus 的 TAG 为 0x02,其值的类型为整型。需要要注意的是当第一个数据字节的最高位为 1 时,即 0x8x 时,要在最高字节填充 0x00。这是因为 modulus 为一个大整数,最高位为符号位,其为1时,就是负数,所以要在最高位填充 0x00 以保证不为负。
1.4、TLV 格式数据解析示例
1.4.1、318 字节数据,512 bits 模数 n
3082013A020100024100A37D829F96226E5B7994EED72AB2C1E1A1A1DDD1BB3D8D7757BE8EE1B2CE68CDD69C87B58B28DD
BE9F7CD3549355FDB9CA00168973022DB54CA0F294C02D8BE302030100010240462DC63882D5DCD15F6B52EB01E521DC9C
E942B298D15F3C6F69D9238101A172AA6624FF1D809CEE7837F0F5D8A65CEB842135970AE192A92BD60A01C724A4A1022100D
708D658770058CB52D63E63D2E7CB81B31F66BCD2FBC32BCE2E2005D89BBBCF022100C2A2E086BBDAD1E87119F5623B507
AC883AB904FA9029DD5FBD114CEBD498FAD02204A8043532F17ADABF42D4A3C67ABEB742A4D2CD92AF8132CB02886EBBF9A
653D0220087FF06A31DDF678BE27B20D9E257F972E18D9EE80A4FA9B93A9A7CCF77B34E902210080AD5A6062279F99650CF39
BDAC2CD061CCF5E081D500065856AF12C98A0AE78
数据按照 TLV 分解后:
30 82 013A -- SEQUENCE TAG=0x30,0x82 标识后面两个字节是数据长度字节,数据长度为 0x013A
02 01 00 -- 版本号 version TAG=0x02,数据长度 L=0x01,版本=0x00
02 41 -- modulus TAG=0x02,数据长度 L=0x41
V = 00A37D829F96226E5B7994EED72AB2C1E1A1A1DDD1BB3D8D7757BE8EE1B2CE68CDD69C87B58B28DDBE9F7CD3549355FDB9CA00168973022DB54CA0F294C02D8BE3
02 03 01 00 01 -- publicExponent TAG=0x02,L=0x03,公开幂 e=0x01 0x00 0x01
02 40 -- privateExponent TAG=0x02,L=0x40 私有幂 d
V = 462DC63882D5DCD15F6B52EB01E521DC9CE942B298D15F3C6F69D9238101A172AA6624FF1D809CEE7837F0F5D8A65CEB842135970AE192A92BD60A01C724A4A1
02 21 -- 素数因子 prime1 TAG=0x02 L=0x21
V = 00D708D658770058CB52D63E63D2E7CB81B31F66BCD2FBC32BCE2E2005D89BBBCF
02 21 -- 素数因子 prime2 TAG=0x02 L=0x21
V = 00C2A2E086BBDAD1E87119F5623B507AC883AB904FA9029DD5FBD114CEBD498FAD
02 20 -- exponent1 TAG=0x02 L=0x20
V = 4A8043532F17ADABF42D4A3C67ABEB742A4D2CD92AF8132CB02886EBBF9A653D
02 20 -- exponent2 TAG=0x02 L=0x20
V = 087FF06A31DDF678BE27B20D9E257F972E18D9EE80A4FA9B93A9A7CCF77B34E9
02 21 -- coefficient TAG=0x02 L=0x21
V = 0080AD5A6062279F99650CF39BDAC2CD061CCF5E081D500065856AF12C98A0AE78
1.4.2、45 字节数据,31 bits 模数 n
302B0201000204741882490203010001020424E4711D020300D40F0203008C270203008D9F02024C6B02021CBE
数据按照 TLV 分解后:
30 2B -- SEQUENCE TAG=0x30 L=0x2B
02 01 00 -- RSA 版本号,TAG=0x02 L=0x01 V=0x00
02 04 74188249 -- 模数 n,T=0x02 L=0x04 V=0x74188249 = 十进制 1947763273,二进制 1110100 00011000 10000010 01001001(31 bits长)
02 03 010001 -- 公钥指数 e, T=0x02 L=0x03 V=0x010001=65537
02 04 24E4711D -- 私钥指数 d,T=0x02 L=0x04 V = 十进制 618950941
02 03 00 D40F -- p,T=0x02 L=0x03 V=54287 (数据 0xD4 最高位为 1,数据前需要补 0x00)
02 03 00 8C27 -- q,T=0x02 L=0x03 V=35879 (数据 0x8C 最高位为 1,数据前需要补 0x00)
02 03 00 8D9F -- d mod(p-1),T=0x02 L=0x03 V=十进制 36255 (数据 0x8D 最高位为 1,数据前需要补 0x00)
02 02 4C6B -- d mod(q-1),T=0x02 L=0x02 V=十进制 19563
02 02 1CBE -- CRT系数,T=0x02 L=0x02 V=十进制 7358
2、RSA 公钥 DER 结构语法
RSAPublicKey::=SEQUENCE
{
modulus INTEGER, -- 模值 n
public ExponentINTEGER -- 公开指数 e
}
2.1、TLV 格式数据解析示例
3081B70281B1009EC4B25143BC031540BB8B5A75551D3C5516CC211CB9A41E6C60BF02A535116A22F2B7
ACBD7EFBABE1E54FBF0E3066CB235D2F6B487DBC98F64A27BF233A2F12FC63B2185BF60FC1A7C79C3A8
D596A2423616AFAC8EA7EA715BFFA5828902487861AF7436CF02D11FB5272D237D344652FFA13DD3B8626
5C5DA15C28C4F3061619DBF6FFA1107031AADA36DECD4A4D5E6DA09CADE2F761215C7C39C1213C66CE
C432E6DE6F230B4103634A50B3392BC5020103
数据按照 TLV 分解后:
30 81 B7
02 81 B1 -- 模值 n TAG=0x02,标识内容为 BIT 数据流,0x81 代表有一字节代表长度,数据长度 L=0xB1
去掉前面的 0x00,余下 176 字节是 rsa 公钥的 N 值(1408 bit),modulus 为一个大整数,最高位为符号位,其为 1 时,就是负数,所以要在最高位填充 0x00 以保证不为负。
V = 009EC4B25143BC031540BB8B5A75551D3C5516CC211CB9A41E6C60BF02A535116A22F2B7ACBD7EFBAB
E1E54FBF0E3066CB235D2F6B487DBC98F64A27BF233A2F12FC63B2185BF60FC1A7C79C3A8D596A24236
16AFAC8EA7EA715BFFA5828902487861AF7436CF02D11FB5272D237D344652FFA13DD3B86265C5DA15C
28C4F3061619DBF6FFA1107031AADA36DECD4A4D5E6DA09CADE2F761215C7C39C1213C66CEC432E6D
E6F230B4103634A50B3392BC5
02 01 03 -- 公开指数 e TAG=0x02 L=0x01 V=0x03
0x03 便是 rsa 公钥的 e 值。
3、RSA 原理浅析
RSA 为一个非对称加密算法,基本包含的数据类型为
struct rsa_st {
BIGNUM *n;
BIGNUM *e;
BIGNUM *d;
BIGNUM *p;
BIGNUM *q;
BIGNUM *dmp1;
BIGNUM *dmq1;
BIGNUM *iqmp;
};
typedef struct rsa_st RSA;
3.1、各个结构体元素之间的数学关系
3.1.1、p和q为两个不相等的随机生成的质数
3.1.2、n为p和q的乘积
3.1.3、计算出来n的欧拉函数φ(n),这个φ(n)虽然没有在结构体里面体现出来但是其实是作为一个核心数据存在的。
3.1.4、随机选择一个整数e,条件是1< e <φ(n),且e与φ(n)互质。
3.1.5、计算e对于φ(n)的模反元素d
ed ≡ 1 (modφ(n))
e和d之间的乘积除以φ(n)余1
最终的公钥为 n 和 e; 私钥为 n 和 d。
3.2、加解密过程:
3.2.1、加密过程
me ≡ c (mod n)
m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。
所谓"加密",就是算出下式的c:
me ≡ c (mod n)
3.2.2、解密过程
cd ≡ m (mod n)
refer:
https://blog.csdn.net/lingruoshui/article/details/11481219
https://blog.csdn.net/newlifenewwork/article/details/60466722