1

.pemopenssl asn1parse のおかげで解析したファイルがあります。

いくつかの値を変更したいのですが、.pemファイルに戻すにはどうすればよいですか?

4

3 に答える 3

3

「手動」ルートを使用する場合は、次の点を考慮してください。

  1. ASN.1 のDER (およびBER ) エンコードでは、Tag-Length-Value 形式が使用されます。Tagはアイテムを説明し、Lenghtは値が実行される時間を提供します。
  2. アイテムが構築されているかどうかのタグ(つまり、値が別の ASN.1 であるかどうか)。これは、タグの最初のバイトのビット 6 です。
  3. タグは通常 1 バイトですが、タグ値が 30 より大きい場合は複数バイトに拡張できます。
  4. さは、1 バイト以上でエンコードできます。長さが <= 127 (0x7f) の場合、1 バイトのみが使用されます (ビット 8 が 0 になることに注意してください)。長さが > 127 の場合、最初のバイトにはビット 8 が設定され、長さを表すために必要なバイト数が含まれます。

ハンドデコード

したがって、すばやくデコードするには、次のルールを使用します。

タグを見つけます。最初のバイトが次の場合:

  • 0x[13579bdf]f. 次に、マルチバイト タグです。0x7f 未満のバイトが見つかるまで読み続けます。それが最後のバイトになります。次のバイトに移動
  • 他の。次に半角タグです。次のバイトに移動

最初のバイトのビット 6 (つまり、最初のニブルの 0x[2367abef]) に注意してください。これは構築されたビットです。

今、長さのために。最初のバイトが次の場合:

  • byte > 0x7f: マルチバイト長です。後で読み取るバイト数は、この最初のバイトにエンコードされます。長さを読む
  • byte <= 0x7f: これは長さです。

今、価値のために。長さで示されるバイト数を読み取ります。

タグで見つかった構築されたビットを考慮して、値のバイトに対してプロセスを最初からやり直す必要があるかどうかを判断します。

バイトがなくなるまでこれを続けます。

ハンドエンコーディング

  • 変更する場合、タグについて心配する必要はありません。心配する必要があるのは、値と長さだけです。

  • 必要に応じて値を変更します。

  • 囲んでいる型の長さを上向きに変更します。

  • 127 の長さの制限に注意してください。囲んでいる型の 1 つがそれを超える場合は、81 LL に置き換えます (LL は現在の 255 の最大長です)。この場合、長さのエンコーディングの長さのバイト数の増加を考慮する必要があることに注意してください封入型の。

  • 255、65535、16777215 などをジャンプすると、同様のことが発生する可能性があります。長さ: 長さ (0x82、0x83...) をエンコードするためにバイト数を増やし、それらを使用して新しい長さをエンコードする必要があります。

このメッセージを使用します。

62 6a 48 04 01 00 00 00 6b 1e 28 1c 06 07 00 11
86 05 01 01 01 a0 11 60 0f 80 02 07 80 a1 09 06
07 04 00 00 00 00 00 09 6c 42 a1 40 02 01 01 02
01 00 30 38 80 01 61 82 07 83 10 19 33 50 71 05
83 07 83 13 19 78 97 21 04 88 01 80 89 01 04 af
11 30 0f 02 01 21 a1 0a 80 08 13 12 f1 01 ab 01
5d 68 bb 05 80 03 80 90 a3 9c 01 0c

これは、証明書とは関係のない別のアプリケーション ドメインからのものですが、説明できると思います。

62 は 1 バイトのタグで、6a は 1 バイトの長さ (106) です。最初のニブルに 0x6 があるので、これが構築型であることがわかります。

次は 48 です。これは 1 バイトのタグで、62 に囲まれた ASN.1 タイプの開始です。私はそれが構築されていないことを知っています。その長さ 0x04 (1 バイトの長さ) とその値 (さらに 4 バイト: 0x01000000) を読み取ることができます。

行けるように……。

62 6a 
   48 04 : 01 00 00 00 
   6b 1e
      28 1c 
         06 07 : 00 11 86 05 01 01 01 
         a0 11
            60 0f 
               80 02 : 07 80 
               a1 09 
                  06 07 04 00 00 00 00 00 09 
   6c 42 
      a1 40 
         02 01 : 01 
         02 01 : 00 
         30 38 
            80 01 : 61 
            82 07 : 83 10 19 33 50 71 05 
            83 07 : 83 13 19 78 97 21 04 
            88 01 : 80 
            89 01 : 04 
            af 11 
               30 0f 
                  02 01 : 21 
                  a1 0a 
                     80 08 : 13 12 f1 01 ab 01 5d 68 
            bb 05 
               80 03 : 80 90 a3 
            9c 01 : 0c

たとえば、最初の値 (0x48 タグ内) を 0x1234567890 に変更する場合

私はそうすることができました、

62 6a 
   48 04 : 01 00 00 00 

することが:

62 6a 
   48 04 : _12 34 56 78 90_ 

しかし今、私は長さを増やす必要があります:

62 6a 
   48 _05_ : 12 34 56 78 90 

囲んでいる型の長さ:

62 _6b_ 
   48 05 : 12 34 56 78 90 

新しいメッセージは次のとおりです。

62 _6b_ 48 _05_ _12_ _34_ _56_ _78_ _90_ 
6b 1e 28 1c 06 07 00 11
86 05 01 01 01 a0 11 60 0f 80 02 07 80 a1 09 06
07 04 00 00 00 00 00 09 6c 42 a1 40 02 01 01 02
01 00 30 38 80 01 61 82 07 83 10 19 33 50 71 05
83 07 83 13 19 78 97 21 04 88 01 80 89 01 04 af
11 30 0f 02 01 21 a1 0a 80 08 13 12 f1 01 ab 01
5d 68 bb 05 80 03 80 90 a3 9c 01 0c
于 2015-02-11T10:33:51.777 に答える
-1

値を変更して長さを変更することは必ずしも容易ではありません。コンテンツ項目は DER でエンコードされているため、テキスト フィールドでない限り、バイナリ形式に変換するには少しノウハウが必要です。また、長さは入れ子になっている可能性があるため、さまざまなレベルで長さを変更する必要がある場合があります。

これを実行できるツールがhttp://www.obj-sys.com/products/asn1ve/index.phpにあります。

于 2015-02-06T21:24:29.610 に答える
-1

実際、手動で変更するのは非常に簡単です。それを開いて、変更したい値を変更し、長さが変更された場合は「長さ」を変更します。変更した直前のバイトです。

DER は次のように機能します: TLV (タグ、長さ、値)

例: 02 02 00 aa (02: 整数、02: ペイロードのサイズ、00 aa ペイロード (整数は最初のビットとして 0 で始まる必要があります。それ以外の場合は負の整数であるため、ここではペイロードにもう 1 バイトを追加する必要がありました)

また、ペイロードの長さが 127 ビットを超える場合は、サイズを 2 回記述する必要があります (少なくともそれは私の理解です)。

値の長さを変更する場合は、ヘッダーのグローバル長も変更する必要があります。

于 2015-02-05T22:12:51.563 に答える