以下では、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 = x3 + 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以降でのみ使用できます。