RSA密钥格式详解与模数指数解析

RSA密钥格式详解与模数指数解析

在加密的世界里,密钥的生成与格式是至关重要的。要创建一个RSA私钥,你可以使用以下命令:

openssl genrsa -out private.pem 2048

这条命令会生成一个2048位的RSA私钥,默认格式为PKCS#8。你可以通过查看文件内容来验证:

cat private.pem

你会看到:

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqh...
...
-----END PRIVATE KEY-----

如果是PKCS#1格式,头部则会是:

-----BEGIN RSA PRIVATE KEY-----
MIIBIjANBgkqhkiG9w0...
...
-----END RSA PRIVATE KEY-----

格式转换的微妙之处

密钥格式可以在PKCS#1和PKCS#8之间进行转换。PKCS#1格式专用于RSA密钥,而PKCS#8是一个通用的私钥格式,能够包含任何类型的私钥。转换命令如下:

  openssl pkcs8 -topk8 -inform PEM -in private_pkcs1.pem -outform PEM -nocrypt -out private_pkcs8.pem

OpenSSL版本的影响

不同版本的OpenSSL在从PKCS#1转换到PKCS#8时,结果可能会有所不同。例如:

  • OpenSSL 1.1.1a 20 Nov 2018

    -----BEGIN RSA PRIVATE KEY-----
    pkcs1私钥内容
    -----END RSA PRIVATE KEY-----
    

    在这个版本中,转换前后的PKCS#1私钥与其来源的PKCS#8私钥在格式和内容上都有所不同。

  • OpenSSL 3.0.14 4 Jun 2024

    -----BEGIN PRIVATE KEY-----
    pkcs1私钥内容(和pkcs8私钥内容一模一样)
    -----END PRIVATE KEY-----
    

    在这个版本中,转换后的PKCS#1私钥与其来源的PKCS#8私钥在格式和内容上完全一致。这表明该版本的OpenSSL生成的私钥遵循PKCS#8格式标准。

  • 影响只针对私钥,公钥的转换结果具有明显差异的

    PKCS#1公钥

      openssl rsa -in private.pem -RSAPublicKey_out -out pkcs1_public.pem
    
    -----BEGIN RSA PUBLIC KEY-----
    MIIBCgKCAQEAjYX5jxB80S...
    ...
    -----END RSA PUBLIC KEY-----
    

    PKCS#8公钥

      openssl rsa -in private.pem -pubout -out pkcs8_public.pem
    
    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEF...
    ...
    -----END PUBLIC KEY-----
    

ASN.1详解

ASN.1(Abstract Syntax Notation One)是一种用于描述数据结构的标准语言,广泛应用于加密领域。它不仅仅是描述,还包括编码规则和传输语法。
RSA密钥使用的ASN.1结构

基本类型的多样性

  1. 简单类型

    • INTEGER: 整数
    • BOOLEAN: 布尔值
    • OCTET STRING: 字节串
    • PrintableString: 可打印字符串
    • UTCTime: UTC时间
  2. 结构类型

    • SEQUENCE: 有序集合
    • SET: 无序集合
    • CHOICE: 选择
  3. 标签类型

    • [0] IMPLICIT: 隐式标签
    • [1] EXPLICIT: 显式标签

编码规则的复杂性

ASN.1有多种编码规则:

  1. BER (Basic Encoding Rules)

    • 最基本的编码规则,结果不唯一。
  2. DER (Distinguished Encoding Rules)

    • BER的子集,结果唯一,常用于密码学。
  3. PER (Packed Encoding Rules)

    • 更紧凑的编码,用于通信协议。

TLV结构的精妙

TLV(Tag, Length, Value)结构是ASN.1编码的核心。

DER编码采用TLV(Type-Length-Value)结构:

  • Type(标签): 表示数据类型
  • Length(长度): 表示数据长度
  • Value(值): 表示数据内容

实际应用的多样性

  1. 密钥转换

    PKCS#1公钥转换为DER编码

      openssl rsa -pubin -in public_pkcs1.pem -outform DER -out public_pkcs1.der
    

    使用DER编码的PKCS#1公钥解析

      openssl rsa -pubin -in public_pkcs1.der -inform DER -text -noout
    
  2. RSA公钥结构

    RSA 公钥使用 ASN.1 类型 RSAPublicKey 表示:

    RSAPublicKey ::= SEQUENCE {
        modulus           INTEGER,  -- n
        publicExponent    INTEGER   -- e
    }
    
    • RSA公钥的DER编码

      30 82 01 22    # SEQUENCE, 长度 290 字节
          30 0D      # SEQUENCE, 长度 13 字节 (算法标识)
              06 09  # OBJECT IDENTIFIER, 长度 9 字节
                  2A 86 48 86 F7 0D 01 01 01  # rsaEncryption (1.2.840.113549.1.1.1)
              05 00  # NULL
      
          03 82 01 0F    # BIT STRING, 长度 271 字节
              00         # 填充位数 (0)
              30 82 01 0A    # SEQUENCE, 长度 266 字节 (RSAPublicKey)
                  02 82 01 01    # INTEGER, 长度 257 字节
                      00 8F 45 C7 83 D6 9C 18...  # 模数 (n)
                  
                  02 03          # INTEGER, 长度 3 字节
                      01 00 01   # 公钥指数 (e) = 65537
      
    • 公钥解析

      openssl rsa -pubin -in public_pkcs1.der -inform DER -text -noout
      
      Public-Key: (2048 bit)
      Modulus:
          00:8f:45:c7:83:d6:9c:18:84:19:b7:ec:f4:fb:87:
          7e:be:af:94:fb:f1:be:94:60:2c:13:e5:f7:09:d7:
          6e:1c:81:ce:38:15:16:f3:01:e9:32:db:d0:c1:ef:
          70:24:eb:4c:43:28:93:1e:79:9a:a2:f5:18:d6:ea:
          3a:18:00:d2:7d:ed:bd:c8:5f:da:fe:1d:53:67:5a:
          42:71:95:65:2b:bb:d7:04:4d:2a:54:71:63:ec:c9:
          f5:01:f4:f0:9a:74:89:66:e9:0b:21:b5:13:f6:38:
          5c:ad:fd:60:ff:ee:fe:68:62:55:dc:94:59:54:05:
          ab:f1:91:2c:32:5f:76:1c:06:93:c3:48:0e:a2:88:
          e8:61:24:ed:7d:64:7a:f2:39:36:ac:9c:3f:82:3e:
          5e:65:d0:50:3f:76:00:19:dd:d2:30:31:fc:dd:8a:
          50:67:e4:75:27:1c:e2:91:30:f9:9f:d8:e9:4d:f7:
          cd:37:e2:c5:b5:5d:ae:65:47:b4:25:13:f9:8d:d5:
          02:60:0d:47:b0:e0:9b:37:6a:b5:55:4b:a1:52:24:
          77:c9:45:54:23:51:c3:f7:1c:b9:a6:83:d4:e2:44:
          70:04:87:19:dc:32:25:44:fe:5a:3c:7d:44:70:68:
          08:59:a9:85:f1:1f:73:36:4f:1d:de:5b:f5:bb:70:
          64:c1
      Exponent: 65537 (0x10001)
      
  3. PKCS#1 RSA私钥结构

    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
    }
    
    • 密钥转换

      openssl rsa -in private.pem -outform DER -out private_pkcs1.der
      
    • RSA私钥的DER编码

      30 82 04 BD    # SEQUENCE, 长度 1213 字节
          02 01      # INTEGER, 长度 1 字节
              00     # 版本号 = 0
          
          30 0D      # SEQUENCE, 长度 13 字节
              06 09  # OBJECT IDENTIFIER, 长度 9 字节
                  2A 86 48 86 F7 0D 01 01 01  # RSA算法标识符 (1.2.840.113549.1.1.1)
              05 00  # NULL
              
          04 82 04 A7    # OCTET STRING, 长度 1191 字节
              30 82 04 A3    # SEQUENCE, 长度 1187 字节 (RSAPrivateKey)
                  02 01      # INTEGER, 长度 1 字节
                      00    # 版本号 = 0
                      
                  02 82 01 01    # INTEGER, 长度 257 字节
                      00 8F 45...# 模数 (n)
                      
                  02 03          # INTEGER, 长度 3 字节
                      01 00 01   # 公钥指数 (e) = 65537
                      
                  02 82 01 00    # INTEGER, 长度 256 字节
                      42 9D...   # 私钥指数 (d)
                      
                  02 81 81       # INTEGER, 长度 129 字节
                      00 C1 71...# 第一个质数 (p)
                      
                  02 81 81       # INTEGER, 长度 129 字节
                      00 BD B2...# 第二个质数 (q)
                      
                  02 81 80       # INTEGER, 长度 128 字节
                      53 A7...   # 第一个CRT指数 (d mod (p-1))
                      
                  02 81 80       # INTEGER, 长度 128 字节
                      92 00...   # 第二个CRT指数 (d mod (q-1))
                      
                  02 81 81       # INTEGER, 长度 129 字节
                      00 AD 88...# CRT系数 (q^-1 mod p)
      
    • 密钥解析

      openssl rsa -in private_pkcs1.der -inform DER -text -noout
      
      Private-Key: (2048 bit, 2 primes)
      modulus:
          00:8f:45:c7:83:d6:9c:18:84:19:b7:ec:f4:fb:87:
          7e:be:af:94:fb:f1:be:94:60:2c:13:e5:f7:09:d7:
          6e:1c:81:ce:38:15:16:f3:01:e9:32:db:d0:c1:ef:
          70:24:eb:4c:43:28:93:1e:79:9a:a2:f5:18:d6:ea:
          3a:18:00:d2:7d:ed:bd:c8:5f:da:fe:1d:53:67:5a:
          42:71:95:65:2b:bb:d7:04:4d:2a:54:71:63:ec:c9:
          f5:01:f4:f0:9a:74:89:66:e9:0b:21:b5:13:f6:38:
          5c:ad:fd:60:ff:ee:fe:68:62:55:dc:94:59:54:05:
          ab:f1:91:2c:32:5f:76:1c:06:93:c3:48:0e:a2:88:
          e8:61:24:ed:7d:64:7a:f2:39:36:ac:9c:3f:82:3e:
          5e:65:d0:50:3f:76:00:19:dd:d2:30:31:fc:dd:8a:
          50:67:e4:75:27:1c:e2:91:30:f9:9f:d8:e9:4d:f7:
          cd:37:e2:c5:b5:5d:ae:65:47:b4:25:13:f9:8d:d5:
          02:60:0d:47:b0:e0:9b:37:6a:b5:55:4b:a1:52:24:
          77:c9:45:54:23:51:c3:f7:1c:b9:a6:83:d4:e2:44:
          70:04:87:19:dc:32:25:44:fe:5a:3c:7d:44:70:68:
          08:59:a9:85:f1:1f:73:36:4f:1d:de:5b:f5:bb:70:
          64:c1
      publicExponent: 65537 (0x10001)
      privateExponent:
          15:9d:42:57:3a:66:3c:30:99:ac:ac:bb:dc:c2:79:
          35:8d:49:9d:a4:bf:ca:a4:a3:a1:b0:dc:cf:08:48:
          1d:56:db:e4:8c:11:f5:41:41:8c:21:ab:61:c6:9c:
          95:85:45:f1:0f:ca:fa:1b:00:60:3b:37:af:1c:90:
          fd:14:0a:ad:62:d3:71:ca:3c:40:7f:ee:18:36:7e:
          b5:a2:03:2c:50:df:44:4f:db:e5:f7:61:4a:d4:c0:
          f8:b5:9a:22:c3:18:03:85:7e:df:6b:f1:02:01:48:
          c2:1a:ea:aa:51:c4:e1:bc:8c:15:85:ef:e0:04:27:
          07:7f:8e:3a:5f:3a:73:49:b4:f1:7e:af:f1:90:a7:
          4d:f3:cf:48:e5:f5:be:6b:7c:47:46:88:59:28:8d:
          99:25:0b:69:65:aa:44:21:90:49:d6:b1:5d:15:1e:
          17:af:cb:ec:54:85:88:be:c2:cc:b8:08:f7:d0:38:
          b4:3d:06:f3:f8:00:e8:79:32:9e:9d:45:c6:2e:08:
          8c:76:64:60:c2:59:76:fd:5e:4c:aa:b6:77:2f:58:
          87:76:72:83:c3:25:36:2a:02:d0:8e:98:50:c8:33:
          25:8e:65:be:9c:da:5d:93:eb:e7:43:66:89:e8:85:
          77:03:6d:be:0f:05:45:c4:92:41:62:b4:65:27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值