RSA参数

大质数 p, q 并且p!=q
N=p*q
欧拉函数 φ(n) = r =(p-1)*(q-1) 表示 在小于等于n的正整数之中,有多少个与n构成互质关系

选择一个整数e, e小于r, e与r互质
令e*d= 1%r 也就是  e*d – 1 = k * φ(n)
(N,e)是公钥
(N,d)是私钥
———————
N 称为 public modulus
e 称为 public exponent
d 称为 private exponent
—————
p 称为 secrete prime factor, prime1
q 称为 secrete prime factor, prime2
—–
dmp1 d mod (p-1), exponent1
dmq1 d mod (q-1), exponent2
iqmp q^-1 mod p, coefficient, (inverse of q) mod p

_________________
DER编码

30  TAG->Sequence
81  长模式长度
89  长度
      02  TAG -->Integer
      81
      81 
      00 C8 38 4C C5 17 6B D5 80 97 01 B6 37 59 0A EC 3E 5A A5 7E 81 DE 69 6E 5E 09 D5 39 42 01 07 EA A7 A1 C1 18 40 96 72 89 2C 9F 49 3C EE F8 7E 00 EE 73 45 E5 08 EA 80 EE EB 59 4B 6F 96 3E 8D 27 C7 11 BE 4B B9 EB 38 37 71 CB 80 3A B8 D5 F3 6B A8 A7 09 29 C4 44 D1 78 DA 8A DE 70 28 D4 40 D7 10 A2 AB C6 9D 91 AE E2 1D 1B 89 EA 59 55 96 6F BA 43 79 00 E2 38 BC E0 0D 79 D7 4A C7 79 B8 7D 89 

      02 
      03  短模式长度
      01 00 01

私:

30 
82 
02 5E 
        02  (整数)
        01 
           00   (表示版本0)
       
        02   (整数)
        81 
        81    (n)
            00 E9 EA 93 B3 58 D9 54 2C B4 C7 AC E8 56 EA 39 38 F0 C8 1C 2C D5 C9 E3 C2 B2 74 12 E3 B5 35 FE A2 06 FD 6C 3F 9F B0 D0 6F 16 96 46 3E 30 E9 72 6C 1B E5 4F F7 A4 B8 83 60 40 01 B6 D3 E3 64 F4 94 15 46 AD 1A 84 A3 12 5A 0B 5D B0 A4 51 5D FA 9C 60 BA 40 C5 52 49 E9 33 15 CA 7C FD 86 97 7A 09 C4 7D 1B 24 3A 91 C4 17 B9 15 67 0E 5A 32 68 CD 3F 47 E7 A7 A9 CE F1 6F FB 1D 22 AE B3 6B E2 2B 
       
        02 
        03    (e)
            01 00 01 
       
        02 
        81 
        81     (d)
           00 86 7F C6 0B A2 B3 DB ED 94 C9 17 47 C4 EA 0A 9B 0D FF D2 0B 89 A5 FB 5B 30 E7 03 11 81 59 99 9F 2A AB BE F9 5A 65 FD 83 52 96 77 AF 3C CA 8E 6B 51 22 EA 77 37 74 8C BD E4 2F D8 23 3F A6 05 E6 A2 66 B0 DA 19 07 0E E7 33 2F 43 79 7C 7D 6F 39 01 62 CC D9 6F A6 6D 55 B2 97 9B 0B 9E B1 AF 56 2B 2C B4 05 A4 2F 52 69 D7 E0 8E D2 EB 25 FE F6 71 7D FE CB 05 58 99 9D 69 00 E6 9D A6 77 1F 61 
           
        02 
        41   (p)
           00 F5 9F 70 10 A3 C7 D7 8A BC D8 1E 8F FB 16 D7 33 E5 3E B0 E8 17 5F DD 9F FF CE AC FB 20 9F AF 5E A1 6A 79 8D E7 78 8E CA 31 91 D2 F3 6A B1 0A 46 03 24 11 EE 90 DA 36 89 3E 9E 97 8F F9 A1 7C 3B 
           
        02 
        41    (q)
           00 F3 CC 86 BC 6E DF AC 53 E1 AE 02 08 0D F9 9C D8 93 F7 C2 68 04 AB 40 BB A3 09 0A BE 9B 8B DB 2A 05 D5 98 D0 7E FD DA 7C 6C 4A 25 F0 37 D7 E0 8A 20 38 F2 79 1B C1 EA 34 59 16 E9 34 DA 07 02 D1 
           
        02 
        40   (dmp1)
           42 03 BE 0C DA D8 05 38 46 95 17 71 BF 1C 5E 6E 96 38 89 37 77 C0 CE 42 08 70 B5 D1 30 ED 7A 26 C6 DF 65 18 1C 94 2C 5C 6F 82 2F DE 38 58 A8 D8 34 53 E7 75 E4 FC A1 17 B5 FA CD E5 66 44 5E AD 
        
        02 
        41     (dmq1)
           00 C7 9F AA 9B 54 35 B5 87 21 7D 37 90 9C D0 CC 4A D2 2D C6 73 21 8F 8F FB 93 ED 6D 6C D1 34 5D 0A 35 A8 C5 ED C2 6D DD 9E 8F 94 CF 27 B8 B1 FC DB 5C B3 04 67 82 00 EF E2 59 28 57 5F BD 3E 8C 61 
           
        02 
        41     (iqmp)
           00 C9 19 A5 48 F4 BE AD 9A 8C 66 07 C6 86 B4 7A A2 89 E3 76 FA 16 AB A8 0F 57 2F B3 12 5B E0 7D 48 C7 8E B2 DA 6E 40 3F E9 57 71 5E D6 19 C9 D1 28 29 8F 44 99 58 98 D9 DC 5B 0D 65 0B B5 A4 3E 6C


Cryptodome生成

from Cryptodome.PublicKey import RSA

rsa = RSA.generate(1024)
    
PrivKey = rsa.exportKey('DER')
PubKey =  rsa.publickey().exportKey('DER')

输出的DER公钥,实际为X.509规范

SEQUENCE {
	SEQUENCE {
		OBJECT IDENTIFIER
		rsaEncryption (1 2 840 113549 1 1 1)
		NULL
	}
	BIT STRING, encapsulates {
		SEQUENCE {
			INTEGER
			INTEGER 65537
		}
	}
}

实际

30  (SEQUENCE序列 标签)
81  (长度扩展)
9f   (长度)

    30  (序列 标签)
         0d   (长度) 
                 06 (OBJECT IDENTIFIER标签) 09 (长度) 2a864886f70d010101 ( 表示此密钥用于rsa加密)
                 05  (NULL标签)   00 (长度)  NULL
    
    03 (位串 BIT STRING 标签)
    81   (长度扩展)
    8d   (长度)
   00   (bit string未用到的个数, 或者叫填充bit,因为需要按8bit对齐, 不足8bit的, 需要在末尾补0)

        30 (序列 标签)
        81 (长度扩展) 89
         02 (整数标签) 81 (长度扩展) 81    (长度)00d0d0ceefca36275fd389d1602d0794d5ce3e1f93a731751e8e38698e6679ceba145300b8e2276ccdb029e4c83918dd7e6aa8ef54425a3e8ee24c81d542cc0b8d4052f0d3b274b2c8eb3c917169ba5c18ef07c0aac3ae5bc26c732f6e1f5ad0540085343b0cc363dd4c462523c3bd377169a13d7f8166f17f53a2dbe7d4ef703f
         02 (整数标签)03 (长度)         010001

如果生成PKCS#1的公钥语法 RSA Public Key Syntax

    RSAPublicKey ::= SEQUENCE {
      modulus           INTEGER,  -- n
      publicExponent    INTEGER   -- e 
    }

也就是,只有bit string的内容
———————-

ASN.1编码规则

基本编码规则(BER,Basic Encoding Rules)
规范编码规则(CER,Canonical Encoding Rules)
唯一编码规则(DER,Distinguished Encoding Rules)
压缩编码规则(PER,Packed Encoding Rules)
XML编码规则(XER,XML Encoding Rules)

Basic Encoding Rules (BER)是一种自描述的ASN.1数据结构的二进制编码格式。BER编码可以通过一种或多种方式把任意ASN.1值表示成字节字符串(这就增加了一定的不确定性?)。每一个编码后的BER数据依次由数据类型标识(Type identifier),长度描述(Length description), 实际数据(actual Value)排列而成,即BER是一种二进制TLV编码。TLV编码的一个好处,是数据的解析者不需要读取完整的数据,仅从一个不完整的数据流就可以开始解析。

Distinguished Encoding Rules (DER)是BER的子集,主要是消除了BER的一些不确定性的编码规则。DER 用于需要使用唯一的octet string编码的应用程序,例如根据一个ASN.1编码来计算数字签名。

DER在BER规则基础上增加了如下限制:

如果长度在 0 - 127 之间,必须使用短型长度表示法。
如果长度大于等于 128,必须使用长型长度表示法,并且长度必须使用尽可能少的字节表示。
对于简单 string 类型和在其基础上使用隐式标签生成的类型,必须使用简单定长编码方法。
对于结构化类型和在其基础上使用隐式标签生成的类型及在任何类型基础上使用显式标签生成的类型,必须使用结构化定长编码方法。

如在BER中Boolean类型true的value字节,可以为任何小于255大于0的整数,而在DER中,value字节只能为255。DER的这种确定性,保证了一个ASN.1数据结构,在编码为DER后,只会有一种正确的结果。这使得DER更适合用在数字签名领域,比如X.509中广泛使用了DER。

————
PKCS#1 私钥定义

    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
    }

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注