RSA公钥DER编码

例子:

3081B70281B1009EC4B25143BC031540BB8B5A75551D3C5516CC211CB9A41E6C60BF02A535116A22F2B7

ACBD7EFBABE1E54FBF0E3066CB235D2F6B487DBC98F64A27BF233A2F12FC63B2185BF60FC1A7C79C3A8

D596A2423616AFAC8EA7EA715BFFA5828902487861AF7436CF02D11FB5272D237D344652FFA13DD3B8626

5C5DA15C28C4F3061619DBF6FFA1107031AADA36DECD4A4D5E6DA09CADE2F761215C7C39C1213C66CE

C432E6DE6F230B4103634A50B3392BC5020103

分解:

3081B7 

0281B1

009EC4B25143BC031540BB8B5A75551D3C5516CC211CB9A41E6C60BF02A535116A22F2B7ACBD7EFBAB

E1E54FBF0E3066CB235D2F6B487DBC98F64A27BF233A2F12FC63B2185BF60FC1A7C79C3A8D596A24236

16AFAC8EA7EA715BFFA5828902487861AF7436CF02D11FB5272D237D344652FFA13DD3B86265C5DA15C

28C4F3061619DBF6FFA1107031AADA36DECD4A4D5E6DA09CADE2F761215C7C39C1213C66CEC432E6D

E6F230B4103634A50B3392BC5

020103

 

注解:采用的是TLV结构(tag-length-value在此将整个编为一个sequence--结构体,以30作为开始标志,从第四位02开始便是此sequence的内容,相当于结构体的元素,一般来说sequence往往需要嵌套,相当于结构体嵌结构体,但对公钥的sequence来说,此处仅有一层。 第四位02代表一下的内容为bit,同样紧随其后的81代表有一字节代表长度,第六位的B1代表长度为177,即从00开始直到最后一行C5此为177字节,

去掉前面的00,余下176位便是rsa公钥的N1408 bit(即在生成RSA对时指定的模长!)

最后3个字节同样是bit流,以02开始,03表示长度为3,最后的03 便是rsa公钥的E。 

关于为什么要在N值前补00,这可能是ASN.1的规定,若bit流的前四bit十六进制值大于8就要在在最前补零

参见下例子:30 81 88 02 81 80 32 8d 99 06 9f bd 9a c0 e5 6a,其中0X3小于8,所以就不需要补00

补记:这是因为modulus 为一个大整数,最高位为符号位,其为1时,就是负数,所以要在最高位填充0x00以保证不为负。 

长度的表示方法有以下2种情况:
1. 数据长度<0x80的时候,Length即为数据的长度;
2. 数据长度>=0x80的时候,Length0x8?,表示后面跟的?表示的Length长度。例如82 01 2082表示82后面2个字节为长度的字节长度,数据长度为0x0120

你可能感兴趣的:(加密-解密-算法)