X.509証明書公開鍵符号化の原則

2627 ワード

RSA* d2i_RSAPublicKey(NULL,const unsigned**pp,int len)では*ppは公開鍵を記憶するメモリセルを指し、lenは公開鍵の長さを指すが、ここでの公開鍵はASNを通過することを意味する.1符号化された公開鍵は、この符号化方法については、全面的に述べるにはかなり複雑であるが、rsa公開鍵の符号化に限定すると、1024ビットrsa公開鍵のASNである.1符号化の16進法の説明140 bytes:30 81 89 02 81 00 e 3 8 8 d 99 06 9 fbd 9 a 9 a c 0 e 5 6 a 5 a 5 d 03 b 3 cf 09 ca 8 e c 1 4 a 6 cf 9 90 c 2 46 e 0 89 44 69 cd a 5 62 91 a 8 a 5 f e 5 8 fd 3 fb 93 3 fbc d 7 6 e 5 e f 2 80 41 a 6 79 78 8 e 4 d 4 d 4 d 65 ad 4 36 9 c c 5 83 c c 5 83 9 d f f f f f f 4 c 6 c 6 c 95 37 b 7 7 c 37 b 7 7 7 c 37 b 7 7 b 7 c 7 c 7 c 7 7 c 7 c 7 c 3 9 9 9 9 9 9 9 9 9 b 7 c 9 9 b 7 c 9 c 9 9 b 7 c 9 9 b 7 c 7 c 9 9 9 2 e 1 db 99 54 29 5 f 9 b a 5 57 f 5 40 7 a 54 82 9 c 84 d 4 35 86 14 38 69 14 60 f 3 c 6 c 7 11 75 f 2 43 c 34 ed 89 4a ae e1 9d 57 3e a1 02 03 01 00 01
  ASN.1はTag,Lenth,Value,符号化方式を採用し,ここで全体を1つのsequenceとして編成し,構造体として理解し,30をスタートフラグとし,2番目の81は後ろに1バイトの代表長さ,すなわち89は長さを表し(82であれば後ろに2バイトの代表長さを表し,順次類推する),10進数137に変換し,ちょうど後ろのバイト数と一致し,4番目の02からこのsequenceの内包である.構造体に相当する要素は、一般的にsequenceがネストされる必要があり、構造体埋め込み構造体に相当するが、公開鍵のsequenceにとって、ここでは1層しかない.
4番目のビット02が表す内容はbitストリームであり、同様に続く81は1バイトの代表長さを表し、6番目の81は長さ129を表し、すなわち00から最後の行a 1まで129バイトであり、前の00を除いて残りの128ビットはrsa公開鍵のN値であり、最後の5バイトは同様にbitストリームであり、02から03は長さ3を表し、最後の01 00 01はrsa公開鍵のE値である.
なぜN値の前に00を補うのかについては、ASNかもしれません.1の規定では、bitストリームの上位4 bit 16進数値が8未満であれば最上位でゼロを補う、以下の例を見る
30 81 88 02 81 80 32 8d 99 06 9f bd 9a c0 e5 6a 
5d 03 b3 cf 09 ca 8e c1 4a 6c f9 90 c2 46 e0 89 
44 69 cd a5 62 91 42 8a 5f e5 8f d3 fb 93 3f bc 
d7 6e 5e f2 80 41 a6 79 78 8e 4d 1d 3d 65 ad d4 
36 9c c5 83 55 9d f1 bb 20 4c b7 6c 95 37 b0 37 
06 e3 40 fb 8f 74 c3 59 91 a2 bf a2 e1 db 99 54 
29 5f 9b a5 57 f5 40 7a 54 82 9c 84 d4 35 86 14 
38 69 14 60 f3 c6 c7 11 75 f2 43 2c 34 ed 89 4a 
ae e1 9d 57 3e a1 02 03 01 00 01

Nの最初の4 bitは0 x 3が8未満であるため、ゼロを補う必要はない.
どのような場合にtag値の後に8 Xでlengthを表すかについては、lengthの最初の4 bitが8より大きいか、または1バイトを超える場合は、8 Xで表記する必要があります.そうしないと使用しません.
ルールが伝わって、rsa公開鍵の符号化規則を理解して、私達は便利に他のツールで発生したrsa公開鍵をopensslが受け入れることができる符号型に編成することができて、それによって公開鍵の導入を完成して、公開鍵の抽出に対して、同様に関数があります
int i2d_RSAPublicKey(RSA *,(const char **))
戻り値は公開鍵の長いである、当然ASNを経由する.1コード化されたもの.
ビットストリームとRSAの変換が完了すると、残りの作業が楽になります.ここでは、ビットとEVP_に直接アクセスできるいくつかの簡単な方法を紹介します.PKEY間変換:
エクスポート:
  len=i2d_RSAPublicKey(pkey->pkey.rsa,(const char**)pp);
   :
  pkey->save_type=6;
  pkey->type=EVP_PKEY_type(6);
  pkey->pkey.rsa=d2i_RSAPublicKey(NULL,(const char**)pp,len);

ここでpkeyの定義はEVP_PKEY *pkey;
インポート中の最初の2行の役割は、採用した暗号アルゴリズムをrsaに設定することであり、bit-〉rsa-〉pkeyモードを採用すると、この動作はEVP_PKEY_assign_RSAが私たちのために作ってくれました.