# Farcit òptim de xifratge asimètric

En criptografia, l'Optim Asymmetric Encryption Padding (OAEP) és un esquema de farciment que s'utilitza sovint juntament amb el xifratge RSA. OAEP va ser introduït per Bellare i Rogaway, i posteriorment estandarditzat en PKCS#1 v2 i RFC 2437.
L'algorisme OAEP és una forma de xarxa Feistel que utilitza un parell d'oracles aleatoris G i H per processar el text pla abans del xifratge asimètric. Quan es combina amb qualsevol permutació unidireccional de trapa segura $f$, aquest processament està demostrat en el model d'oracle aleatori per donar lloc a un esquema combinat que és semànticament segur sota l'atac de text pla escollit (IND-CPA). Quan s'implementa amb determinades permutacions de trampa (per exemple, RSA), també s'ha demostrat que OAEP és segur contra l'atac de text xifrat escollit. OAEP es pot utilitzar per crear una transformació tot o res.
L'OAEP compleix els dos objectius següents:
* Afegiu un element d'aleatorietat que es pot utilitzar per convertir un esquema de xifratge determinista (per exemple, RSA tradicional) en un esquema probabilístic.
* Eviteu el desxifrat parcial dels textos xifrats (o altres fuites d'informació) assegurant-vos que un adversari no pugui recuperar cap part del text sense poder invertir la permutació unidireccional de la trampa.
La versió original d'OAEP (Bellare/Rogaway, 1994) mostrava una forma de " consciència de text pla " (que, segons ells, implica seguretat contra l'atac de text xifrat triat) en el model d'oracle aleatori quan s'utilitza OAEP amb qualsevol permutació de trampa. Els resultats posteriors van contradir aquesta afirmació, demostrant que l'OAEP només era segur IND-CCA1. Tanmateix, es va demostrar que l'esquema original en el model d'oracle aleatori és segur IND-CCA2 quan s'utilitza OAEP amb la permutació RSA utilitzant exponents de xifratge estàndard, com en el cas de RSA-OAEP. Victor Shoup va oferir un esquema millorat (anomenat OAEP+) que funciona amb qualsevol permutació unidireccional de trampa per resoldre aquest problema. Un treball més recent ha demostrat que en el model estàndard (és a dir, quan les funcions hash no es modelen com a oracles aleatoris) és impossible demostrar la seguretat IND-CCA2 de RSA-OAEP sota la duresa suposada del problema RSA.

## Algorisme

En el diagrama,
* MGF és la funció de generació de màscares, normalment MGF1,
* Hash és la funció hash escollida,
* hLen és la longitud de la sortida de la funció hash en bytes,
* k és la longitud del mòdul RSA n en bytes,
* M és el missatge que s'ha de farcir (com a màxim $k-2\cdot \mathrm {hLen} -2$ bytes),
* L és una etiqueta opcional que s'ha d'associar amb el missatge (l'etiqueta és la cadena buida per defecte i es pot utilitzar per autenticar dades sense requerir xifratge),
* PS és una cadena de bytes de $k-\mathrm {mLen} -2\cdot \mathrm {hLen} -2$ bytes nuls.
* ⊕ és una operació XOR.

### Codificació

La RFC 8017 per a PKCS#1 v2.2 especifica l'esquema OAEP de la següent manera per a la codificació:
* Tritura l'etiqueta L utilitzant la funció hash escollida: $\mathrm {lHash} =\mathrm {Hash} (L)$
* Genereu una cadena de farciment PS que consta de $k-\mathrm {mLen} -2\cdot \mathrm {hLen} -2$ bytes amb el valor 0x00.
* Concatena lHash, PS, el byte únic 0x01 i el missatge M per formar una base de dades de blocs de dades: $\mathrm {DB} =\mathrm {lHash} ||\mathrm {PS} ||\mathrm {0x01} ||\mathrm {M}$. Aquest bloc de dades té longitud bytes.
* Genereu una llavor aleatòria de longitud hLen.
* Utilitzeu la funció de generació de màscares per generar una màscara de la longitud adequada per al bloc de dades: $\mathrm {dbMask} =\mathrm {MGF} (\mathrm {seed} ,k-\mathrm {hLen} -1)$
* Enmascareu el bloc de dades amb la màscara generada: $\mathrm {maskedDB} =\mathrm {DB} \oplus \mathrm {dbMask}$
* Utilitzeu la funció de generació de màscares per generar una màscara de longitud hLen per a la llavor: $\mathrm {seedMask} =\mathrm {MGF} (\mathrm {maskedDB} ,\mathrm {hLen} )$
* Enmascarar la llavor amb la màscara generada: $\mathrm {maskedSeed} =\mathrm {seed} \oplus \mathrm {seedMask}$
* El missatge codificat (embotit) és el byte 0x00 concatenat amb maskedSeed i maskedDB : $\mathrm {EM} =\mathrm {0x00} ||\mathrm {maskedSeed} ||\mathrm {maskedDB}$

### Descodificació

La descodificació funciona invertint els passos realitzats a l'algorisme de codificació:
* Tritura l'etiqueta L utilitzant la funció hash escollida: $\mathrm {lHash} =\mathrm {Hash} (L)$
* Per revertir el pas 9, dividiu el missatge codificat EM en el byte 0x00, el maskedSeed (amb longitud hLen ) i el maskedDB : $\mathrm {EM} =\mathrm {0x00} ||\mathrm {maskedSeed} ||\mathrm {maskedDB}$
* Genereu la seedMask que es va utilitzar per emmascarar la llavor : $\mathrm {seedMask} =\mathrm {MGF} (\mathrm {maskedDB} ,\mathrm {hLen} )$
* Per invertir el pas 8, recupereu la llavor amb la màscara de llavors : $\mathrm {seed} =\mathrm {maskedSeed} \oplus \mathrm {seedMask}$
* Genereu la dbMask que es va utilitzar per emmascarar el bloc de dades: $\mathrm {dbMask} =\mathrm {MGF} (\mathrm {seed} ,k-\mathrm {hLen} -1)$
* Per invertir el pas 6, recupereu la base de dades del bloc de dades: $\mathrm {DB} =\mathrm {maskedDB} \oplus \mathrm {dbMask}$
* Per invertir el pas 3, dividiu el bloc de dades en les seves parts: $\mathrm {DB} =\mathrm {lHash'} ||\mathrm {PS} ||\mathrm {0x01} ||\mathrm {M}$.
** Comproveu que:
*** lHash' és igual al lHash calculat
*** PS només consta de bytes 0x00
*** PS i M estan separats pel byte 0x01 i
*** el primer byte d' EM és el byte 0x00.
** Si alguna d'aquestes condicions no es compleix, el farciment no és vàlid.
Ús a RSA: el missatge codificat es pot xifrar amb RSA. Ara s'evita la propietat determinista de RSA utilitzant la codificació OAEP perquè la llavor es genera aleatòriament i influeix en tot el missatge codificat.

## Referències

* ↑ Pointcheval, David. OAEP: Optimal Asymmetric Encryption Padding (en anglès). Boston, MA: Springer US, 2011, p. 882–884. DOI 10.1007/978-1-4419-5906-5_150. ISBN 978-1-4419-5906-5.
* ↑ «[https://cseweb.ucsd.edu/~mihir/papers/oaep.pdf Optimal Asymmetric Encryption How to Encrypt with RSA]» (en anglès). [Consulta: 1r maig 2024].
* ↑ «[https://iacr.org/archive/eurocrypt2009/54790389/54790389.pdf On the Security of Padding-Based Encryption Schemes]» (en anglès). [Consulta: 1r maig 2024].
* ↑ «OAEP: Optimal Asymmetric Encryption Padding» (en anglès). [Consulta: 1r maig 2024].