メインコンテンツまでスキップ

7.1.2. SerializePrivateKey and DeserializePrivateKey (秘密鍵のシリアライズとデシリアライズ)

7.1.2. SerializePrivateKey and DeserializePrivateKey (秘密鍵のシリアライズとデシリアライズ)

[SECG] によると, P-256, P-384, および P-521 の秘密鍵は使用される曲線のスカラー体の体要素です。このセクションおよびセクション 7.1.3 では, これらの曲線上の ECDH の実装者が OS2IP() 関数と互換性のある秘密鍵の整数表現を使用することを前提としています。

P-256, P-384, および P-521 の場合, KEM の SerializePrivateKey() 関数は [SECG] に従って体要素からオクテット文字列への変換を実行します。秘密鍵が [0, order-1] の範囲外の整数である場合 (order は使用される曲線の位数), シリアライズされる前に秘密鍵を [0, order-1] 内の代表に減らさなければなりません。DeserializePrivateKey() は [SECG] に従ってオクテット文字列から体要素への変換を実行します。

X25519 および X448 の場合, 秘密鍵はそのバイト文字列表現と同一であるため, ほとんど処理は必要ありません。SerializePrivateKey() 関数はその出力をクランプしなければならず, DeserializePrivateKey() 関数はその入力をクランプしなければなりません。ここで clamping は [RFC7748] のセクション 5 で定義された decodeScalar25519() および decodeScalar448() 関数で k に対して実行されるビット演算を指します。

無効な鍵を早期にキャッチするため, DHKEM の実装者はデシリアライズされた秘密鍵が 0 (mod order) と等価でないことをチェックすべきです。ここで order は DH グループの位数です。この特性は X25519 および X448 グループに対しては自明に真であることに注意してください。クランプされた値は決して 0 (mod order) にはなりえないためです。