Passa al contenuto principale

5. Primitive crittografiche (Cryptographic Primitives)

Le primitive crittografiche (Cryptographic Primitives) sono operazioni matematiche di base da cui possono essere costruiti schemi crittografici. Sono destinate ad essere utilizzate in implementazioni hardware o come moduli software, e non sono destinate a fornire sicurezza indipendentemente dagli schemi.

Questo documento specifica quattro tipi di primitive, organizzate in coppie: cifratura e decifratura (Encryption and Decryption); firma e verifica (Signature and Verification).

La specifica delle primitive presuppone che gli input soddisfino determinate condizioni, in particolare che le chiavi pubbliche e private RSA siano valide.

5.1. Primitive di cifratura e decifratura (Encryption and Decryption Primitives)

Una primitiva di cifratura (Encryption Primitive) produce un rappresentante del testo cifrato da un rappresentante del messaggio sotto il controllo di una chiave pubblica, e una primitiva di decifratura (Decryption Primitive) recupera un rappresentante del messaggio da un rappresentante del testo cifrato sotto il controllo della chiave privata corrispondente.

Una coppia di primitive di cifratura e decifratura è utilizzata negli schemi di cifratura definiti in questo documento ed è specificata qui: primitiva di cifratura RSA (RSAEP, RSA Encryption Primitive) / primitiva di decifratura RSA (RSADP, RSA Decryption Primitive). RSAEP e RSADP coinvolgono la stessa operazione matematica, con chiavi diverse in input. Le primitive qui definite sono identiche alla primitiva di cifratura per fattorizzazione di interi usando RSA (IFEP-RSA) / primitiva di decifratura per fattorizzazione di interi usando RSA (IFDP-RSA) in IEEE 1363 [IEEE1363] (ad eccezione dell'aggiunta del supporto per RSA multi-primo), e sono compatibili con PKCS #1 v1.5.

L'operazione matematica principale in ogni primitiva è l'esponenziazione (Exponentiation).

5.1.1. RSAEP

RSAEP ((n, e), m)

Input (Input)

(n, e)   chiave pubblica RSA
m rappresentante del messaggio, un intero compreso tra 0 e n - 1

Output (Output)

c        rappresentante del testo cifrato, un intero compreso tra 0 e n - 1

Errore (Error)

"message representative out of range" (rappresentante del messaggio fuori intervallo)

Assunzione (Assumption)

La chiave pubblica RSA (n, e) è valida

Passi (Steps)

Passo 1. Se il rappresentante del messaggio m non è compreso tra 0 e n - 1, restituire "message representative out of range" e fermarsi.

Passo 2. Sia c = m^e mod n.

Passo 3. Restituire c.

5.1.2. RSADP

RSADP (K, c)

Input (Input)

K        chiave privata RSA, dove K ha una delle seguenti forme:
- coppia (n, d)
- quintupla (p, q, dP, dQ, qInv) e sequenza possibilmente vuota di triple (r_i, d_i, t_i), i = 3, ..., u
c rappresentante del testo cifrato, un intero compreso tra 0 e n - 1

Output (Output)

m        rappresentante del messaggio, un intero compreso tra 0 e n - 1

Errore (Error)

"ciphertext representative out of range" (rappresentante del testo cifrato fuori intervallo)

Assunzione (Assumption)

La chiave privata RSA K è valida

Passi (Steps)

Passo 1. Se il rappresentante del testo cifrato c non è compreso tra 0 e n - 1, restituire "ciphertext representative out of range" e fermarsi.

Passo 2. Il rappresentante del messaggio m è calcolato come segue:

a. Se viene utilizzata la prima forma di K (n, d), sia m = c^d mod n.

b. Se viene utilizzata la seconda forma di K (p, q, dP, dQ, qInv) e (r_i, d_i, t_i), procedere come segue:

i. Sia m_1 = c^dP mod p e m_2 = c^dQ mod q.

ii. Se u > 2, sia m_i = c^(d_i) mod r_i, i = 3, ..., u.

iii. Sia h = (m_1 - m_2) * qInv mod p.

iv. Sia m = m_2 + q * h.

v. Se u > 2, sia R = r_1 e per i = 3 a u, eseguire:

  1. Sia R = R * r_(i-1).
  2. Sia h = (m_i - m) * t_i mod r_i.
  3. Sia m = m + R * h.

Passo 3. Restituire m.

Nota: Il passo 2.b può essere riscritto come un singolo ciclo, a condizione che l'ordine di p e q sia invertito. Tuttavia, per coerenza con PKCS #1 v2.0, i primi due numeri primi p e q sono trattati separatamente dai numeri primi aggiuntivi.

5.2. Primitive di firma e verifica (Signature and Verification Primitives)

Una primitiva di firma (Signature Primitive) produce un rappresentante della firma da un rappresentante del messaggio sotto il controllo di una chiave privata, e una primitiva di verifica (Verification Primitive) recupera un rappresentante del messaggio da un rappresentante della firma sotto il controllo della chiave pubblica corrispondente. Una coppia di primitive di firma e verifica è utilizzata negli schemi di firma definiti in questo documento ed è specificata qui: primitiva di firma RSA versione 1 (RSASP1, RSA Signature Primitive, version 1) / primitiva di verifica RSA versione 1 (RSAVP1, RSA Verification Primitive, version 1).

Le primitive qui definite sono identiche alla primitiva di firma per fattorizzazione di interi usando RSA versione 1 (IFSP-RSA1) / primitiva di verifica per fattorizzazione di interi usando RSA versione 1 (IFVP-RSA1) in IEEE 1363 [IEEE1363] (ad eccezione dell'aggiunta del supporto per RSA multi-primo), e sono compatibili con PKCS #1 v1.5.

L'operazione matematica principale in ogni primitiva è l'esponenziazione, come nelle primitive di cifratura e decifratura della sezione 5.1. RSASP1 e RSAVP1 sono identiche a RSADP e RSAEP, ad eccezione dei nomi dei parametri di input e output; sono distinte perché vengono utilizzate per scopi diversi.

5.2.1. RSASP1

RSASP1 (K, m)

Input (Input)

K        chiave privata RSA, dove K ha una delle seguenti forme:
- coppia (n, d)
- quintupla (p, q, dP, dQ, qInv) e sequenza possibilmente vuota di triple (r_i, d_i, t_i), i = 3, ..., u
m rappresentante del messaggio, un intero compreso tra 0 e n - 1

Output (Output)

s        rappresentante della firma, un intero compreso tra 0 e n - 1

Errore (Error)

"message representative out of range" (rappresentante del messaggio fuori intervallo)

Assunzione (Assumption)

La chiave privata RSA K è valida

Passi (Steps)

Passo 1. Se il rappresentante del messaggio m non è compreso tra 0 e n - 1, restituire "message representative out of range" e fermarsi.

Passo 2. Il rappresentante della firma s è calcolato come segue:

a. Se viene utilizzata la prima forma di K (n, d), sia s = m^d mod n.

b. Se viene utilizzata la seconda forma di K (p, q, dP, dQ, qInv) e (r_i, d_i, t_i), procedere come segue:

  1. Sia s_1 = m^dP mod p e s_2 = m^dQ mod q.
  2. Se u > 2, sia s_i = m^(d_i) mod r_i, i = 3, ..., u.
  3. Sia h = (s_1 - s_2) * qInv mod p.
  4. Sia s = s_2 + q * h.
  5. Se u > 2, sia R = r_1 e per i = 3 a u, eseguire:
    • a. Sia R = R * r_(i-1).
    • b. Sia h = (s_i - s) * t_i mod r_i.
    • c. Sia s = s + R * h.

Passo 3. Restituire s.

Nota: Il passo 2.b può essere riscritto come un singolo ciclo, a condizione che l'ordine di p e q sia invertito. Tuttavia, per coerenza con PKCS #1 v2.0, i primi due numeri primi p e q sono trattati separatamente dai numeri primi aggiuntivi.

5.2.2. RSAVP1

RSAVP1 ((n, e), s)

Input (Input)

(n, e)   chiave pubblica RSA
s rappresentante della firma, un intero compreso tra 0 e n - 1

Output (Output)

m        rappresentante del messaggio, un intero compreso tra 0 e n - 1

Errore (Error)

"signature representative out of range" (rappresentante della firma fuori intervallo)

Assunzione (Assumption)

La chiave pubblica RSA (n, e) è valida

Passi (Steps)

Passo 1. Se il rappresentante della firma s non è compreso tra 0 e n - 1, restituire "signature representative out of range" e fermarsi.

Passo 2. Sia m = s^e mod n.

Passo 3. Restituire m.