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

8. ハッシュスイート

この節では、標準的な楕円曲線へハッシュするための推奨スイートをリストします。

hash-to-curve スイートは、バイト文字列を特定の楕円曲線群上の点にハッシュする手順を完全に指定します。第8.1節では、スイートの実装方法について説明します。楕円曲線へのハッシュを必要とするアプリケーションは、既存のスイートを使用するか、第8.9節で説明するように新しいスイートを指定すべきです。

hash-to-curve スイートを使用するすべてのアプリケーションは、第3.1節のガイドラインに従ってドメイン分離タグ (DST) を選択しなければなりません(MUST)。さらに、アプリケーションのセキュリティ上の要求として、ターゲット曲線上の点が一様ランダムであるランダムオラクルを必要とする場合は、エンコードタイプが hash_to_curve であるスイートを使用しなければなりません(MUST)。詳細については、第3節および以下を参照してください。

hash-to-curve スイートには、以下のパラメータが含まれます。

  • スイート ID:特定のスイートを参照するために使用される短い名前。第8.10節でスイート ID の命名規則について説明します。

  • エンコードタイプ:一様 (hash_to_curve) または非一様 (encode_to_curve) を含みます。これらのエンコードタイプの定義については第3節を参照してください。

  • E:有限体 F 上のターゲット楕円曲線。

  • p:有限体 F の標数。

  • m:有限体 F の拡大次数。m > 1 の場合、スイートは拡大体の要素を表すために使用される多項式基底も指定しなければなりません。

  • k:スイートのターゲットセキュリティレベル(ビット単位)。(議論については第10.8節を参照してください。)

  • L:hash_to_field の長さパラメータ(第5節)。

  • expand_message:第5.3節で指定されたバリアントのいずれか。および、指定されたバリアントに必要なパラメータ(例:基礎となるハッシュ関数 H)。

  • f:第6節からのマッピング関数。

  • h_eff:clear_cofactor のスカラーパラメータ(第7節)。

上記のパラメータに加えて、マッピング f には追加のパラメータ Z, M, rational_map, E', または iso_map が必要になる場合があります。該当する場合、これらを指定しなければなりません。

以下の表は、一部の楕円曲線に対して推奨されるスイートをリストしたものです。対応するパラメータは、以降のサブセクションで示されます。アプリケーションがインスタンス化する暗号プロトコルのセキュリティ分析が一様分布の点を出力するランダムオラクルに依存している場合、非一様エンコーディングを使用してはなりません(MUST NOT)。また、非一様エンコーディングを使用するアプリケーションは、非一様性がセキュリティに与える影響を慎重に分析すべきです。必要なエンコーディングが不明な場合、安全性を確保するために一様エンコーディングを使用すべきです。

Eスイート
NIST P-256P256_XMD:SHA-256_SSWU_RO_
P256_XMD:SHA-256_SSWU_NU_
8.2
NIST P-384P384_XMD:SHA-384_SSWU_RO_
P384_XMD:SHA-384_SSWU_NU_
8.3
NIST P-521P521_XMD:SHA-512_SSWU_RO_
P521_XMD:SHA-512_SSWU_NU_
8.4
curve25519curve25519_XMD:SHA-512_ELL2_RO_
curve25519_XMD:SHA-512_ELL2_NU_
8.5
edwards25519edwards25519_XMD:SHA-512_ELL2_RO_
edwards25519_XMD:SHA-512_ELL2_NU_
8.5
curve448curve448_XOF:SHAKE256_ELL2_RO_
curve448_XOF:SHAKE256_ELL2_NU_
8.6
edwards448edwards448_XOF:SHAKE256_ELL2_RO_
edwards448_XOF:SHAKE256_ELL2_NU_
8.6
secp256k1secp256k1_XMD:SHA-256_SSWU_RO_
secp256k1_XMD:SHA-256_SSWU_NU_
8.7
BLS12-381 G1BLS12381G1_XMD:SHA-256_SSWU_RO_
BLS12381G1_XMD:SHA-256_SSWU_NU_
8.8
BLS12-381 G2BLS12381G2_XMD:SHA-256_SSWU_RO_
BLS12381G2_XMD:SHA-256_SSWU_NU_
8.8

表 2: 楕円曲線へのハッシュに使用されるスイート

8.1. hash-to-curve スイートの実装

hash-to-curve スイートには、以下の関数が必要です。これらの一部は第4節のユーティリティ関数を必要とすることに注意してください。

  1. ターゲット楕円曲線の基礎体の算術演算(例:加算、乗算、平方根)。

  2. ターゲット曲線の楕円曲線点演算(例:点加算、スカラー倍)。

  3. hash_to_field 関数(第5節を参照)。これには expand_message バリアント(第5.3節)および構成されるハッシュ関数または XOF が含まれます。

  4. スイートによって指定されたマッピング関数(第6節の対応するサブセクションを参照)。

  5. 余因子消去関数(第7節を参照)。これは h_eff 倍のスカラー倍として、またはそれと同等のより高速な方法として実装できます。

  6. 要求されるエンコード関数(第3節を参照)。これは hash_to_curve または encode_to_curve です。

8.2. NIST P-256 スイート

この節では、NIST P-256 楕円曲線 [FIPS186-4] に対する暗号スイートを定義します。

P256_XMD:SHA-256_SSWU_RO_ は次のように定義されます。

  • エンコードタイプ:hash_to_curve(第3節)

  • E:y^2 = x^3 + A * x + B。ここで、

    • A = -3

    • B = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b

  • p:2^256 - 2^224 + 2^192 + 2^96 - 1

  • m:1

  • k:128

  • expand_message:expand_message_xmd(第5.3.1節)

  • H:SHA-256

  • L:48

  • f:簡略化 SWU 法(第6.6.2節)

  • Z:-10

  • h_eff:1

P256_XMD:SHA-256_SSWU_NU_ は、エンコードタイプが encode_to_curve(第3節)であることを除いて、P256_XMD:SHA-256_SSWU_RO_ と同じです。

付録 F.2 に、P-256 へのマッピングのための簡略化 SWU の最適化された実装例を示します。

8.3. NIST P-384 スイート

この節では、NIST P-384 楕円曲線 [FIPS186-4] に対する暗号スイートを定義します。

P384_XMD:SHA-384_SSWU_RO_ は次のように定義されます。

  • エンコードタイプ:hash_to_curve(第3節)

  • E:y^2 = x^3 + A * x + B。ここで、

    • A = -3

    • B = 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef

  • p:2^384 - 2^128 - 2^96 + 2^32 - 1

  • m:1

  • k:192

  • expand_message:expand_message_xmd(第5.3.1節)

  • H:SHA-384

  • L:72

  • f:簡略化 SWU 法(第6.6.2节)

  • Z:-12

  • h_eff:1

P384_XMD:SHA-384_SSWU_NU_ は、エンコードタイプが encode_to_curve(第3節)であることを除いて、P384_XMD:SHA-384_SSWU_RO_ と同じです。

付録 F.2 に、P-384 へのマッピングのための簡略化 SWU の最適化された実装例を示します。

8.4. NIST P-521 スイート

この節では、NIST P-521 楕円曲線 [FIPS186-4] に対する暗号スイートを定義します。

P521_XMD:SHA-512_SSWU_RO_ は次のように定義されます。

  • エンコードタイプ:hash_to_curve(第3節)

  • E:y^2 = x^3 + A * x + B。ここで、

    • A = -3

    • B = 0x51953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00

  • p:2^521 - 1

  • m:1

  • k:256

  • expand_message:expand_message_xmd(第5.3.1节)

  • H:SHA-512

  • L:98

  • f:簡略化 SWU 法(第6.6.2节)

  • Z:-4

  • h_eff:1

P521_XMD:SHA-512_SSWU_NU_ は、エンコードタイプが encode_to_curve(第3节)であることを除いて、P521_XMD:SHA-512_SSWU_RO_ と同じです。

付録 F.2 に、P-521 へのマッピングのための簡略化 SWU の最適化された実装例を示します。

8.5. curve25519 および edwards25519 スイート

この節では、curve25519 および edwards25519 [RFC7748] に対する暗号スイートを定義します。注意点として、これらの暗号スイートを ristretto255 [ristretto255-decaf448] へのハッシュに使用してはなりません。その群へのハッシュ方法については、付録 B を参照してください。

curve25519_XMD:SHA-512_ELL2_RO_ は次のように定義されます。

  • エンコードタイプ:hash_to_curve(第3節)

  • E:K * t^2 = s^3 + J * s^2 + s。ここで、

    • J = 486662

    • K = 1

  • p:2^255 - 19

  • m:1

  • k:128

  • expand_message:expand_message_xmd(第5.3.1節)

  • H:SHA-512

  • L:48

  • f:Elligator 2 法(第6.7.1節)

  • Z:2

  • h_eff:8

edwards25519_XMD:SHA-512_ELL2_RO_ は、以下のパラメータを除いて curve25519_XMD:SHA-512_ELL2_RO_ と同じです。

  • E:a * v^2 + w^2 = 1 + d * v^2 * w^2。ここで、

    • a = -1

    • d = 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3

  • f:Twisted Edwards Elligator 2 法(第6.8.2節)

  • M:[RFC7748] の第4.1節で定義されている curve25519

  • rational_map:[RFC7748] の第4.1節で定義されている双有理写像

curve25519_XMD:SHA-512_ELL2_NU_ は、エンコードタイプが encode_to_curve(第3節)であることを除いて、curve25519_XMD:SHA-512_ELL2_RO_ と同じです。

edwards25519_XMD:SHA-512_ELL2_NU_ は、エンコードタイプが encode_to_curve(第3節)であることを除いて、edwards25519_XMD:SHA-512_ELL2_RO_ と同じです。

付録 G.2.1 および付録 G.2.2 に、上記のマッピングの最適化された実装例を示します。

8.6. curve448 および edwards448 スイート

この節では、curve448 および edwards448 [RFC7748] に対する暗号スイートを定義します。注意点として、これらの暗号スイートを decaf448 [ristretto255-decaf448] へのハッシュに使用してはなりません。その群へのハッシュ方法については、付録 C を参照してください。

curve448_XOF:SHAKE256_ELL2_RO_ は次のように定義されます。

  • エンコードタイプ:hash_to_curve(第3節)

  • E:K * t^2 = s^3 + J * s^2 + s。ここで、

    • J = 156326

    • K = 1

  • p:2^448 - 2^224 - 1

  • m:1

  • k:224

  • expand_message:expand_message_xof(第5.3.2節)

  • H:SHAKE256

  • L:84

  • f:Elligator 2 法(第6.7.1節)

  • Z:-1

  • h_eff:4

edwards448_XOF:SHAKE256_ELL2_RO_ は、以下のパラメータを除いて curve448_XOF:SHAKE256_ELL2_RO_ と同じです。

  • E:a * v^2 + w^2 = 1 + d * v^2 * w^2。ここで、

    • a = 1

    • d = -39081

  • f:Twisted Edwards Elligator 2 法(第6.8.2節)

  • M:[RFC7748] の第4.2節で定義されている curve448

  • rational_map:[RFC7748] の第4.2節で定義されている 4-同源写像

curve448_XOF:SHAKE256_ELL2_NU_ は、エンコードタイプが encode_to_curve(第3節)であることを除いて、curve448_XOF:SHAKE256_ELL2_RO_ と同じです。

edwards448_XOF:SHAKE256_ELL2_NU_ は、エンコードタイプが encode_to_curve(第3節)であることを除いて、edwards448_XOF:SHAKE256_ELL2_RO_ と同じです。

付録 G.2.3 および付録 G.2.4 に、上記のマッピングの最適化された実装例を示します。

8.7. secp256k1 スイート

この節では、secp256k1 楕円曲線 [SEC2] に対する暗号スイートを定義します。

secp256k1_XMD:SHA-256_SSWU_RO_ は次のように定義されます。

  • エンコードタイプ:hash_to_curve(第3節)

  • E:y^2 = x^3 + 7

  • p:2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1

  • m:1

  • k:128

  • expand_message:expand_message_xmd(第5.3.1節)

  • H:SHA-256

  • L:48

  • f:AB == 0 の場合の簡略化 SWU(第6.6.3節)

  • Z:-11

  • E':y'^2 = x'^3 + A' * x' + B'。ここで、

    • A':0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533

    • B':1771

  • iso_map:付録 E.1 に示される E' から E への 3-同源写像

  • h_eff:1

secp256k1_XMD:SHA-256_SSWU_NU_ は、エンコードタイプが encode_to_curve(第3节)であることを除いて、secp256k1_XMD:SHA-256_SSWU_RO_ と同じです。

付録 F.2 に、secp256k1 と同源な曲線 E' へのマッピングのための簡略化 SWU の最適化された実装例を示します。

8.8. BLS12-381 スイート

この節では、BLS12-381 楕円曲線 [BLS12-381] の群 G1 および G2 に対する暗号スイートを定義します。

8.8.1. BLS12-381 G1

BLS12381G1_XMD:SHA-256_SSWU_RO_ は次のように定義されます。

  • エンコードタイプ:hash_to_curve(第3節)

  • E:y^2 = x^3 + 4

  • p:0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab

  • m:1

  • k:128

  • expand_message:expand_message_xmd(第5.3.1節)

  • H:SHA-256

  • L:64

  • f:AB == 0 の場合の簡略化 SWU(第6.6.3節)

  • Z:11

  • E':y'^2 = x'^3 + A' * x' + B'。ここで、

    • A' = 0x144698a3b8e9433d693a02c96d4982b0ea985383ee66a8d8e8981aefd881ac98936f8da0e0f97f5cf428082d584c1d

    • B' = 0x12e2908d11688030018b12e8753eee3b2016c1f0f24f4070a0b9c14fcef35ef55a23215a316ceaa5d1cc48e98e172be0

  • iso_map:付録 E.2 に示される E' から E への 11-同源写像

  • h_eff:0xd201000000010001

BLS12381G1_XMD:SHA-256_SSWU_NU_ は、エンコードタイプが encode_to_curve(第3節)であることを除いて、BLS12381G1_XMD:SHA-256_SSWU_RO_ と同じです。

これらのスイートの h_eff の値は、Scott が説明した高速余因子消去法([WB19]、第5節)との互換性のために選択されていることに注意してください。

付録 F.2 に、BLS12-381 G1 と同源な曲線 E' へのマッピングのための簡略化 SWU の最適化された実装例を示します。

8.8.2. BLS12-381 G2

BLS12381G2_XMD:SHA-256_SSWU_RO_ は次のように定義されます。

  • エンコードタイプ:hash_to_curve(第3節)

  • E:y^2 = x^3 + 4 * (1 + I)

  • 基礎体 F は GF(p^m)。ここで、

    • p:0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab

    • m:2

    • (1, I) は F の基底。ここで I^2 + 1 == 0

  • k:128

  • expand_message:expand_message_xmd(第5.3.1节)

  • H:SHA-256

  • L:64

  • f:AB == 0 の場合の簡略化 SWU(第6.6.3节)

  • Z:-(2 + I)

  • E':y'^2 = x'^3 + A' * x' + B'。ここで、

    • A' = 240 * I

    • B' = 1012 * (1 + I)

  • iso_map:付録 E.3 に示される E' から E への同源写像

  • h_eff:0xbc69f08f2ee75b3584c6a0ea91b352888e2a8e9145ad7689986ff031508ffe1329c2f178731db956d82bf015d1212b02ec0ec69d7477c1ae954cbc06689f6a359894c0adebbf6b4e8020005aaa95551

BLS12381G2_XMD:SHA-256_SSWU_NU_ は、エンコードタイプが encode_to_curve(第3节)であることを除いて、BLS12381G2_XMD:SHA-256_SSWU_RO_ と同じです。

これらのスイートの h_eff の値は、Budroni と Pintore が説明した高速余因子消去法([BP17]、第4.1节、および付録 G.3 に要約)との互換性のために選択されていることに注意してください。

付録 F.2 に、BLS12-381 G2 と同源な曲線 E' へのマッピングのための簡略化 SWU の最適化された実装例を示します。

8.9. 新しい hash-to-curve スイートの定義

第8節にリストされていない他の楕円曲線については、以下の方法で新しい hash-to-curve スイートを定義できます。

  1. E, F, p, および m は、楕円曲線とその基礎体によって決定されます。

  2. k は、スイートのターゲットセキュリティレベルの上限です(第10.8節)。k の妥当な選択は ceil(log2(r) / 2) です。ここで r は曲線 E の部分群 G の位数です(第2.1节)。

  3. エンコードタイプ(hash_to_curve または encode_to_curve)を選択します(第3節)。

  4. 第5節で説明されているように L を計算します。

  5. 第5.3節から expand_message のバリアントと基礎となる暗号プリミティブ(例:ハッシュ関数 H)を選択します。

  6. 第6.1節のガイドラインに従ってマッピングを選択し、そのマッピングに必要なパラメータを選択します。

  7. h_eff を E の余因子として選択するか、高速余因子消去法を使用する場合は、第7節で説明されているようにその方法に適した値を選択します。

  8. 第8.10節のガイドラインに従ってスイート ID を構築します。

8.10. スイート ID の命名規則

スイート ID は、以下の形式で構築されなければなりません(MUST)。

CURVE_ID || "_" || HASH_ID || "_" || MAP_ID || "_" || ENC_VAR || "_"

フィールド CURVE_ID, HASH_ID, MAP_ID, および ENC_VAR は、最大 64 文字の ASCII エンコードされた文字列です。フィールドには 0x21 から 0x7E まで(両端を含む)の ASCII 文字のみを含める必要がありますが、アンダースコア (0x5F) は許可されません。

上記のように、各フィールド(最後の一つを含む)の後にはアンダースコア ("_", ASCII 0x5F) が続きます。これにより、スイート ID がプレフィックスフリーになることが保証されます。スイート ID には必ず最後のアンダースコアを含める必要があり、最後のアンダースコアの後に文字を含めてはなりません。

スイート ID の各フィールドは、以下のように選択しなければなりません(MUST)。

  • CURVE_ID:ターゲットとなる楕円曲線の人間が読める形式の表現。

  • HASH_ID:hash_to_field(第5節)で使用される expand_message 関数と基礎となるハッシュプリミティブの人間が読める形式の表現。このフィールドは以下のように構築されなければなりません。

    EXP_TAG || ":" || HASH_NAME

    EXP_TAG は expand_message バリアントを示します。

    • "XMD" は expand_message_xmd(第5.3.1節)を表します。

    • "XOF" は expand_message_xof(第5.3.2節)を表します。

    HASH_NAME は基礎となるハッシュプリミティブの人間が読める名前です。例えば:

    1. SHAKE128 を備えた expand_message_xof(第5.3.2節)の場合、HASH_ID は "XOF:SHAKE128" となります。

    2. SHA3-256 を備えた expand_message_xmd(第5.3.1節)の場合、HASH_ID は "XMD:SHA3-256" となります。

    第5.1節の要件を満たす代替の hash_to_field 関数を使用するスイートは、HASH_ID フィールドにその関数を識別するタグをコロン (":", ASCII 0x3A) で区切って付加することで、これを示さなければなりません(MUST)。

  • MAP_ID:第6節で定義された map_to_curve 関数の人間が読める形式の表現。以下のように定義されます。

    • "SVDW" は Shallue と van de Woestijne(第6.6.1節)を表します。

    • "SSWU" は簡略化 SWU(第6.6.2 および 6.6.3 節)を表します。

    • "ELL2" は Elligator 2(第6.7.1 および 6.8.2 節)を表します。

  • ENC_VAR:エンコードタイプなどの情報を示す文字列。この文字列の最初の2文字は、そのスイートが hash_to_curve または encode_to_curve 操作(第3節)のどちらを表すかを示します。

    • ENC_VAR が "RO" で始まる場合、スイートは hash_to_curve を使用します。

    • ENC_VAR が "NU" で始まる場合、スイートは encode_to_curve を使用します。

    • ENC_VAR がこれら以外の文字列で始まってはなりません。

    ENC_VAR は、バージョン番号など、バリアントを識別するための他の情報をエンコードするために使用することもできます。1つ以上のサブフィールドをコロンで区切って追加することを推奨します。例えば、"RO:V02" は一様エンコードスイートの第2バージョンに適した ENC_VAR 値であり、"RO:V02:FOO01:BAR17" はそのスイートのバリアントを示すために使用できます。