Passa al contenuto principale

8. Suite per l'hashing

Questa sezione elenca le suite raccomandate per l'hashing verso curve ellittiche standard.

Una suite per l'hashing su curva specifica interamente la procedura di hashing delle stringhe di byte verso punti di un gruppo specifico di curve ellittiche. La Sezione 8.1 descrive come implementare una suite. Le applicazioni che richiedono l'hashing verso una curva ellittica dovrebbero utilizzare una suite esistente o una nuova suite specificata come descritto nella Sezione 8.9.

Tutte le applicazioni che utilizzano una suite per l'hashing su curva DEVONO scegliere un tag di separazione di dominio (DST) in conformità con le linee guida della Sezione 3.1. Inoltre, le applicazioni la cui sicurezza richiede un random oracle che restituisca punti casuali uniformi sulla curva di destinazione DEVONO utilizzare una suite il cui tipo di codifica sia hash_to_curve; vedere la Sezione 3 e immediatamente sotto per ulteriori informazioni.

Una suite per l'hashing su curva comprende i seguenti parametri:

  • Suite ID: un nome breve utilizzato per fare riferimento a una data suite. La Sezione 8.10 tratta le convenzioni di denominazione degli ID delle suite.

  • Tipo di codifica: uniforme (hash_to_curve) o non uniforme (encode_to_curve). Vedere la Sezione 3 per le definizioni di questi tipi di codifica.

  • E: la curva ellittica di destinazione su un campo F.

  • p: la caratteristica del campo F.

  • m: il grado di estensione del campo F. Se m > 1, la suite DEVE anche specificare la base polinomiale utilizzata per rappresentare gli elementi del campo di estensione.

  • k: il livello di sicurezza di destinazione della suite in bit. (Vedere la Sezione 10.8 per ulteriori dettagli).

  • L: il parametro di lunghezza per hash_to_field (Sezione 5).

  • expand_message: una delle varianti specificate nella Sezione 5.3 più tutti i parametri richiesti per la variante specificata (ad esempio, H, la funzione di hash sottostante).

  • f: una funzione di mappatura dalla Sezione 6.

  • h_eff: il parametro scalare per clear_cofactor (Sezione 7).

Oltre ai parametri sopra indicati, la mappatura f può richiedere parametri aggiuntivi Z, M, rational_map, E' o iso_map. Se applicabili, questi DEVONO essere specificati.

La tabella seguente elenca le suite RACCOMANDATE per alcune curve ellittiche. I parametri corrispondenti sono forniti nelle sottosezioni seguenti. Le applicazioni che istanziano protocolli crittografici la cui analisi di sicurezza si basa su un random oracle che produce punti con una distribuzione uniforme NON DEVONO utilizzare una codifica non uniforme. Inoltre, le applicazioni che utilizzano una codifica non uniforme DOVREBBERO analizzare attentamente le implicazioni sulla sicurezza della non uniformità. Se la codifica richiesta non è chiara, le applicazioni DOVREBBERO utilizzare una codifica uniforme per la sicurezza.

ESuiteSezione
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

Tabella 2: Suite per l'hashing verso le curve ellittiche.

8.1. Implementazione di una suite per l'hashing su curva

Una suite per l'hashing su curva richiede le seguenti funzioni. Si noti che alcune di esse richiedono funzioni di utilità dalla Sezione 4.

  1. Operazioni aritmetiche del campo di base per la curva ellittica di destinazione, come addizione, moltiplicazione e radice quadrata.

  2. Operazioni sui punti della curva ellittica per la curva di destinazione, come addizione di punti e moltiplicazione scalare.

  3. La funzione hash_to_field; vedere la Sezione 5. Ciò include la variante expand_message (Sezione 5.3) e qualsiasi funzione di hash o XOF costituente.

  4. La funzione di mappatura specificata dalla suite; vedere la sottosezione corrispondente della Sezione 6.

  5. Una funzione di cancellazione del cofattore; vedere la Sezione 7. Questa può essere implementata come moltiplicazione scalare per h_eff o sotto forma di un metodo equivalente più veloce.

  6. La funzione di codifica desiderata; vedere la Sezione 3. Si tratta di hash_to_curve o encode_to_curve.

8.2. Suite per NIST P-256

Questa sezione definisce le suite crittografiche per la curva ellittica NIST P-256 [FIPS186-4].

P256_XMD:SHA-256_SSWU_RO_ è definita come segue:

  • tipo di codifica: hash_to_curve (Sezione 3)
  • E: y^2 = x^3 + A * x + B, dove
    • A = -3
    • B = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b
  • p: 2^256 - 2^224 + 2^192 + 2^96 - 1
  • m: 1
  • k: 128
  • expand_message: expand_message_xmd (Sezione 5.3.1)
  • H: SHA-256
  • L: 48
  • f: Metodo SWU semplificato (Sezione 6.6.2)
  • Z: -10
  • h_eff: 1

P256_XMD:SHA-256_SSWU_NU_ è identica a P256_XMD:SHA-256_SSWU_RO_, tranne per il fatto che il tipo di codifica è encode_to_curve (Sezione 3).

Un esempio di implementazione ottimizzata della mappatura SWU semplificata verso P-256 è fornito nell'Appendice F.2.

8.3. Suite per NIST P-384

Questa sezione definisce le suite crittografiche per la curva ellittica NIST P-384 [FIPS186-4].

P384_XMD:SHA-384_SSWU_RO_ è definita come segue:

  • tipo di codifica: hash_to_curve (Sezione 3)
  • E: y^2 = x^3 + A * x + B, dove
    • A = -3
    • B = 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef
  • p: 2^384 - 2^128 - 2^96 + 2^32 - 1
  • m: 1
  • k: 192
  • expand_message: expand_message_xmd (Sezione 5.3.1)
  • H: SHA-384
  • L: 72
  • f: Metodo SWU semplificato (Sezione 6.6.2)
  • Z: -12
  • h_eff: 1

P384_XMD:SHA-384_SSWU_NU_ è identica a P384_XMD:SHA-384_SSWU_RO_, tranne per il fatto che il tipo di codifica è encode_to_curve (Sezione 3).

Un esempio di implementazione ottimizzata della mappatura SWU semplificata verso P-384 è fornito nell'Appendice F.2.

8.4. Suite per NIST P-521

Questa sezione definisce le suite crittografiche per la curva ellittica NIST P-521 [FIPS186-4].

P521_XMD:SHA-512_SSWU_RO_ è definita come segue:

  • tipo di codifica: hash_to_curve (Sezione 3)
  • E: y^2 = x^3 + A * x + B, dove
    • A = -3
    • B = 0x51953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00
  • p: 2^521 - 1
  • m: 1
  • k: 256
  • expand_message: expand_message_xmd (Sezione 5.3.1)
  • H: SHA-512
  • L: 98
  • f: Metodo SWU semplificato (Sezione 6.6.2)
  • Z: -4
  • h_eff: 1

P521_XMD:SHA-512_SSWU_NU_ è identica a P521_XMD:SHA-512_SSWU_RO_, tranne per il fatto che il tipo di codifica è encode_to_curve (Sezione 3).

Un esempio di implementazione ottimizzata della mappatura SWU semplificata verso P-521 è fornito nell'Appendice F.2.

8.5. Suite per curve25519 ed edwards25519

Questa sezione definisce le suite crittografiche per curve25519 ed edwards25519 [RFC7748]. Si noti che queste suite crittografiche NON DEVONO essere utilizzate per l'hashing verso ristretto255 [ristretto255-decaf448]. Vedere l'Appendice B per ulteriori informazioni su come eseguire l'hashing verso quel gruppo.

curve25519_XMD:SHA-512_ELL2_RO_ è definita come segue:

  • tipo di codifica: hash_to_curve (Sezione 3)
  • E: K * t^2 = s^3 + J * s^2 + s, dove
    • J = 486662
    • K = 1
  • p: 2^255 - 19
  • m: 1
  • k: 128
  • expand_message: expand_message_xmd (Sezione 5.3.1)
  • H: SHA-512
  • L: 48
  • f: Metodo Elligator 2 (Sezione 6.7.1)
  • Z: 2
  • h_eff: 8

edwards25519_XMD:SHA-512_ELL2_RO_ è identica a curve25519_XMD:SHA-512_ELL2_RO_, ad eccezione dei seguenti parametri:

  • E: a * v^2 + w^2 = 1 + d * v^2 * w^2, dove
    • a = -1
    • d = 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3
  • f: Metodo Elligator 2 per Edwards ritorta (Sezione 6.8.2)
  • M: curve25519, definita in [RFC7748], Sezione 4.1
  • rational_map: le mappe birazionali definite in [RFC7748], Sezione 4.1

curve25519_XMD:SHA-512_ELL2_NU_ è identica a curve25519_XMD:SHA-512_ELL2_RO_, tranne per il fatto che il tipo di codifica è encode_to_curve (Sezione 3).

edwards25519_XMD:SHA-512_ELL2_NU_ è identica a edwards25519_XMD:SHA-512_ELL2_RO_, tranne per il fatto che il tipo di codifica è encode_to_curve (Sezione 3).

Esempi di implementazioni ottimizzate delle mappature sopra indicate sono forniti nell'Appendice G.2.1 e nell'Appendice G.2.2.

8.6. Suite per curve448 ed edwards448

Questa sezione definisce le suite crittografiche per curve448 ed edwards448 [RFC7748]. Si noti che queste suite crittografiche NON DEVONO essere utilizzate per l'hashing verso decaf448 [ristretto255-decaf448]. Vedere l'Appendice C per ulteriori informazioni su come eseguire l'hashing verso quel gruppo.

curve448_XOF:SHAKE256_ELL2_RO_ è definita come segue:

  • tipo di codifica: hash_to_curve (Sezione 3)
  • E: K * t^2 = s^3 + J * s^2 + s, dove
    • J = 156326
    • K = 1
  • p: 2^448 - 2^224 - 1
  • m: 1
  • k: 224
  • expand_message: expand_message_xof (Sezione 5.3.2)
  • H: SHAKE256
  • L: 84
  • f: Metodo Elligator 2 (Sezione 6.7.1)
  • Z: -1
  • h_eff: 4

edwards448_XOF:SHAKE256_ELL2_RO_ è identica a curve448_XOF:SHAKE256_ELL2_RO_, ad eccezione dei seguenti parametri:

  • E: a * v^2 + w^2 = 1 + d * v^2 * w^2, dove
    • a = 1
    • d = -39081
  • f: Metodo Elligator 2 per Edwards ritorta (Sezione 6.8.2)
  • M: curve448, definita in [RFC7748], Sezione 4.2
  • rational_map: la mappa di isogenia-4 definita in [RFC7748], Sezione 4.2

curve448_XOF:SHAKE256_ELL2_NU_ è identica a curve448_XOF:SHAKE256_ELL2_RO_, tranne per il fatto che il tipo di codifica è encode_to_curve (Sezione 3).

edwards448_XOF:SHAKE256_ELL2_NU_ è identica a edwards448_XOF:SHAKE256_ELL2_RO_, tranne per il fatto che il tipo di codifica è encode_to_curve (Sezione 3).

Esempi di implementazioni ottimizzate delle mappature sopra indicate sono forniti nell'Appendice G.2.3 e nell'Appendice G.2.4.

8.7. Suite per secp256k1

Questa sezione definisce le suite crittografiche per la curva ellittica secp256k1 [SEC2].

secp256k1_XMD:SHA-256_SSWU_RO_ è definita come segue:

  • tipo di codifica: hash_to_curve (Sezione 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 (Sezione 5.3.1)
  • H: SHA-256
  • L: 48
  • f: SWU semplificato per AB == 0 (Sezione 6.6.3)
  • Z: -11
  • E': y'^2 = x'^3 + A' * x' + B', dove
    • A': 0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533
    • B': 1771
  • iso_map: la mappa di isogenia-3 da E' a E fornita nell'Appendice E.1
  • h_eff: 1

secp256k1_XMD:SHA-256_SSWU_NU_ è identica a secp256k1_XMD:SHA-256_SSWU_RO_, tranne per il fatto che il tipo di codifica è encode_to_curve (Sezione 3).

Un esempio di implementazione ottimizzata della mappatura SWU semplificata verso la curva E' isogena a secp256k1 è fornito nell'Appendice F.2.

8.8. Suite per BLS12-381

Questa sezione definisce le suite crittografiche per i gruppi G1 e G2 della curva ellittica BLS12-381 [BLS12-381].

8.8.1. BLS12-381 G1

BLS12381G1_XMD:SHA-256_SSWU_RO_ è definita come segue:

  • tipo di codifica: hash_to_curve (Sezione 3)
  • E: y^2 = x^3 + 4
  • p: 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab
  • m: 1
  • k: 128
  • expand_message: expand_message_xmd (Sezione 5.3.1)
  • H: SHA-256
  • L: 64
  • f: SWU semplificato per AB == 0 (Sezione 6.6.3)
  • Z: 11
  • E': y'^2 = x'^3 + A' * x' + B', dove
    • A' = 0x144698a3b8e9433d693a02c96d4982b0ea985383ee66a8d8e8981aefd881ac98936f8da0e0f97f5cf428082d584c1d
    • B' = 0x12e2908d11688030018b12e8753eee3b2016c1f0f24f4070a0b9c14fcef35ef55a23215a316ceaa5d1cc48e98e172be0
  • iso_map: la mappa di isogenia-11 da E' a E fornita nell'Appendice E.2
  • h_eff: 0xd201000000010001

BLS12381G1_XMD:SHA-256_SSWU_NU_ è identica a BLS12381G1_XMD:SHA-256_SSWU_RO_, tranne per il fatto che il tipo di codifica è encode_to_curve (Sezione 3).

Si noti che i valori h_eff per queste suite sono scelti per la loro compatibilità con il metodo veloce per la cancellazione del cofattore descritto da Scott ([WB19], Sezione 5).

Un esempio di implementazione ottimizzata della mappatura SWU semplificata verso la curva E' isogena a BLS12-381 G1 è fornito nell'Appendice F.2.

8.8.2. BLS12-381 G2

BLS12381G2_XMD:SHA-256_SSWU_RO_ è definita come segue:

  • tipo di codifica: hash_to_curve (Sezione 3)
  • E: y^2 = x^3 + 4 * (1 + I)
  • il campo di base F è GF(p^m), dove
    • p: 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab
    • m: 2
    • (1, I) è la base per F, dove I^2 + 1 == 0 in F
  • k: 128
  • expand_message: expand_message_xmd (Sezione 5.3.1)
  • H: SHA-256
  • L: 64
  • f: SWU semplificato per AB == 0 (Sezione 6.6.3)
  • Z: -(2 + I)
  • E': y'^2 = x'^3 + A' * x' + B', dove
    • A' = 240 * I
    • B' = 1012 * (1 + I)
  • iso_map: la mappa di isogenia da E' a E fornita nell'Appendice E.3
  • h_eff: 0xbc69f08f2ee75b3584c6a0ea91b352888e2a8e9145ad7689986ff031508ffe1329c2f178731db956d82bf015d1212b02ec0ec69d7477c1ae954cbc06689f6a359894c0adebbf6b4e8020005aaa95551

BLS12381G2_XMD:SHA-256_SSWU_NU_ è identica a BLS12381G2_XMD:SHA-256_SSWU_RO_, tranne per il fatto che il tipo di codifica è encode_to_curve (Sezione 3).

Si noti che i valori h_eff per queste suite sono scelti per la loro compatibilità con il metodo veloce per la cancellazione del cofattore descritto da Budroni e Pintore ([BP17], Sezione 4.1) e sono riassunti nell'Appendice G.3.

Un esempio di implementazione ottimizzata della mappatura SWU semplificata verso la curva E' isogena a BLS12-381 G2 è fornito nell'Appendice F.2.

8.9. Definizione di una nuova suite per l'hashing su curva

Per le curve ellittiche non elencate altrove nella Sezione 8, una nuova suite per l'hashing su curva può essere definita come segue:

  1. E, F, p e m sono determinati dalla curva ellittica e dal suo campo di base.

  2. k è un limite superiore del livello di sicurezza di destinazione della suite (Sezione 10.8). Una scelta ragionevole di k è ceil(log2(r) / 2), dove r è l'ordine del sottogruppo G della curva E (Sezione 2.1).

  3. Scegliere il tipo di codifica, ovvero hash_to_curve o encode_to_curve (Sezione 3).

  4. Calcolare L come descritto nella Sezione 5.

  5. Scegliere una variante expand_message dalla Sezione 5.3 più tutte le primitive crittografiche sottostanti (ad esempio, una funzione di hash H).

  6. Scegliere una mappatura seguendo le linee guida della Sezione 6.1 e selezionare tutti i parametri richiesti per tale mappatura.

  7. Scegliere h_eff come cofattore di E o, se è necessario utilizzare un metodo veloce per la cancellazione del cofattore, un valore appropriato per tale metodo come discusso nella Sezione 7.

  8. Costruire un Suite ID seguendo le linee guida della Sezione 8.10.

8.10. Convenzioni di denominazione degli ID delle suite

Gli ID delle suite DEVONO essere costruiti come segue:

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

I campi CURVE_ID, HASH_ID, MAP_ID ed ENC_VAR sono stringhe codificate in ASCII di massimo 64 caratteri ciascuna. I campi DEVONO contenere solo caratteri ASCII tra 0x21 e 0x7E (inclusi), ad eccezione del carattere di sottolineatura (underscore, ovvero 0x5F) che non è consentito.

Come indicato sopra, ogni campo (compreso l'ultimo) è seguito da un carattere di sottolineatura ("_", ASCII 0x5F). Questo aiuta a garantire che gli ID delle suite siano privi di prefissi. Gli ID delle suite DEVONO includere il carattere di sottolineatura finale e NON DEVONO includere caratteri dopo il carattere di sottolineatura finale.

I campi dell'ID della suite DEVONO essere scelti come segue:

  • CURVE_ID: una rappresentazione della curva ellittica di destinazione leggibile dall'uomo.

  • HASH_ID: una rappresentazione della funzione expand_message e di tutte le primitive di hash sottostanti utilizzate in hash_to_field (Sezione 5) leggibile dall'uomo. Questo campo DEVE essere costruito come segue:

    EXP_TAG || ":" || HASH_NAME

    EXP_TAG indica la variante expand_message:

    • "XMD" per expand_message_xmd (Sezione 5.3.1).
    • "XOF" per expand_message_xof (Sezione 5.3.2).

    HASH_NAME è un nome leggibile dall'uomo per la primitiva di hash sottostante. A titolo di esempio:

    1. Per expand_message_xof (Sezione 5.3.2) con SHAKE128, HASH_ID è "XOF:SHAKE128".
    2. Per expand_message_xmd (Sezione 5.3.1) con SHA3-256, HASH_ID è "XMD:SHA3-256".

    Le suite che utilizzano una funzione hash_to_field alternativa che soddisfa i requisiti della Sezione 5.1 DEVONO indicarlo aggiungendo un'etichetta che identifichi tale funzione al campo HASH_ID, separata dai due punti (":", ASCII 0x3A).

  • MAP_ID: una rappresentazione della funzione map_to_curve definita nella Sezione 6 leggibile dall'uomo. Queste sono definite come segue:

    • "SVDW" per Shallue e van de Woestijne (Sezione 6.6.1).
    • "SSWU" per SWU semplificato (Sezioni 6.6.2 e 6.6.3).
    • "ELL2" per Elligator 2 (Sezioni 6.7.1 e 6.8.2).
  • ENC_VAR: una stringa che indica il tipo di codifica e altre informazioni. I primi due caratteri di questa stringa indicano se la suite rappresenta un'operazione hash_to_curve o encode_to_curve (Sezione 3), come segue:

    • Se ENC_VAR inizia con "RO", la suite utilizza hash_to_curve.
    • Se ENC_VAR inizia con "NU", la suite utilizza encode_to_curve.
    • ENC_VAR NON DEVE iniziare con nessun'altra stringa.

    ENC_VAR PUÒ anche essere utilizzata per codificare altre informazioni utilizzate per identificare varianti, ad esempio un numero di versione. Il metodo RACCOMANDATO per farlo è aggiungere uno o più sottocampi separati dai due punti. Ad esempio, "RO:V02" è un valore ENC_VAR appropriato per la seconda versione di una suite di codifica uniforme, mentre "RO:V02:FOO01:BAR17" potrebbe essere utilizzato per indicare una variante di tale suite.