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:
- Sia R = R * r_(i-1).
- Sia h = (m_i - m) * t_i mod r_i.
- 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:
- Sia s_1 = m^dP mod p e s_2 = m^dQ mod q.
- Se u > 2, sia s_i = m^(d_i) mod r_i, i = 3, ..., u.
- Sia h = (s_1 - s_2) * qInv mod p.
- Sia s = s_2 + q * h.
- 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.