web-dev-qa-db-ja.com

OpenSSL ECCキー-1つの曲線のDERエンコーディングの追加バイト

以下では、OpenSSLを使用して、secp224k1曲線の秘密鍵を作成しています。 DERの秘密鍵の長さに注意してください-0x1d。これは224ではなく、29バイト、つまり232ビットです。先行ゼロバイトが付加されているようです。

$ openssl version
OpenSSL 1.1.1a  20 Nov 2018

$ openssl ecparam -name secp224k1 -genkey -noout -outform DER -out ~/secp224k1.der 

$ certutil -asn ~/secp224k1.der
0000: 30 69                                     ; SEQUENCE (69 Bytes)
0002:    02 01                                  ; INTEGER (1 Bytes)
0004:    |  01
0005:    04 1d                                  ; OCTET_STRING (1d Bytes)
0007:    |  00 9b 69 d2 25 22 85 cc  58 c5 57 29 7e 59 02 6f  ; ..i.%"..X.W)~Y.o
0017:    |  ee 90 b1 f7 7e 78 c3 10  5c 20 52 22 78           ; ....~x..\ R"x
0024:    a0 07                                  ; OPTIONAL[0] (7 Bytes)
0026:    |  06 05                               ; OBJECT_ID (5 Bytes)
0028:    |     2b 81 04 00 20
         |        ; 1.3.132.0.32 secP224k1
002d:    a1 3c                                  ; OPTIONAL[1] (3c Bytes)
002f:       03 3a 00 04 47 21 06 a1  dc ea 7d 12 e9 0f 00 29  ; .:..G!....}....)
003f:       ca 5d db 67 3f 51 e3 b3  a7 5a b6 8c d3 23 f6 93  ; .].g?Q...Z...#..
004f:       7f 8a a2 fe ce cb d9 22  f1 92 95 69 4f 25 08 3a  ; ......."...iO%.:
005f:       0d 28 1a 27 a8 99 0e 5f  0b e0 17 b5              ; .(.'..._.... 

これがINTEGERではなくOCTET_STRINGであるため、MSB 1を持つ数値が自動的に先頭にゼロが付加されることはありません。実際、secp224r1の場合、次のことは行われません。

0005:    04 1c                                  ; OCTET_STRING (1c Bytes)
0007:    |  e5 5f 38 18 d8 7b ca 84  85 f3 c0 1a c7 83 21 bf  ; ._8..{........!.
0017:    |  b9 f9 ed 9c 83 2b b5 b0  ce 15 6c 0b              ; .....+....l.

この動作は、secp256r1およびsecp256k1曲線のどちらでも発生しません。なぜこれが起こったのか知っている人はいますか?

ありがとう。

Secp224k1の場合、基礎となるフィールドのサイズ、つまり公開鍵を含むポイント座標は(わずかに)2よりも小さいですが224カーブグループの順序、つまりprivateキーのサイズは少し大きくなります2より224を表すには通常29オクテットが必要です-スペックごとにランダムに一様に選択されたdの確率が実際に29オクテットを必要とする確率は非常に小さいため、おそらく地球の寿命の間に起こります。 http://www.secg.org からSEC2を引用する(これは無料であり、X9.62はそうではないため)マイナスの書式設定MathJaxなしでは再現できません。

2.3.1推奨パラメーターsecp224k1
楕円曲線領域パラメーター Fp Koblitz曲線に関連付けられたsecp224k1は、6項T =(p、a、b、G、n、h)で指定され、ここで有限体 Fp によって定義されます:
p = FFFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFE56D
= 2224 − 232 − 212 − 211 − 29 − 27 − 24 − 2 − 1
曲線E:y2 = x + ax + b以上 Fp によって定義されます:
a = 00000000 00000000 00000000 00000000 00000000 00000000 00000000
b = 00000000 00000000 00000000 00000000 00000000 00000000 00000005
圧縮形式の基点Gは次のとおりです:
G = 03 A1455B33 4DF099DF 30FC28A1 69A467E9 E47075A9 0F7E650E B6B7A45C
非圧縮形式は次のとおりです。
G = 04 A1455B33 4DF099DF 30FC28A1 69A467E9 E47075A9 0F7E650E B6B7A45C 7E089FED 7FBA3442 82CAFBD6 F7E319F7 C0B0BD59 E2CA4BDB 556D61A5
最後に、Gの次数nと補因子は次のとおりです。
n = 01 00000000 00000000 00000000 0001DCE8 D2EC6184 CAF0A971 769FB1F7
h = 01

https://github.com/openssl/openssl/commit/30cd4ff294252c4b6a4b69cbef6a5b4117705d22#diff-a51596fb2f3b3650972f0f650cdcf115 -これは最初は間違って実装されていましたが、フィールドサイズ( 'degree')を使用して修正されましたが、グループ順序を使用する(直接ec_asn1.cを呼び出してEC_KEY_priv2{buf,oct} in ec_key.c)AFAICSは1.1.0以降でのみ使用できます。

2