Passa al contenuto principale

8. Schema di firma con appendice (Signature Scheme with Appendix)

Uno schema di firma con appendice (Signature Scheme with Appendix) è composto da un'operazione di generazione della firma e un'operazione di verifica della firma, dove l'operazione di generazione della firma genera una firma da un messaggio utilizzando la chiave privata RSA del firmatario, e l'operazione di verifica della firma verifica l'autenticità della firma utilizzando la chiave pubblica RSA del firmatario.

Per firmare un messaggio M, il firmatario applica un'operazione di codifica del messaggio a M per generare un messaggio codificato EM, quindi applica la primitiva di firma per produrre una firma S. Per verificare una firma S, il verificatore applica la primitiva di verifica a S per recuperare il messaggio codificato EM, quindi applica l'operazione di verifica per determinare se la firma è valida per il messaggio.

Due schemi di firma sono specificati in questo documento: RSASSA-PSS e RSASSA-PKCS1-v1_5.

Sebbene non obbligatorio, RSASSA-PSS è raccomandato per le nuove applicazioni. RSASSA-PKCS1-v1_5 è incluso per la compatibilità con le applicazioni esistenti.

8.1. RSASSA-PSS

RSASSA-PSS combina le primitive RSASP1 e RSAVP1 (Sezione 5.2) con il metodo di codifica EMSA-PSS. Si basa sullo schema di firma probabilistica (Probabilistic Signature Scheme, PSS) proposto da Bellare e Rogaway [RSARABIN] [PSS].

La sicurezza di PSS si basa sulla difficoltà del problema RSA e sul modello oracle casuale del MGF. È stato dimostrato che, sotto il modello oracle casuale, se il MGF si comporta come un oracle casuale e il problema RSA è difficile, allora lo schema di firma PSS è sicuro contro gli attacchi a messaggio scelto (Chosen Message Attack).

RSASSA-PSS non è deterministico: per un dato messaggio, possono essere generate più firme possibili. Ciò è dovuto all'inclusione di un valore di sale casuale durante l'operazione di generazione della firma.

8.1.1. Operazione di generazione della firma (Signature Generation Operation)

RSASSA-PSS-SIGN (K, M)

Input (Input):

  • K: chiave privata RSA del firmatario
  • M: messaggio da firmare, una stringa di ottetti di lunghezza arbitraria

Output (Output):

  • S: firma, una stringa di ottetti di lunghezza k, dove k è la lunghezza in ottetti del modulo RSA n

Errori (Errors):

  • "message too long" (messaggio troppo lungo)
  • "encoding error" (errore di codifica)

Passi (Steps):

  1. Codifica EMSA-PSS: Applicare l'operazione di codifica EMSA-PSS al messaggio M per generare un messaggio codificato EM di lunghezza ⌈(modBits-1)/8⌉ ottetti, dove modBits è la lunghezza in bit del modulo RSA n: EM = EMSA-PSS-ENCODE(M, modBits - 1). Se l'operazione di codifica restituisce "message too long" o "encoding error", restituire l'errore corrispondente e fermarsi.

  2. Firma RSA:

    • Convertire il messaggio codificato EM in un rappresentante del messaggio intero m: m = OS2IP(EM)
    • Applicare la primitiva di firma RSASP1: s = RSASP1(K, m)
    • Convertire il rappresentante della firma s in una firma S di lunghezza k: S = I2OSP(s, k)
  3. Restituire la firma S.

8.1.2. Operazione di verifica della firma (Signature Verification Operation)

RSASSA-PSS-VERIFY ((n, e), M, S)

Input (Input):

  • (n, e): chiave pubblica RSA del firmatario
  • M: messaggio, una stringa di ottetti di lunghezza arbitraria
  • S: firma da verificare, una stringa di ottetti di lunghezza k

Output (Output):

  • "valid signature" (firma valida) o "invalid signature" (firma non valida)

Passi (Steps):

  1. Controllo di lunghezza: Se la lunghezza della firma S non è di k ottetti, restituire "invalid signature" e fermarsi.

  2. Verifica RSA:

    • Convertire la firma S in un rappresentante della firma intero s: s = OS2IP(S)
    • Applicare la primitiva di verifica RSAVP1: m = RSAVP1((n, e), s). Se RSAVP1 restituisce "signature representative out of range", restituire "invalid signature" e fermarsi.
    • Convertire il rappresentante del messaggio m in un messaggio codificato EM di lunghezza emLen = ⌈(modBits - 1)/8⌉: EM = I2OSP(m, emLen)
  3. Verifica EMSA-PSS: Applicare l'operazione di verifica EMSA-PSS: Result = EMSA-PSS-VERIFY(M, EM, modBits - 1). Se Result = "consistent", restituire "valid signature"; altrimenti restituire "invalid signature".

8.2. RSASSA-PKCS1-v1_5

RSASSA-PKCS1-v1_5 combina le primitive RSASP1 e RSAVP1 (Sezione 5.2) con il metodo di codifica EMSA-PKCS1-v1_5. È compatibile con lo schema IFSSA in IEEE 1363 [IEEE1363], dove la funzione hash del valore DigestInfo viene utilizzata per generare il rappresentante del messaggio.

La sicurezza di RSASSA-PKCS1-v1_5 dipende dalla difficoltà del problema RSA. Sebbene non ci sia un attacco noto che riesca a violare questo schema, non esiste nemmeno una prova di sicurezza come per PSS.

8.2.1. Operazione di generazione della firma (Signature Generation Operation)

RSASSA-PKCS1-V1_5-SIGN (K, M)

I passi sono simili a RSASSA-PSS, ma utilizzano il metodo di codifica EMSA-PKCS1-v1_5

8.2.2. Operazione di verifica della firma (Signature Verification Operation)

RSASSA-PKCS1-V1_5-VERIFY ((n, e), M, S)

I passi sono simili a RSASSA-PSS, ma utilizzano il metodo di verifica EMSA-PKCS1-v1_5