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

8. ハッシュ用スイート (Suites for Hashing)

  1. ハッシュ用スイート (Suites for Hashing)

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

ハッシュ・トゥ・カーブ・スイートは、バイト列を特定の楕円曲線群上の点へ ハッシュする手続きを完全に規定します。第 8.1 節では スイートを実装する方法を記述します。楕円曲線へのハッシュを必要とする 応用は、既存のスイートを使用するか、第 8.9 節に記述されるとおりに 規定された新しいスイートを使用すべきです。

ハッシュ・トゥ・カーブ・スイートを使用するすべての応用は、 第 3.1 節の指針に従ってドメイン分離タグ (DST) を選択しなければ なりません (MUST)。加えて、そのセキュリティが対象曲線上の一様ランダムな 点を返すランダムオラクルを必要とする応用は、符号化型が hash_to_curve であるスイートを使用しなければなりません (MUST)。 詳細については第 3 節および直下を参照してください。

ハッシュ・トゥ・カーブ・スイートは以下のパラメータから構成されます。

  • Suite ID, 所与のスイートを参照するために用いられる短い名前。 第 8.10 節では Suite ID の命名規約を論じます。

  • encoding type(符号化型), 一様 (hash_to_curve) または非一様 (encode_to_curve) のいずれか。これらの符号化型の定義については 第 3 節を参照してください。

  • E, 体 F 上の対象楕円曲線。

  • p, 体 F の標数。

  • m, 体 F の拡大次数。m > 1 の場合、スイートは拡大体の元を 表現するために用いられる多項式基底も規定しなければなりません (MUST)。

  • 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)。

下の表は、いくつかの楕円曲線に対して推奨される (RECOMMENDED) スイートを列挙したものです。対応するパラメータは以下の各項で 与えられます。一様分布に従う点を出力するランダムオラクルに セキュリティ解析が依拠する暗号プロトコルを実体化する応用は、 非一様符号化を使用してはなりません (MUST NOT)。さらに、 非一様符号化を用いる応用は、非一様性がもたらすセキュリティ上の 含意を注意深く解析すべきです (SHOULD)。必要な符号化が明確でない場合、 応用はセキュリティのため一様符号化を使用すべきです (SHOULD)。

  +==============+===================================+=========+
| E | スイート | 節 |
+==============+===================================+=========+
| NIST P-256 | P256_XMD:SHA-256_SSWU_RO_ | 8.2 |
| | P256_XMD:SHA-256_SSWU_NU_ | |
+--------------+-----------------------------------+---------+
| NIST P-384 | P384_XMD:SHA-384_SSWU_RO_ | 8.3 |
| | P384_XMD:SHA-384_SSWU_NU_ | |
+--------------+-----------------------------------+---------+
| NIST P-521 | P521_XMD:SHA-512_SSWU_RO_ | 8.4 |
| | P521_XMD:SHA-512_SSWU_NU_ | |
+--------------+-----------------------------------+---------+
| curve25519 | curve25519_XMD:SHA-512_ELL2_RO_ | 8.5 |
| | curve25519_XMD:SHA-512_ELL2_NU_ | |
+--------------+-----------------------------------+---------+
| edwards25519 | edwards25519_XMD:SHA-512_ELL2_RO_ | 8.5 |
| | edwards25519_XMD:SHA-512_ELL2_NU_ | |
+--------------+-----------------------------------+---------+
| curve448 | curve448_XOF:SHAKE256_ELL2_RO_ | 8.6 |
| | curve448_XOF:SHAKE256_ELL2_NU_ | |
+--------------+-----------------------------------+---------+
| edwards448 | edwards448_XOF:SHAKE256_ELL2_RO_ | 8.6 |
| | edwards448_XOF:SHAKE256_ELL2_NU_ | |
+--------------+-----------------------------------+---------+
| secp256k1 | secp256k1_XMD:SHA-256_SSWU_RO_ | 8.7 |
| | secp256k1_XMD:SHA-256_SSWU_NU_ | |
+--------------+-----------------------------------+---------+
| BLS12-381 G1 | BLS12381G1_XMD:SHA-256_SSWU_RO_ | 8.8 |
| | BLS12381G1_XMD:SHA-256_SSWU_NU_ | |
+--------------+-----------------------------------+---------+
| BLS12-381 G2 | BLS12381G2_XMD:SHA-256_SSWU_RO_ | 8.8 |
| | BLS12381G2_XMD:SHA-256_SSWU_NU_ | |
+--------------+-----------------------------------+---------+

表 2: 楕円曲線へハッシュするためのスイート。

8.1. ハッシュ・トゥ・カーブ・スイートの実装 (Implementing a Hash-to-Curve Suite)

ハッシュ・トゥ・カーブ・スイートは以下の関数を必要とします。 これらのうちいくつかは第 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 用スイート (Suites for NIST P-256)

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

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

  • encoding type: hash_to_curve(第 3 節)

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

    • A = -3

    • B = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e2 7d2604b

  • 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: Simplified 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_ と同一です。

P-256 への Simplified SWU 写像の最適化された実装例は付録 F.2 に 示されています。

8.3. NIST P-384 用スイート (Suites for NIST P-384)

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

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

  • encoding type: hash_to_curve(第 3 節)

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

    • A = -3

    • B = 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5 013875ac656398d8a2ed19d2a85c8edd3ec2aef

  • 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: Simplified 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_ と同一です。

P-384 への Simplified SWU 写像の最適化された実装例は付録 F.2 に 示されています。

8.4. NIST P-521 用スイート (Suites for NIST P-521)

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

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

  • encoding type: hash_to_curve(第 3 節)

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

    • A = -3

    • B = 0x51953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b4899 18ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451f d46b503f00

  • p: 2^521 - 1

  • m: 1

  • k: 256

  • expand_message: expand_message_xmd(第 5.3.1 節)

  • H: SHA-512

  • L: 98

  • f: Simplified 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_ と同一です。

P-521 への Simplified SWU 写像の最適化された実装例は付録 F.2 に 示されています。

8.5. curve25519 および edwards25519 用スイート (Suites for curve25519 and edwards25519)

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

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

  • encoding type: 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 = 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca1 35978a3

  • f: ねじれ Edwards 版 Elligator 2 法(第 6.8.2 節)

  • M: curve25519, [RFC7748] 第 4.1 節で定義

  • 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 用スイート (Suites for curve448 and edwards448)

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

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

  • encoding type: 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: ねじれ Edwards 版 Elligator 2 法(第 6.8.2 節)

  • M: curve448, [RFC7748] 第 4.2 節で定義

  • 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 用スイート (Suites for secp256k1)

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

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

  • encoding type: 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 に対する Simplified SWU(第 6.6.3 節)

  • Z: -11

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

    • A': 0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01 a444533

    • 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_ と 同一です。

secp256k1 と同種である曲線 E' への Simplified SWU 写像の最適化された 実装例は付録 F.2 に示されています。

8.8. BLS12-381 用スイート (Suites for BLS12-381)

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

8.8.1. BLS12-381 G1

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

  • encoding type: hash_to_curve(第 3 節)

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

  • p: 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f 6241eabfffeb153ffffb9feffffffffaaab

  • m: 1

  • k: 128

  • expand_message: expand_message_xmd(第 5.3.1 節)

  • H: SHA-256

  • L: 64

  • f: AB == 0 に対する Simplified SWU(第 6.6.3 節)

  • Z: 11

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

    • A' = 0x144698a3b8e9433d693a02c96d4982b0ea985383ee66a8d8e8981aef d881ac98936f8da0e0f97f5cf428082d584c1d

    • B' = 0x12e2908d11688030018b12e8753eee3b2016c1f0f24f4070a0b9c14f cef35ef55a23215a316ceaa5d1cc48e98e172be0

  • 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 節)との互換性のために選ばれている点に注意してください。

BLS12-381 G1 と同種である曲線 E' への Simplified SWU 写像の 最適化された実装例は付録 F.2 に示されています。

8.8.2. BLS12-381 G2

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

  • encoding type: hash_to_curve(第 3 節)

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

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

    • p: 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6 b0f6241eabfffeb153ffffb9feffffffffaaab

    • m: 2

    • (1, I) は F の基底であり、F において I^2 + 1 == 0

  • k: 128

  • expand_message: expand_message_xmd(第 5.3.1 節)

  • H: SHA-256

  • L: 64

  • f: AB == 0 に対する Simplified 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: 0xbc69f08f2ee75b3584c6a0ea91b352888e2a8e9145ad7689986ff0315 08ffe1329c2f178731db956d82bf015d1212b02ec0ec69d7477c1ae954cbc06689 f6a359894c0adebbf6b4e8020005aaa95551

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 にまとめられている点に注意してください。

BLS12-381 G2 と同種である曲線 E' への Simplified SWU 写像の 最適化された実装例は付録 F.2 に示されています。

8.9. 新しいハッシュ・トゥ・カーブ・スイートの定義 (Defining a New Hash-to-Curve Suite)

第 8 節の他の箇所に列挙されていない楕円曲線については、 新しいハッシュ・トゥ・カーブ・スイートを次のようにして定義できます。

  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 節の指針に従って Suite ID を構成します。

8.10. Suite ID の命名規約 (Suite ID Naming Conventions)

Suite ID は次のように構成されなければなりません (MUST)。

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

フィールド CURVE_ID, HASH_ID, MAP_ID, および ENC_VAR は、 それぞれ高々 64 文字の ASCII 符号化された文字列です。フィールドは 0x21 から 0x7E(両端を含む)の間の ASCII 文字のみを含まなければ なりません (MUST)。ただしアンダースコア(すなわち 0x5F)は 許可されません。

上に示したとおり、各フィールド(最後のものを含む)の後には アンダースコア("_", ASCII 0x5F)が続きます。これは Suite ID が プレフィックスフリーであることを保証するのに役立ちます。Suite ID は 末尾のアンダースコアを含まなければならず (MUST)、末尾のアンダースコアの 後にいかなる文字も含んではなりません (MUST NOT)。

Suite ID のフィールドは次のように選択されなければなりません (MUST)。

  • CURVE_ID: 対象楕円曲線の人間可読な表現。

  • HASH_ID: expand_message 関数、および hash_to_field(第 5 節)で 用いられる基礎となるハッシュプリミティブの人間可読な表現。 このフィールドは次のように構成されなければなりません (MUST)。

    EXP_TAG || ":" || HASH_NAME

    EXP_TAG は expand_message 変種を示します。

    • expand_message_xmd(第 5.3.1 節)に対しては "XMD"。

    • expand_message_xof(第 5.3.2 節)に対しては "XOF"。

    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 関数を用いるスイートは、 その関数を識別するタグをコロン(":", ASCII 0x3A)で区切って HASH_ID フィールドに追記することにより、これを示さなければ なりません (MUST)。

  • MAP_ID: 第 6 節で定義される map_to_curve 関数の人間可読な表現。 これらは次のように定義されます。

    • Shallue と van de Woestijne(第 6.6.1 節)に対しては "SVDW"。

    • Simplified SWU(第 6.6.2 節および第 6.6.3 節)に対しては "SSWU"。

    • Elligator 2(第 6.7.1 節および第 6.8.2 節)に対しては "ELL2"。

  • ENC_VAR: 符号化型およびその他の情報を示す文字列。この文字列の 最初の 2 文字は、スイートが hash_to_curve と encode_to_curve の いずれの演算を表すかを次のように示します(第 3 節)。

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

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

    • ENC_VAR は他のいかなる文字列で始まってもなりません (MUST NOT)。

    ENC_VAR は、変種を識別するために用いられる他の情報、たとえば バージョン番号を符号化するために使用してもかまいません (MAY)。 そのようにする推奨される (RECOMMENDED) 方法は、コロンで区切られた 1 つ以上のサブフィールドを追加することです。たとえば "RO:V02" は 一様符号化スイートの第 2 版に適した ENC_VAR の値であり、 "RO:V02:FOO01:BAR17" はそのスイートの変種を示すために 用いられる可能性があります。