しばらくの間とGMSSL接触、少し要約のアイデア
証明書:DER形式、PEMフォーマット
.DER = DER DERでエンコードされた証明書のバイナリ展開。
.PEM = PEMのX.509v3文書のさまざまな種類の拡張子は、ある " - BEGIN ..." プレフィックスASCII(Base64で)データ。
DER形式はバイナリで、PEMは、テキスト形式で、
実際には、PEM形式のコンテンツがコンテンツを削除する「--- BEGIN」BASE64デコードを取り、BLOGコンテンツを取得し、それは、DER形式の内容です
DERコンテンツは、実際GMSSL、メモリ内のOpenSSLはBLOBにASN.1形式でエンコードされ
ビューGMSSLコードは、公開鍵、各ASN形式のサポートコードの秘密鍵を見ることができます
次のようにRSA公開鍵、秘密鍵のサポートコードは次のようになります。
ASN1_SEQUENCE_cb(RSAPrivateKey、rsa_cb)= { ASN1_SIMPLE(RSA、バージョン、LONG)、 ASN1_SIMPLE(RSA、N、BIGNUM)、 ASN1_SIMPLE(RSA、E、BIGNUM)、 ASN1_SIMPLE(RSA、D、CBIGNUM)、 ASN1_SIMPLE(RSA、P、 CBIGNUM)、 ASN1_SIMPLE(RSA、Q、CBIGNUM)、 ASN1_SIMPLE(RSA、DMP1、CBIGNUM)、 ASN1_SIMPLE(RSA、dmq1、CBIGNUM)、 ASN1_SIMPLE(RSA、iqmp、CBIGNUM) } ASN1_SEQUENCE_END_cb(RSA、RSAPrivateKey) ASN1_SEQUENCE_cb(のRSAPublicKey、rsa_cb ) = { ASN1_SIMPLE(RSA、N、BIGNUM)、 ASN1_SIMPLE(RSA、E、BIGNUM) } ASN1_SEQUENCE_END_cb(RSA、のRSAPublicKey)
フォーマット時BIGNUMため、第1の出力は、バイト長(1バイト)になり、順次コンテンツを出力します
次のようにSM2は、サポートコードをフォーマットのみ暗号文ASN.1を定義します。
ASN1_SEQUENCE(SM2CiphertextValue)= {
ASN1_SIMPLE(SM2CiphertextValue、X座標、BIGNUM)、
ASN1_SIMPLE(SM2CiphertextValue、Y座標、BIGNUM)、
ASN1_SIMPLE(SM2CiphertextValue、ハッシュ、ASN1_OCTET_STRING)、
ASN1_SIMPLE(SM2CiphertextValue、暗号文、ASN1_OCTET_STRING)
} ASN1_SEQUENCE_END(SM2CiphertextValue)
実際の内容は、ここで定義された暗号文の3つはC1 / C2 / C3、C1 =(x + y)は、暗号文部分のC2は、C3は、ハッシュ部であります
します。https://etherhack.co.uk/asymmetric/docs/rsa_key_breakdown.html実際のBLOB ASN.1エンコードのメモリとしては、それは、RSA公開鍵と秘密鍵ファイル解析、リンクから見ることができます
以下を参照してください。
OpenSSLの1024ビットのRSA秘密鍵の内訳
Linuxでは、以下のコマンドを使用すると、このキーを生成:
opensslのgenrsa -out rsa_1024_priv.pem 1024
以下の追加のコマンドを実行し、キーは、それぞれの構成要素に分解される方法を理解するために:
opensslのRSA -text -in rsa_1024_priv.pem
あるいは、手で個々のコンポーネントを私がやったことを行うと、故障することができます-データ構造は、実際にどのように機能するかを学ぶために。
まず、データブロックは、それが標準のBase64形式だからデコードするので、ファイルの先頭と末尾に「----- BEGIN ...」行を削除し、進数にデータを変換する必要があります。
データブロックは、私たちが読むことができるフォーマット(の一種)になりました。
抽象構文記法1(ASN.1または)を使用して、我々は、読み取り、このデータ内に含まれる識別符号化規則(DER)符号化された成分を識別することができます。
ASN形式のこのインスタンスに格納されたデータのみがタイプ整数であるが、他の標準的な変数型は、明確にするためにここに記載されています。整数型は、この文脈で使用される場合、以下に見られるように、次のデータオブジェクトのバイト単位の長さ、続いて、データそのものです。
- 0x02の==整数
- 0x03の==ビット列
- 0x04の==オクテットSTRING
- 0x05の== NULL
- 0x06の==オブジェクト識別子
- 0x10の==「シーケンス」と「の順序」
- 0x11を==「セット」と「の設定」
- 0x13に==印刷可能な文字列
- 0x14の== T61文字列
- 0x16 == IA5文字列
- 0x17の== UTC時間
- 0x30の82 == ASN1シーケンス
Base64形式で1024ビットのRSA秘密鍵
----- BEGIN RSA PRIVATE KEY ----- MIICXgIBAAKBgQDHikastc8 + I81zCg / qWW8dMr8mqvXQ3qbPAmu0RjxoZVI47tvs kYlFAXOf0sPrhO2nUuooJngnHV0639iTTEYG1vckNaW2R6U5QTdQ5Rq5u + uV3pMk 7w7Vs4n3urQ6jnqt2rTXbC1DNa / PFeAZatbf7ffBBy0IGO0zc128IshYcwIDAQAB AoGBALTNl2JxTvq4SDW / 3VH0fZkQXWH1MM10oeMbB2qO5beWb11FGaOO77nGKfWc bYgfp5Ogrql4yhBvLAXnxH8bcqqwORtFhlyV68U1y4R + 8WxDNh0aevxH8hRS / 1×5 031DJm1JlU0E + vStiktN0tC3ebH5hE + 1OxbIHSZ + WOWLYX7JAkEA5uigRgKp8ScG auUijvdOLZIhHWq7y5Wz + nOHUuDw8P7wOTKU34QJAoWEe771p9Pf / GTA / kr0BQnP QvWUDxGzJwJBAN05C6krwPeryFKrKtjOGJIniIoY72wRnoNcdEEs3HDRhf48YWFo riRbZylzzzNFy / gmzT6XJQTfktGqq + FZD9UCQGIJaGrxHJgfmpDuAhMzGsUsYtTr iRox0D1Iqa7dhE693t5aBG010OF6MLqdZA1CXrn5SRtuVVaCSLZEL / 2J5UcCQQDA d3MXucNnN4NPuS / L9HMYJWD7lPoosaORcgyK77bSSNgk + u9WSjbH1uYIAIPSffUZ BTI jc1dUg5wb aeZlgJAkEAurrpmpqj5vg087ZngKfFGR5rozDiTsK5DceTV97K A3Y NZL XWTxDBWk4YPh2ZlKv402hZEfWBYxUDn5ZkH / BW == ----- END RSA秘密鍵-----
16進形式で秘密鍵
この例では、16進数の値は、明確にするためにペアリングされているが、他の実施例(このページの上部にあるリンクを参照)の値が分離されていません。
部品は順番に、以下の強調表示しました:
- ASN.1ヘッダー
- アルゴリズムバージョン
- モジュラス
- 公開指数
- プライベート指数
- prime1
- prime2
- 指数1
- 指数2
- 係数
----- RSA秘密鍵をBEGIN -----
30 82 02 5E 02 01 00 02 81 81 00 C7 8A 46 AC B5 CF 3E 23 CD 73 0A
0F EA 59 6F 1D 32 BF 26 AA F5 D0デA6 CF 02 6B B4 46 3C 68 65 52
38、EC 91 89 45 01 73 9F D2 C3をEB 84のED A7 DB EE 52 EA 28 26 78 27
1D 5D 3aはDFのD8 93 4C 46 06 D6 F7 24 35 A5 B6 47 A5 39 41 37 50 E5の
1aはB9 BB EB 95 93 24 EF 0EのD5 B3を89 F7のBA B4 3aは8E 7aの広告ダB4デ
D7 6C 2D 43 35のAF CF 15 E0 19 6A D6のDF編のF7 C1を07 2D 08 18版33
73 5D BC 22 C8 58 73 02 03 01 00 01 02 81 81 00 B4 CD 97 62 71 4E
FA B8 48 35 BF DD 51 F4 7D 99 10 5D 61 F5 30 CD 74 A1 E3 1B 07 6A
8E E5 B7 96 6F 5D 45 19 A3 8E EF B9のC6 29 F5 9C 6dは88 1F A7 93 A0
AE A9 78、CA 10 6F 2C 05 E7のC4 7F 1B 72のAA B0 39 1B 45 86 5C 95 EB
C5 35、CB 84 7E F1 6C 43 36 1D 1A 7aのFC 47 F2 14 52 FF 55 F9 D3 7D
43 26 6D 49 95 4D 04 FA F4広告8A 4Bの4D D2 D0 B7 79 B1 F9 84 4F B5
3B 16 C8 1D 26 7E 58 E5 8B 61 7E C9 02 41 00 E6、E8 A0 46 02 A9 F1
27 06 6aはE5 22 8E F7 4E 2D 92 21 1D図6(a)のBB CBは95 B3 FA 73 87 52 E0
、F0 F0フェF0 39 32 94 DF 84 09 02 85 84 7bが64 C0 F5 A7のD3のDFのFCこと
FE 4A F4 05 09 CF 42 F5 94 0F 11 B3 27 02 41 00 DD 39 0B A9 2B C0
F7 AB C8 52 AB 2aはD8のCE 18 92 27 88 8(a)18 EF 6C 11 9E 83 5C 74 41
2C DC 70 D1 85 FE 3C 61 61 68 AE 24 5B 67 29 73 CF 33 45 CB F8 26
のCD 3E 97 25 04 DF 92 D1 AA AB e1を59 0F D5 02 40 62 09 68 6aはF1 1cと
98 1F 9A 90 EE EE 02 13 33 1A C5 2C 62 D4 EB 89 1A 31 D0 3D 48 A9 .ae
Ddの84 4E Bdのデデ5A 04 6D 35 D0 E1 7aを30によるBA 9D 64 - 0D 42 5E B9のF9
49 1B 6E 55 56 82 48 B6 44 2F FD 89 E5 47 02 41 00 C0 77 73 17 B9の
C3 67 37 83 4F B9 2F CbのF4 73 18 25 60 94 FA 28 b1がFBである3A 、 91 72 0C
8A EFのB6 D2を 、 48 D8 24 FA EF 56 4A 36 C7 - E6 08 00 83 D2、D6 、 19 7D F5
6E D8は、図8dことCD 5D 52 0E 70 6F E6 9E 66 58 09 02 41 00によって、BAによりBAのE9 9aは
9A 3aと 、 E6のF8 、 34 F3のB6 67 80 A7 C5 19 1E 6B 3A 、 30 E2 4E B9 0D C7 、 C2 、
93 57 76デ賞6B 3E 37 39 7E 5D 64 - 0C 15のF1フォーラム83 E1 99 E1 D9 4aはA4
のBF 8D 36 85 91 58 16 31 1F 50 39 66 41 FF F9 6F
----- END RSA PRIVATE KEY -----
外観の順に抽出されたキーコンポーネント、
Private-Key:
header:
30 82 02 5e (0x3082 == ASN.1 Sequence)
separator:
02 01 (0x02 == Integer and 0x01 == 1 byte long)
algorithm version:
00 (0x00 == version zero)
separator:
02 81 81 (0x02 == Integer and 0x81 == 129 bytes long)
modulus: (129 bytes - starts with a null (0x00), remove this.)
00 c7 8a 46 ac b5 cf 3e 23 cd 73 0a 0f ea 59
6f 1d 32 bf 26 aa f5 d0 de a6 cf 02 6b b4 46
3c 68 65 52 38 ee db ec 91 89 45 01 73 9f d2
c3 eb 84 ed a7 52 ea 28 26 78 27 1d 5d 3a df
d8 93 4c 46 06 d6 f7 24 35 a5 b6 47 a5 39 41
37 50 e5 1a b9 bb eb 95 de 93 24 ef 0e d5 b3
89 f7 ba b4 3a 8e 7a ad da b4 d7 6c 2d 43 35
af cf 15 e0 19 6a d6 df ed f7 c1 07 2d 08 18
ed 33 73 5d bc 22 c8 58 73
separator:
02 03 (0x02 == Integer and 0x03 == 3 bytes long)
public exponent: (3 bytes)
01 00 01 (Integer value 65537, Fermat Number F4)
separator:
02 81 81 (0x02 == Integer and 0x81 == 129 bytes long)
private exponent: (129 bytes - starts with a null, remove this)
00 b4 cd 97 62 71 4e fa b8 48 35 bf dd 51 f4
7d 99 10 5d 61 f5 30 cd 74 a1 e3 1b 07 6a 8e
e5 b7 96 6f 5d 45 19 a3 8e ef b9 c6 29 f5 9c
6d 88 1f a7 93 a0 ae a9 78 ca 10 6f 2c 05 e7
c4 7f 1b 72 aa b0 39 1b 45 86 5c 95 eb c5 35
cb 84 7e f1 6c 43 36 1d 1a 7a fc 47 f2 14 52
ff 55 f9 d3 7d 43 26 6d 49 95 4d 04 fa f4 ad
8a 4b 4d d2 d0 b7 79 b1 f9 84 4f b5 3b 16 c8
1d 26 7e 58 e5 8b 61 7e c9
separator:
02 41 (0x02 == Integer and 0x41 == 65 bytes long)
prime1: (65 bytes - starts with a null, remove this)
00 e6 e8 a0 46 02 a9 f1 27 06 6a e5 22 8e f7
4e 2d 92 21 1d 6a bb cb 95 b3 fa 73 87 52 e0
f0 f0 fe f0 39 32 94 df 84 09 02 85 84 7b be
f5 a7 d3 df fc 64 c0 fe 4a f4 05 09 cf 42 f5
94 0f 11 b3 27
separator:
02 41 (0x02 == Integer and 0x41 == 65 bytes long)
prime2: (65 bytes - starts with a null, remove this)
00 dd 39 0b a9 2b c0 f7 ab c8 52 ab 2a d8 ce
18 92 27 88 8a 18 ef 6c 11 9e 83 5c 74 41 2c
dc 70 d1 85 fe 3c 61 61 68 ae 24 5b 67 29 73
cf 33 45 cb f8 26 cd 3e 97 25 04 df 92 d1 aa
ab e1 59 0f d5
separator:
02 40 (0x02 == Integer and 0x40 == 64 bytes long)
exponent1: (64 bytes)
62 09 68 6a f1 1c 98 1f 9a 90 ee 02 13 33 1a
c5 2c 62 d4 eb 89 1a 31 d0 3d 48 a9 ae dd 84
4e bd de de 5a 04 6d 35 d0 e1 7a 30 ba 9d 64
0d 42 5e b9 f9 49 1b 6e 55 56 82 48 b6 44 2f
fd 89 e5 47
separator:
02 41 (0x02 == Integer and 0x41 == 65 bytes long)
exponent2: (65 bytes - starts with a null, remove this)
00 c0 77 73 17 b9 c3 67 37 83 4f b9 2f cb f4
73 18 25 60 fb 94 fa 28 b1 a3 91 72 0c 8a ef
b6 d2 48 d8 24 fa ef 56 4a 36 c7 d6 e6 08 00
83 d2 7d f5 19 6e d8 be 8d cd 5d 52 0e 70 6f
e6 9e 66 58 09
separator:
02 41 (0x02 == Integer and 0x41 == 65 bytes long)
coefficient: (65 bytes - always starts with a null)
00 ba ba e9 9a 9a a3 e6 f8 34 f3 b6 67 80 a7
c5 19 1e 6b a3 30 e2 4e c2 b9 0d c7 93 57 de
ca 6b 76 3e 37 39 7e 5d 64 f1 0c 15 a4 e1 83
e1 d9 99 4a bf 8d 36 85 91 1f 58 16 31 50 39
f9 66 41 ff 6f
SSL 1024 bit RSA Public Key Breakdown
Using Linux, the following command generated this public key:
openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHikastc8+I81zCg/qWW8dMr8m qvXQ3qbPAmu0RjxoZVI47tvskYlFAXOf0sPrhO2nUuooJngnHV0639iTTEYG1vck NaW2R6U5QTdQ5Rq5u+uV3pMk7w7Vs4n3urQ6jnqt2rTXbC1DNa/PFeAZatbf7ffB By0IGO0zc128IshYcwIDAQAB -----END PUBLIC KEY-----
Public Key in Hexadecimal Format
Parts in bold, in order:
- Modulus
- Public Exponent
-----BEGIN PUBLIC KEY-----
30 81 9f 30 0d 06 09 2a 86 48 86 f7 0d 01 01 01 05 00 03 81 8d 00
30 81 89 02 81 81 00 c7 8a 46 ac b5 cf 3e 23 cd 73 0a 0f ea 59 6f
1d 32 bf 26 aa f5 d0 de a6 cf 02 6b b4 46 3c 68 65 52 38 ee db ec
91 89 45 01 73 9f d2 c3 eb 84 ed a7 52 ea 28 26 78 27 1d 5d 3a df
d8 93 4c 46 06 d6 f7 24 35 a5 b6 47 a5 39 41 37 50 e5 1a b9 bb eb
95 de 93 24 ef 0e d5 b3 89 f7 ba b4 3a 8e 7a ad da b4 d7 6c 2d 43
35 af cf 15 e0 19 6a d6 df ed f7 c1 07 2d 08 18 ed 33 73 5d bc 22
c8 58 73 02 03 01 00 01
-----END PUBLIC KEY-----
Extracted Public Key Components
header:
30 81 9f 30 0d 06 09 2a 86 48 86 f7 0d 01 01
01 05 00 03 81 8d 00 30 81 89
separator:
02 81 81
modulus:
00 c7 8a 46 ac b5 cf 3e 23 cd 73 0a 0f ea 59
6f 1d 32 bf 26 aa f5 d0 de a6 cf 02 6b b4 46
3c 68 65 52 38 ee db ec 91 89 45 01 73 9f d2
c3 eb 84 ed a7 52 ea 28 26 78 27 1d 5d 3a df
d8 93 4c 46 06 d6 f7 24 35 a5 b6 47 a5 39 41
37 50 e5 1a b9 bb eb 95 de 93 24 ef 0e d5 b3
89 f7 ba b4 3a 8e 7a ad da b4 d7 6c 2d 43 35
af cf 15 e0 19 6a d6 df ed f7 c1 07 2d 08 18
ed 33 73 5d bc 22 c8 58 73
separator:
02 03
public exponent:
01 00 01
[W3C Valid CSS 2]
[W3C Valid XHTML 1.1]
另外,参考学习此链接:https://tls.mbed.org/kb/cryptography/asn1-key-structures-in-der-and-pem
快速翻译版本如下:
DER和PEM中的ASN.1关键结构
介绍
每个人都喜欢PEM和用于以便携式格式保存加密密钥和证书的ASN.1结构。好吧..如果他们真的被记录下来,每个人都会这样做。但是,找到每个DER或PEM格式文件中的结构是一个很大的壮举。
由于我们需要这些信息,我们也会在这里分享,以帮助他人寻求知识和理解;)
ASN.1和DER编码
在RSA,PKCS#1和SSL / TLS社区内,ASN.1的可分辨编码规则(DER)编码用于以便携式格式表示密钥,证书等。尽管ASN.1不是最容易理解的表示格式并且带来了很多复杂性,但它确实有其优点。证书或密钥信息存储在ASN.1的二进制DER中,提供RSA,SSL和TLS的应用程序应处理DER编码以读取信息。
PEM文件
由于DER编码导致编码数据的真正二进制表示,因此设计了一种格式,以便能够以可打印字符的编码方式发送这些格式,以便您可以实际邮寄这些内容。我现在关注的格式是PEM格式。
我们将看到的大多数PEM格式的文件是由OpenSSL在生成或导出RSA私钥或公钥和X509证书时生成的。
本质上,PEM文件只是DER编码数据的base64编码版本。为了区分外部DER编码字符串中的数据类型,数据周围存在页眉和页脚。PEM编码文件的示例是:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMYfnvWtC8Id5bPKae5yXSxQTt
+Zpul6AnnZWfI2TtIarvjHBFUtXRo96y7hoL4VWOPKGCsRqMFDkrbeUjRrx8iL91
4/srnyf6sh9c8Zk04xEOpK1ypvBz+Ks4uZObtjnnitf0NBGdjMKxveTq+VE7BWUI
yQjtQ8mbDOsiLLvh7wIDAQAB
-----END PUBLIC KEY-----
第一行和最后一行表示内部应该预期的DER格式。里面的数据是DER编码信息的base64编码版本。
格式
所以这一切都很好。但是在每个不同的文件中你应该期待什么结构?请看下面的不同格式的解释。
RSA公钥文件(PKCS#1)
RSA公钥PEM文件特定于RSA密钥。
它以标签开头和结尾:
-----BEGIN RSA PUBLIC KEY-----
BASE64 ENCODED DATA
-----END RSA PUBLIC KEY-----
在base64编码数据中,存在以下DER结构:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
公钥文件(PKCS#8)
由于RSA不是专门用于X509和SSL / TLS,因此PKCS#8形式提供了更通用的密钥格式,它标识了公钥的类型并包含相关数据。
它以标签开头和结尾:
-----BEGIN PUBLIC KEY-----
BASE64 ENCODED DATA
-----END PUBLIC KEY-----
在base64编码数据中,存在以下DER结构:
PublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
PublicKey BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
因此,对于RSA公钥,OID是1.2.840.113549.1.1.1,并且有一个RSAPublicKey作为PublicKey密钥数据bitstring。
RSA私钥文件(PKCS#1)
RSA私钥PEM文件特定于RSA密钥。
它以标签开头和结尾:
-----BEGIN RSA PRIVATE KEY-----
BASE64 ENCODED DATA
-----END RSA PRIVATE KEY-----
在base64编码数据中,存在以下DER结构:
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
}
私钥文件(PKCS#8)
由于RSA不是专门用于X509和SSL / TLS,因此PKCS#8形式的更通用密钥格式可用于标识私钥的类型并包含相关数据。
未加密的PKCS#8编码数据以标签开头和结尾:
-----BEGIN PRIVATE KEY-----
BASE64 ENCODED DATA
-----END PRIVATE KEY-----
在base64编码数据中,存在以下DER结构:
PrivateKeyInfo ::= SEQUENCE {
version Version,
algorithm AlgorithmIdentifier,
PrivateKey OCTET STRING
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
因此对于RSA私钥,OID是1.2.840.113549.1.1.1并且存在RSAPrivateKey作为PrivateKey密钥数据八位字节串。
加密的PKCS#8编码数据以标签开头和结尾:
-----BEGIN ENCRYPTED PRIVATE KEY-----
BASE64 ENCODED DATA
-----END ENCRYPTED PRIVATE KEY-----
在base64编码数据中,存在以下DER结构:
EncryptedPrivateKeyInfo ::= SEQUENCE {
encryptionAlgorithm EncryptionAlgorithmIdentifier,
encryptedData EncryptedData
}
EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
EncryptedData ::= OCTET STRING
EncryptedData OCTET STRING是PKCS#8 PrivateKeyInfo(见上文)。
这有帮助吗?