【IoT】加密与安全:非对称加密算法 RSA 公私钥 DER 编码示例解析

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 中表示注释 

ASN.1、BER 和 DER 浅析

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 格式数据解析示例

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

产品人卫朋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值