home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 March / Chip_2002-03_cd1.bin / obsahy / Chip_txt / txt / 134-136.txt < prev    next >
Text File  |  2002-02-03  |  18KB  |  112 lines

  1.  
  2. BezpeΦnost RSA
  3. RSA v novΘm sv∞tle (4)
  4. Reßlnß hrozba Mangerova ·toku na n∞kterΘ implementace algoritmu RSA volß po jejich revizi. Minule jsme naznaΦili teoretickΘ v²chodisko mo₧nΘ obrany, nynφ si ji ukß₧eme prakticky p°φmo na napadenΘm standardu PKCS#1.
  5.  
  6. Navr₧en² postup obrany mß ochrßnit implementace RSA proti potencißlnφm ·tok∙m vyu₧φvajφcφm postrannφch kanßl∙. Jde o originßlnφ teoretick² v²sledek, kter² mß jednoduchΘ a praktickΘ vyu₧itφ. Zopakujme si struΦn∞ jeho princip: Proti postrannφm kanßl∙m vyu₧φvßme maskovßnφ funkcφ tak, ₧e do nich zavedeme nov² um∞l² parametr, kter² funkci v²znamov∞ neovliv≥uje. Tφm, ₧e tomuto parametru p°i°azujeme nßhodnΘ hodnoty, "zastφnφme" skuteΦnΘ hodnoty v²znamov²ch parametr∙ a "zaÜumφme" tak postrannφ kanßl. ┌toΦnφkovi, kter² by jej cht∞l vyu₧φt, se pak d∞nφ na postrannφm kanßlu jevφ podobn∞ jako nßhodn² proces. 
  7. Tento princip aplikujeme i na nßvratovΘ k≤dy z implementaΦnφch procedur a podprocedur. B∞₧n∞ se vracejφ hodnoty 0 nebo 1 (resp. -1), podle toho, zda v procedu°e doÜlo k chyb∞. Pokud ovÜem chyba nastane v procedurßch p°φmo zpracovßvajφcφch citlivΘ informace (nap°. otev°en² text po odÜifrovßnφ), nenφ vhodnΘ, aby by¥ i jen chybov²m hlßÜenφm ·toΦnφkovi p°es postrannφ kanßl prozrazovaly, co se d∞lo. ZejmΘna u RSA lze toti₧ vhodn²mi "triky" se Üifrov²m textem docφlit zßm∞rn²ch zm∞n v odÜifrovanΘm textu. Tφm se dostßvßme "pod k∙₧i" tΘ privßtnφ operaci odÜifrovßnφ, na kterou jinak nemßme nic, proto₧e neznßme privßtnφ klφΦ. 
  8. Jak jsme ji₧ takΘ ukßzali, jednoduchß chybovß informace o tom, zda v²sledek odÜifrovßnφ obsahuje na nejvyÜÜφm mφst∞ nulu nebo ne, vede k odhalenφ celΘho otev°enΘho textu. (Ostatn∞ je to jen d∙sledek obecnΘho tvrzenφ o individußlnφch bitech RSA, viz [2].) Prßv∞ proto doporuΦujeme maskovat nßvratovΘ k≤dy - mφsto obvyklΘho chybovΘho k≤du 1 (-1) vracφme nßhodnΘ nenulovΘ Φφslo, kterΘ oznaΦujeme RNZ (random nonzero). 
  9. DalÜφ doporuΦenφ shrnujeme v nßsledujφcφch vÜeobecn²ch zßsadßch, kterΘ dßle demonstrujeme p°φmo na standardu PKCS#1. Pokud "revizo°i" k≤d∙ realizujφcφch RSA podle PKCS#1 budou tyto zßsady dodr₧ovat, za°adφ se rozhodn∞ mezi bezpeΦnostnφ smetßnku. Po zkuÜenostech z praxe m∙₧eme toti₧ tak°ka s jistotou prohlßsit, ₧e v∞tÜina implementacφ z∙stane v souΦasnΘm stavu a ₧ßdnΘ opravy se d∞lat nebudou, dokud nedojde k n∞jakΘmu "pr∙Üvihu"... 
  10. P°ipome≥me jeÜt∞, ₧e z hlediska Mangerova ·toku na PKCS#1 mß klφΦov² v²znam procedura RSAES-OAEP-DECRYPT, kterß se volß k odÜifrovßnφ ÜifrovΘho textu c. Ta pak volß dalÜφ procedury I2OSP a EME-OAEP-DECODE, viz prvnφ dφl. Pro naÜe obecnß pravidla lze vÜechny tyto procedury pova₧ovat za dφlΦφ. Uva₧ujme nynφ obecn∞ systΘm, kter² se sklßdß z posloupnosti n∞kolika dφlΦφch v²poΦt∙ (procedur) comp_1(...), comp_2(...), ..., comp_n(...) a formulujme naÜe doporuΦenφ. 
  11.  
  12. Minimßlnφ obecnß pravidla
  13. 1. Nepou₧φvejte p°φkazy stop nebo break. Zdß se to samoz°ejmΘ, ale formßln∞ jsou tyto p°φkazy v PKCS#1 pou₧ity a m∞ly by b²t vylouΦeny. 
  14. 2. Abyste zabrßnili ΦasovΘmu ·toku, posloupnost v²poΦt∙ comp_1(...), comp_2(...),... by se m∞la navenek jevit "spojitß" a "stejnß" i pro r∙znΘ datovΘ vstupy. Z teoretickΘho hlediska je to sice nemo₧nΘ, ale v praxi byste se m∞li tomuto principu co nejvφce p°iblφ₧it, a¥ u₧ tvo°φte n∞jakΘ fyzickΘ za°φzenφ nebo pφÜete program.
  15. 3. Ka₧dß dφlΦφ procedura (comp_X) by m∞la v₧dy vracet standardnφ v²stupy, nap°. chybov² k≤d (error_X), ukazatel na v²stupnφ data (pointer_X) a dΘlku t∞chto dat (length_X). Tyto prom∞nnΘ by m∞ly b²t  pro r∙znΘ datovΘ vstupy v₧dy poΦφtßny pokud mo₧no stejn²m procesem (by¥ to nenφ v₧dy trivißlnφ ·loha). 
  16. 4. DφlΦφ nßvratovΘ k≤dy by m∞ly b²t nulovΘ, jestli₧e vÜe prob∞hlo v po°ßdku, a nßhodnΘ nenulovΘ (RNZ), pokud nastala n∞jakß chyba. P°itom je d∙le₧itΘ zvß₧it, kam za°adit volßnφ procedury pro tvorbu RNZ, aby jejφ pou₧φvßnφ samo o sob∞ nev∞tvilo dφlΦφ proceduru. V n∞kter²ch p°φpadech, nap°φklad v jednoduch²ch smart kartßch, m∙₧e b²t zφskßnφ nßhodnΘ hodnoty obtφ₧nΘ. Pak ji m∙₧eme odvodit p°φmo z n∞jak²ch Φßstφ deÜifrovanΘ zprßvy m - avÜak velmi obez°etn∞, abychom tak nevytvo°ili dalÜφ postrannφ kanßl.
  17. 5. V ka₧dΘm dφlΦφm v²poΦtu lze vyu₧φt v²stupy (pointer_X a length_X pro r∙znß X) z p°edchozφch dφlΦφch v²poΦt∙, ale rad∞ji ne p°edchozφ nßvratovΘ chybovΘ k≤dy error_X. Pravd∞podobn∞ by to toti₧ zp∙sobilo v∞tvenφ ΦitelnΘ na postrannφch kanßlech. Tyto nßvratovΘ k≤dy se vyu₧ijφ a₧ v zßv∞reΦnΘm vyhodnocenφ celΘho v²poΦtu.
  18. 6. Po ukonΦenφ vÜech dφlΦφch v²poΦt∙ vypoΦφtßme zßv∞reΦn² chybov² k≤d jako logick² OR vÜech dφlΦφch chybov²ch k≤d∙ (final_error = error_1 OR error_2 OR ... OR error_n) a podle n∞j teprve rozhodneme, zda v²stupnφ data z poslednφho v²poΦtu jsou platnß. ZlepÜφme tak plynulost v²poΦtu a zabrßnφme datov∞ zßvislΘmu v∞tvenφ.
  19. 7. NßvratovΘ RNZ by m∞ly mφt co nejv∞tÜφ rozsah, nap°. 8- a₧ 32bitovß slova (Φφm "ÜirÜφ", tφm lepÜφ je nßhodnΘ maskovßnφ). Nap°. p°i osmibitovΘm RNZ nßhodn∞ vybφrßme jeden z 255 kanßl∙.
  20. 8. S citliv²mi daty (kam pat°φ zejmΘna vÜechny bity otev°enΘho textu, meziv²sledky procedur comp_X a chybovΘ k≤dy) provßdφme co nejmΘn∞ p°esun∙. Ka₧d² p°esun toti₧ na postrannφch kanßlech (hlavn∞ nap∞¥ov∞-proudov²ch) vyza°uje informaci o p°enßÜen²ch datech. Proto je vhodnΘ vyhradit pro tato data pam∞¥ovΘ oblasti, kam majφ nßsledujφcφ v²poΦetnφ procesy p°φstup. Je-li to nezbytn∞ nutnΘ, pak p°esouvat narßz co nejdelÜφ bitovΘ °et∞zce, co₧ je efektivn∞jÜφ a pomßhß maskovat vyza°ovanou informaci (viz minul² dφl).
  21.  
  22. P°φklad 
  23. Vra¥me se k Mangerovu ·toku. Jako aplikaci uveden²ch princip∙ m∙₧eme z procedury I2OSP vracet (mφsto hlßÜenφ ╚φslo je p°φliÜ velikΘ) chybov² k≤d rovn² p°φmo nejvyÜÜφmu bajtu (X) vstupnφho Φφsla, tj. error_I2OSP = X (kdy₧ X nebude nulov², nastala chyba, co₧ tedy error_I2OSP korektn∞ odrß₧φ; totΘ₧ v p°φpad∞ nuly, kdy chyba nenastala). Tuto hodnotu vÜak (jak jsme doporuΦili) nikam nep°esouvßme, nejlΘpe je zanechat ji po odÜifrovßnφ v n∞jakΘm registru, odkud ji pozd∞ji pou₧ijeme pro operaci zßv∞reΦnΘho vyhodnocenφ platnosti odÜifrovan²ch dat. 
  24. Nastavenφ error_I2OSP = X zajiÜ¥uje kontinußlnφ v²poΦet bez v∞tvenφ i jistou mφru nßhodnosti. Pak je ale nutnΘ poka₧dΘ p°edat zbytek vstupnφho Φφsla k dalÜφmu zpracovßnφ procedurou EME-OAEP-DECODE a nedat p°itom jakkoli najevo, zda jde o smysluplnß data nebo ne (v p°φpad∞, ₧e X nenφ nula, doÜlo k nßhodnΘ chyb∞ na kanßlu nebo k ·toku). Stav zjistφme z jejφho nßvratovΘho k≤du error_DECODE, nebo¥ k detekci platnosti p°edlo₧en²ch dat mß silnΘ nßstroje (viz bod 9 tΘto procedury dßle). Chybov² k≤d celΘ procedury odÜifrovßnφ RSAES-OAEP-DECRYPT se vypoΦφtß jako final_error = error_I2OSP  OR error_DECODE a a₧ podle n∞j se rozhodne, zda v²slednß data jsou platnß.
  25.  
  26. ProΦ nßhodnΘ chybovΘ k≤dy
  27. V²hody RNZ v roli chybov²ch k≤d∙ si ukß₧eme na p°φkladu PKCS#1, v n∞m₧ bychom pro error_I2OSP a error_DECODE pou₧ili jen hodnoty 0 a 1. Nech¥ xk-1 je nejv²znamn∞jÜφ bajt odÜifrovanΘho celΘho Φφsla m (m = cd mod n). Je-li xk-1 nenulovΘ, Üifrov² text je Üpatn², tak₧e error_I2OSP = 1; p°i nulovΘm xk-1 bude error_I2OSP = 0. P°edpoklßdejme, ₧e ·toΦnφk, jen₧ m∙₧e volit ÜifrovΘ texty, nap°φklad vyu₧itφm nap∞¥ov∞-proudovΘ anal²zy, dokß₧e studovat chovßnφ systΘmu v dob∞, kdy je poΦφtßna hodnota final_error = error_I2OSP OR error_DECODE. Mohou nastat pouze tyto p°φpady:
  28. (0 OR 0) - sprßvn² Üifrov² text;
  29. (1 OR 1) - Üpatn² Üifrov² text a xk-1 nenφ nula;
  30. (0 OR 1) - Üpatn² Üifrov² text a xk-1 je nßhodn∞ nula;
  31. (1 OR 0) - v b∞₧nΘm p°φpad∞ skoro vylouΦeno, je-li integritnφ kontrola m v po°ßdku, ale bajt xk-1 je Üpatn∞.
  32. Jestli₧e ·toΦnφk posφlß sprßvn² Üifrov² text, poznßvß chovßnφ systΘmu v prvnφm p°φpad∞ (0 OR 0). Kdy₧ posφlß nßhodn² Üpatn² Üifrov² text, pouΦφ se o chovßnφ systΘmu v druhΘm (1 OR 1) nebo ve t°etφm p°φpad∞ (0 OR 1), p°iΦem₧ pravd∞podobnosti t∞chto jev∙ jsou cca 255/256 a 1/256, tak₧e je snadno odliÜφ. Po tΘto "fßzi uΦenφ" bude tak ·toΦnφk schopen jasn∞ rozliÜit p°φpady, kdy error_final reprezentuje stavy (1 OR 1) nebo (0 OR 1), tedy zjistit error_I2OSP v p°φpad∞, ₧e odesφlß faleÜn² Üifrov² text. To je vÜak p°esn∞ tß₧ informace jako p∙vodnφ chybovΘ hlßÜenφ ╚φslo je p°φliÜ velikΘ. Manger∙v ·tok tu mßme znovu, tentokrßt nap∞¥ov∞-proudovou anal²zou. 
  33. Jak vidφme, musφme se obecn∞ vyhnout situacφm, kdy citlivß prom∞nnß X vstupuje do N-ßrnφch operacφ, v nich₧ zb²vajφcφch N-1 operand∙ je znßmo ·toΦnφkovi. ZejmΘna to platφ pro p°φpad anal²zy spot°eby energie. Nap°φklad musφme vylouΦit operace jako X + const nebo if (X != 0) then atd. Proto doporuΦujeme, aby nejen error_DECODE, ale vÜechny chybovΘ k≤dy pou₧φvaly RNZ, pokud mo₧no p°ipravenΘ u₧ p°ed volßnφm odpovφdajφcφch procedur (comp_X).
  34. KonkrΘtnφ doporuΦenφ pro realizaci vybran²ch dφlΦφch procedur PKCS#1 [3] vidφte v p°ipojen²ch rßmeΦcφch ve form∞ komentß°∙ (K:) tuΦn²m pφsmem v originßlnφm textu. 
  35.  
  36. Shrnutφ
  37. V zßv∞reΦnΘm dφlu miniserißlu v∞novanΘho problematice sprßvnΘho pou₧φvßnφ schΘmatu RSA, kterou po Φase znovu otev°el tzv. Manger∙v ·tok, jsme doporuΦili konkrΘtnφ zßsady pro implementaci tohoto schΘmatu. P°i jejich dodr₧enφ lze oΦekßvat snφ₧enφ rizika zmφn∞nΘho ·toku na minimum. Otßzka sprßvnΘho pou₧φvßnφ RSA vÜak jde daleko za rßmec konkrΘtnφch formßtovacφch metod - v prßci [2] je ukßzßno, ₧e nßchylnost k takov²mto druh∙m ·tok∙ vychßzφ p°φmo ze zßkladnφch vlastnostφ RSA. Formßtovacφ metody mohou tuto nßchylnost vφce Φi mΘn∞ skr²t, ale nikdy ne zcela vylouΦit - to m∙₧e dokßzat teprve preciznφ implementace, kterß bude brßt zv²Üen² ohled na riziko postrannφch kanßl∙. 
  38. Ale Manger∙v ·tok zdaleka nemusφ b²t jedin² - v [2] jsme poukßzali na jin² mo₧n² zp∙sob napadenφ RSAES-OAEP, kter² zde kv∙li omezenΘmu rozsahu Φlßnku uvßdφme pouze jako ilustraΦnφ obrßzek. Je z n∞j z°ejmΘ, ₧e ·toΦφme p°es zcela jinou Φßst otev°enΘho textu ne₧ v p°φpad∞ Mangerova ·toku. Jak plyne z [2], mßme prßvo se domnφvat, ₧e budou existovat implementace, kterΘ informaci o tΘto Φßsti otev°enΘho textu poskytnou a umo₧nφ tak na RSA za·toΦit s cφlem zφskat celou p°enßÜenou informaci. 
  39. Popisem novΘho ·toku nechceme naznaΦit, ₧e by se Üifra RSA nem∞la pou₧φvat. D∙razn∞ vÜak upozor≥ujeme, ₧e jakkoli jsou ·Φinnß protiopat°enφ proti Mangerovu ·toku na mφst∞, bylo by velmi krßtkozrakΘ se domnφvat, ₧e tφm jsou vÜechny problΘmy s postrannφmi kanßly vy°eÜeny. Je to vlastn∞ paradoxnφ - jak je RSA co do svΘho zßkladnφho popisu jednoduchß, tak je nakonec jejφ bezpeΦnß implementace slo₧itß.
  40.  
  41. Vlastimil Klφma | autor@chip.cz
  42. TomßÜ Rosa | autor@chip.cz
  43.  
  44. Literatura
  45. [1] Archiv Φlßnk∙:
  46. http://www.decros.cz/bezpecnost/_kryptografie.html
  47. [2] Nov² ·tok na RSA postrannφm kanßlem a jinΘ souvislosti:
  48. ftp://ftp.decros.cz/pub/Archiv/Publications/2001KlimaRosa_kryptobesidka_2001_CZ.pdf,
  49. ftp://ftp.decros.cz/pub/Archiv/Publications/2001KlimaRosa_kryptobesidka_2001_EN.ppt
  50. [3] PKCS#1 ver. 2.1 draft 2, novΘ a p°ipravovanΘ ·pravy: 
  51. http://www.rsalabs.com/pkcs/pkcs-1/index.html
  52.  
  53.  
  54. RSAES-OAEP-DECRYPT(K, C, P)
  55. Vstup:    
  56. K        p°φjemc∙v privßtnφ klφΦ 
  57. C    p°ijat² Üifrov² text k odÜifrovßnφ, °et∞zec k oktet∙, kde k je dΘlka modulu RSA n v oktetech
  58. P        parametr pro OAEP, °et∞zec, kter² m∙₧e b²t prßzdn²
  59. V²stup: 
  60. M     otev°en² text, °et∞zec o dΘlce nejv²Üe k-2-2hLen, kde hLen je dΘlka v²stupu haÜovacφ funkce pou₧itΘ v EME-OAEP
  61. Chyby:     
  62. "deÜifrovacφ chyba" K: Obecnou zßsadou je, ₧e ka₧dß procedura (X) vracφ chybovou hodnotu error_X ( <0, 255> a eventußln∞ pointer na v²stupnφ data pointer_X a jejich dΘlku length_X. Je-li error_X nula, je vÜe v po°ßdku, jinak nastala n∞jakß chyba a vracenß data jsou chßpßna jako neplatnß. 
  63. Postup:
  64. 1.    Nenφ-li dΘlka ÜifrovΘho textu C k oktet∙, vra¥ "deÜifrovacφ chyba" a skonΦi. K: Tento v²stup ne°φkß ·toΦnφkovi nic novΘho, nebo¥ znß Üifrov² text a modul RSA. Pro Φistotu programovßnφ a kv∙li obecnΘ zßsad∞ "₧ßdnΘ p°eruÜenφ, spojitΘ zpracovßnφ" je lepÜφ tuto kontrolu p°esunout jinam, nap°φklad p°ed volßnφ procedury RSAES-OAEP-DECRYPT.
  65. 2.    Konvertuj °et∞zec C na celΘ Φφslo c pomocφ procedury OS2IP, c = OS2IP(C).
  66. 3.    Pou₧ij deÜifrovacφ transformaci RSADP s privßtnφm klφΦem K na Üifrov² text c, vyjde Φφslo m = RSADP(K, c) = cd mod n. Je-li v²stupem z transformace RSADP chyba typu "Φφselnß reprezentace ÜifrovΘho textu mimo rozsah" (co₧ by nastalo, kdyby c ( n), pak vra¥ "deÜifrovacφ chyba" a skonΦi. K: Kontrolu c ( n je vhodnΘ za°adit p°ed proceduru RSADP nebo RSAES-OAEP-DECRYPT, proto₧e c i n znßme p°edem. 
  67. 4.    Konvertuj Φφselnou reprezentaci zprßvy m na oktetov² °et∞zec EM o dΘlce k-1 oktet∙ pomocφ transformace I2OSP: EM = I2OSP(m, k-1). Je-li jejφm v²stupem "Φφslo je p°φliÜ velkΘ", pak vra¥ "deÜifrovacφ chyba" a skonΦi. K: Toto je klφΦov² bod Mangerova ·toku. Nesmφ zde b²t ₧ßdnΘ p°eruÜenφ. Opravenß procedura I2OSP nevydßvß hlßÜenφ "Φφslo je p°φliÜ velkΘ" , ale vracφ error_I2OSP a ukazatel na data pointer_I2OSP. Data p°edßme do dalÜφho kroku a nßvratov² k≤d error_I2OSP zpracujeme pozd∞ji, i kdyby indikoval nesmyslnß data. 
  68. 5.    Na EM s vyu₧itφm parametru P pou₧ij dek≤dovacφ transformaci EME-OAEP-DECODE k rekonstrukci zprßvy M = EME-OAEP-DECODE(EM, P). Je-li v²stupem dek≤dovacφ transformace "dek≤dovacφ chyba", vra¥ "deÜifrovacφ chyba" a skonΦi. K: TakΘ procedura EME-OAEP-DECODE nov∞ vracφ error_DECODE, pointer_DECODE a length_DECODE a nenφ tu ani p°eruÜenφ, ani chybovß zprßva. 
  69. 6.    V²stup je M. K: Teprve nynφ definujeme celkov² chybov² k≤d error_DECRYPT = error_I2OSP OR error_DECODE, ukazatel na v²stupnφ data pointer_DECRYPT = pointer_DECODE a dΘlku dat length_DECRYPT = length_DECODE. Je-li v²sledn² chybov² k≤d 0, M jsou platnß data, je-li nenulov², v dφlΦφch procedurßch nastala chyba, a proto M  pova₧ujeme za neplatnΘ. 
  70.  
  71.  
  72. I2OSP(x, l) 
  73. Vstup: 
  74. x        nezßpornΘ celΘ Φφslo, kterΘ mß b²t konvertovßno. K: Vstupem je v₧dy celΘ Φφslo o k bajtech, kde k je globßlnφ prom∞nnß, znßmß p°ed volßnφm I2OSP.
  75. l        dΘlka v²slednΘho °et∞zce K: V kontextu PKCS#1 je l  v₧dy rovnΘ k-1.
  76. V²stup:    
  77. X        odpovφdajφcφ °et∞zec l oktet∙
  78. Chyby:    
  79. "celΘ Φφslo je p°φliÜ velkΘ" K: TakovΘ chybovΘ hlßÜenφ tu nesmφ v ₧ßdnΘm p°φpad∞ b²t, nebo¥ je podstatou Mangerova ·toku. Mφsto toho definujeme nßvratov² k≤d podle obecn²ch doporuΦenφ a data v₧dy nechßme zpracovat, i kdyby byla nesmyslnß. 
  80. Postup:
  81. 1.    Je-li x ( 256l, vra¥ "celΘ Φφslo je p°φliÜ velkΘ" a skonΦi. K: Tento krok vynechßme, nebo¥ vytvß°φ postrannφ kanßl. 
  82. 2.    ZapiÜ celΘ Φφslo x jedineΦn²m zp∙sobem jako l-cifernΘ Φφslo v bßzi 256:
  83. x = xl-1 256 l-1 + xl-2 256 l-2 + ... + x1 256 + x0, kde 0 ( xi < 256 (jedna nebo vφce vedoucφch cifer m∙₧e b²t nula, pokud x < 256l-1). K: V kontextu PKCS#1 volßme tuto proceduru tak, ₧e jejφm vstupem je k-bajtovΘ Φφslo a v²stupem (k-1)-bajtov² (oktetov²) °et∞zec. Dßle vyu₧ijeme toho, ₧e pokud je nejlev∞jÜφ bajt vstupu nenulov², nastala chyba. Vstupnφ Φφslo proto vyjßd°φme ve tvaru x = xk-1 256 k-1 + xk-2 256 k-2 + ... + x1 256 + x0  a p°φmo nastavφme error_I2OSP = xk-1 a pointer_I2OSP tak, aby ukazoval na xk-2. Pokud je bajt xk-1 nenulov², definuje (do jistΘ mφry nßhodn²) nenulov² chybov² k≤d, co₧ odpovφdß tomu, ₧e n∞kde nastala chyba. Je-li xk-1 (a tedy i nßvratov² k≤d) nulov², korektn∞ indikuje sprßvn² pr∙b∞h I2OSP. 
  84. 3.    Nech¥ oktet Xi mß Φφselnou hodnotu xl-i pro 1 ( i ( l. Potom v²stupem je °et∞zec X = X1 X2 ... Xl. K: DΘlka vracen²ch dat je v₧dy k-1 a pointer na n∞ je takΘ znßm p°edem; nejd∙le₧it∞jÜφ je tedy nßvratov² k≤d error_I2OSP, viz p°edchozφ krok.
  85.  
  86.  
  87. EME-OAEP-DECODE(EM, P)
  88. Volby:    
  89. Hash    haÜovacφ funkce (hLen oznaΦuje dΘlku jejφho v²stupu v oktetech)
  90.     MGF    funkce generujφcφ masku
  91. Vstup:
  92. EM    zak≤dovanß zprßva, oktetov² °et∞zec dΘlky nejmΘn∞ 2*hLen + 1, jejφ dΘlku v oktetech oznaΦme emLen. K: V kontextu PKCS#1 je emLen v₧dy rovna k-1.
  93. P        k≤dovacφ parametr, oktetov² °et∞zec. K: Ve skuteΦnosti nepot°ebujeme parametr P, ale pHash = Hash(P). Funkci Hash i parametr P znßme p°edem, a proto pHash kv∙li vylouΦenφ ΦasovΘho postrannφho kanßlu poΦφtßme rad∞ji p°ed touto procedurou. 
  94. V²stup:    
  95. M    rekonstruovanß (odk≤dovanß) zprßva, oktetov² °et∞zec dΘlky nejv²Üe emLen-1-2*hLen
  96. Chyby:     
  97. "dek≤dovacφ chyba". K: "dek≤dovacφ chyba" bude nahrazena standardnφmi v²stupy error_DECODE, pointer_DECODE a length_DECODE.
  98. Postup:
  99. 1.    Je-li dΘlka P v∞tÜφ ne₧ vstupnφ limit haÜovacφ funkce (261-1 oktet∙ pro SHA-1), pak vra¥ "dek≤dovacφ chyba" a skonΦi. K: Tuto kontrolu je vhodnΘ (jako opat°enφ proti ΦasovΘmu postrannφmu kanßlu) p°esunout p°ed proceduru RSADP nebo RSAES-OAEP-DECRYPT. Je to mo₧nΘ, proto₧e p°ed volßnφm EME-OAEP-DECODE i RSAES-OAEP-DECRYPT znßme haÜovacφ funkci i dΘlku P. 
  100. 2.    Je-li emLen < 2hLen+1, vra¥ "dek≤dovacφ chyba" a skonΦi. K: Stejn² jako v p°edchozφm kroku.
  101. 3.    Nech¥ maskedSeed je prvnφch hLen oktet∙ EM a nech¥ maskedDB je zb²vajφcφch emLen-hLen oktet∙.
  102. 4.    Nech¥ seedMask = MGF(maskedDB, hLen).
  103. 5.    Nech¥ seed = maskedSeed ? seedMask.
  104. 6.    Nech¥ dbMask = MGF(seed, emLen-hLen).
  105. 7.    Nech¥ DB = maskedDB ? dbMask.
  106. 8.    Nech¥ pHash = Hash(P), °et∞zec hLen oktet∙.
  107. 9.    Rozd∞l DB na °et∞zec pHash' , kter² se sklßdß z prvnφch hLen oktet∙ DB, dßle na (eventußln∞ prßzdn²) °et∞zec PS obsahujφcφ nulovΘ oktety, nßsledujφcφ za pHash', a zprßvu M tak, ₧e DB = pHash' || PS || 01 || M . Jestli₧e v DB nenφ ₧ßdn² oktet 01, kter² odd∞luje PS od M, vra¥ "dek≤dovacφ chyba" a skonΦi. K: Zprßva "dek≤dovacφ chyba" bude op∞t nahrazena standardnφmi error_DECODE, pointer_DECODE a length_DECODE, nebude zde ani ₧ßdn² p°φkaz "stop". P°i ochran∞ proti postrannφm kanßl∙m je takΘ vhodn∞jÜφ sem zßrove≥ p°esunout i kontrolu z bodu 10. Nov∞ tedy, kdy₧ v DB se pHash' nerovnß pHash nebo zde nenφ obsa₧en ₧ßdn² oktet 01, odd∞lujφcφ PS od M, nebo kdy₧ PS neobsahuje samΘ nuly, nastavφme error_DECODE na RNZ, jinak na 0. Hodnoty pointer_DECODE a length_DECODE musφ b²t nastaveny tak, aby p°edchßzely ΦasovΘmu ·toku, jak bylo popsßno v obecnΘ Φßsti v²Üe. 
  108. 10.    Je-li pHash' r∙znß od pHash, vra¥ "dek≤dovacφ chyba" a skonΦi. K: Spojit s bodem 9.
  109. 11.    V²stup je M. K: V²stupem je nynφ error_DECODE, pointer_DECODE a length_DECODE. 
  110.  
  111.  
  112.