RSASSA-PSS
Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od
verze recenzované 10. ledna 2020; kontroly vyžadují
2 úpravy .
RSASSA- PSS ( schéma podpisu RSA s dodatkem – schéma pravděpodobnostního podpisu ) je asymetrický algoritmus digitálního podpisu . Založeno na principu kódování PSS , který v roce 1996 navrhli Mihir Bellare a Phillip Rogaway [1] . Zavedeno do standardu PKCS # 1 v2.1 z roku 2002, vyvinutého společností RSA Laboratories , USA .
Popis algoritmu
Nechte Alice ( A ) poslat zprávu M Bobovi ( B ) , která ji potvrdí elektronickým podpisem S. B po obdržení zprávy od A musí ověřit podpis (zkontrolovat pravost).
- (n, e) je veřejný klíč a (n, e,d) je odpovídající soukromý klíč A . n je kladné celé číslo délky modBits bitů nebo k bajtů (Například: binární zápis n vyžaduje 1028 znaků, pak modBits = 1028 , k = 129 , protože ).

- emBits = modBits - 1

- zBits = 8emLen - emBits
V tomto článku "vysoký bajt (bit)" odkazuje na úplně první levý bajt (bit). „Nejméně významný bajt (bit)“ odkazuje na poslední pravý bajt (bit).
Také "řetězec" by měl být chápán jako pole, jehož prvky jsou jednotlivé bajty. Tedy "řetězcová reprezentace čísla n " je řetězec N získaný rozdělením binárního zápisu n na bajty. Například:
n = 258 {100000010}
N = [1|2] {00000001|00000010}
V tomto případě je [1] horní bajt a [2] dolní bajt.
Funkce vytváření a ověřování elektronického podpisu jsou popsány níže.
Vytvoření podpisu
RSASSA-PSS-Sign((n, e, d); M)
Vstupní data:
(n, e, d) - soukromý klíč
M - zpráva k podpisu, řetězec
Výstup:
S — podpis, řetězec délky k
Možné chyby:
"zpráva je příliš dlouhá"; "chyba kódování"
Sekvenční řazení:
- PSS kódování:
Aplikujme funkci PSS-Encode (která bude popsána níže) na řetězec M , abychom získali řetězec EM délky x .
EM je taková, že bitová délka celočíselné reprezentace EM nepřesahuje emBits a zBits nejvýznamnějších bitů je 0 .
EM = PSS-Encode(M,emBits)
Všimněte si, že délka EM je (k-1) , pokud je emBits rovnoměrně dělitelný 8 a jinak se rovná k .
Pokud kódování PSS vrátí chybu „příliš dlouhá zpráva“, zobrazí se chybová zpráva a práce se zastaví.
Pokud kódování PSS vrátí chybu „chyba kódování“, zobrazí se chybová zpráva a práce se zastaví.
- Podpis RSA:
- Přiřaďte m celočíselnou reprezentaci řetězce EM .
m = str-to-int (EM)
s = m d mod n
- Představme s jako bajtový řetězec délky k .
S = int-to-str(s, k)
- Výstup S
PSS kódování
PSS-Encode(M, emBits)
Možnosti:
Hash - hash function , vrací bajtový řetězec délky hLen
MGF - funkce generování masky. Převede vstupní bajtový řetězec na řetězec dané délky (podrobně popsáno níže).
sLen je délka soli bajtového řetězce
Vstupní data:
M - zpráva k podpisu, řetězec
emBits je maximální délka v bitech reprezentace celého čísla výstupního řetězce EM , alespoň (8hLen + 8sLen + 9)
Výstup:
EM - kódovaná zpráva, řetězec délky emLen
Možné chyby:
"zpráva je příliš dlouhá"; "chyba kódování"
Sekvenční řazení:
- Pokud je délka M větší než maximální možná délka vstupního řetězce zvolené hashovací funkce ( bajt pro SHA-1 ), vrátí se zpráva „příliš dlouhá zpráva“ a operace je ukončena.

- mHash = Hash(M), řetězec délky hLen .
- Pokud emLen < (hLen + sLen + 2), vrátí se zpráva „chyba kódování“ a práce se zastaví.
- Vygeneruje se náhodná sůl řetězce délky sLen ; pokud sLen = 0 , salt je prázdný řetězec .
- M' = (0x)00 00 00 00 00 00 00 00||mHash||salt , řetězec délky (8 + hLen + sLen), jehož prvních 8 bajtů je nula.
- H = Hash(M') , řetězec délky hLen .
- Vygeneruje se řetězec PS sestávající z (emLen - hLen - sLen - 2) prázdných bajtů. Délka PS může být nulová.
- DB = PS||0x01||sůl , řetězec délky (emLen - hLen - 1) .
- dbMask = MGF(H, emLen - hLen - 1) , řetězec délky (emLen - hLen - 1) .
- maskedDB = DB ⊕ dbMask .
- ZBits horních bitů ve vysokém bajtu maskedDB jsou nastaveny na 0 .
- TF=0xBC .
- EM = maskovanýDB||H||TF
- EM výstup .
Ověření podpisu
RSASSA-PSS-Verify((n, e); M, S)
Vstupní data:
(n, e) - veřejný klíč
M - přijatá zpráva, řetězec
S je podpis, který má být ověřen, řetězec délky k
Výstup:
„podpis je platný“ nebo „podpis je neplatný“
Sekvenční řazení:
- Kontrola délky:
Pokud je délka podpisu S větší než k bajtů, dojde k rozhodnutí „podpis je neplatný“ a práce je ukončena.
- Kontrola RSA:
- Přiřaďte m celočíselnou reprezentaci řetězce S .
m = str-to-int(S)
s = mě mod n
- Představme si m jako bajtový řetězec délky emLen.
EM = int-to-str(m, emLen)
Všimněte si, že emLen je (k-1) , pokud je emBits rovnoměrně dělitelný 8 a jinak se rovná k . Pokud záznam čísla m zabere více než emLen bajtů, dojde k rozhodnutí „podpis je neplatný“ a práce se zastaví.
- Kontrola PSS:
Použijme funkci PSS-Verify (která bude popsána níže). Konečné rozhodnutí je stejné jako rozhodnutí PSS-Verify .
Výstup = PSS-Verify (M, EM, emBits)
Kontrola PSS
PSS-Verify (M, EM, emBits)
Možnosti:
Hash je hashovací funkce, která vrací bajtový řetězec délky hLen.
MGF - funkce generování masky. Převede vstupní bajtový řetězec na řetězec dané délky (podrobně popsáno níže).
sLen je délka řetězce bajtů soli.
Vstupní data:
M — přijatá zpráva, řetězec.
EM - zakódovaná zpráva, řetězec délky emLen .
emBits je maximální délka v bitech celočíselné reprezentace EM řetězce, alespoň (8hLen + 8sLen + 9) .
Výstup:
„podpis je platný“ nebo „podpis je neplatný“
Sekvenční řazení:
- Pokud je délka M větší než maximální možná délka vstupního řetězce vybrané hashovací funkce ( bajtů pro SHA-1), dojde k rozhodnutí o "neplatnosti podpisu" a práce se zastaví.

- mHash = Hash(M) , řetězec délky hLen .
- Pokud emLen < (hLen + sLen + 2) , dojde k rozhodnutí o „neplatnosti podpisu“ a práce se zastaví.
- Pokud se dolní bajt EM (pole TF ) nerovná 0xBC , dojde k rozhodnutí "podpis je neplatný" a práce se zastaví.
- Vyšší ( emLen - hLen - 1) EM bajty jsou zapsány do maskedDB řetězce a následné hLen bajty jsou zapsány do H řetězce .
- Pokud jsou vysoké bity zBits vysokého bajtu maskovanéDB nenulové, pak je učiněno rozhodnutí o "neplatnosti podpisu" a práce je ukončena.
- dbMask = MGF(H, emLen - hLen - 1) , řetězec délky (emLen - hLen - 1) .
- DB = maskedDB ⊕ dbMask .
- ZBits horních bitů ve vysokém bajtu DB jsou nastaveny na 0 .
- Pokud vyšší (emLen - hLen - sLen - 2) bajty DB nejsou rovny 0 nebo pokud následující bajt (byte na pozici (emLen - hLen - sLen - 1) , za předpokladu, že pozice vysokého bajtu je 1 ) se nerovná 0x01 , pak se rozhodne "podpis je neplatný" a práce se zastaví.
- Poslední bajty sLen DB jsou zapsány do řetězce bajtů salt.
- M' = (0x)00 00 00 00 00 00 00 00||mHash||salt , řetězec délky (8 + hLen + sLen) , jehož prvních 8 bajtů je nula.
- H' = Hash(M') , řetězec délky hLen.
- Je-li H = H' , pak je učiněno rozhodnutí "podpis je platný", jinak rozhodnutí "podpis je neplatný".
Funkce generování masky
Pojďme si popsat MGF použitý ve funkcích PSS.
MGF přijímá jako vstup bajtový řetězec libovolné délky a požadovanou délku výstupního řetězce a vytváří bajtový řetězec požadované délky. Délkám vstupních a výstupních řetězců lze uložit omezení, ale obvykle jsou velmi velké. MGF je deterministický; výstupní řetězec je zcela určen vstupním řetězcem. Výstup MGF by měl být pseudonáhodný, to znamená, že při znalosti části výstupního řetězce by mělo být prakticky nemožné předpovědět zbytek výstupního řetězce. Toho lze dosáhnout vytvořením MGF založeného na hashovací funkci se stejnou vlastností. Tato vlastnost je nezbytná, protože se na ní spoléhá důkaz spolehlivosti algoritmu.
Standard PKCS#1 v2.1 navrhuje použít jako MGF následující funkci:
MGF1(M,maskaLen)
Možnosti:
Hash je hashovací funkce, která vrací bajtový řetězec délky hLen.
Vstupní data:
M je řetězec, který se má převést.
maskLen je požadovaná délka výstupního bajtového řetězce, nepřesahuje 2 32 hLen .
Výstup:
mask je řetězec délky maskLen.
Možné chyby:
"Maska je příliš dlouhá"
Sekvenční řazení:
- Pokud maskLen > 2 32 hLen , zobrazí se zpráva „délka masky je příliš velká“ a operace se zastaví.
- Nechť T je prázdný řetězec.
- VE smyčce FOR i OD 0 DO SE PROVÁDÍ:
- Představme i jako C byte řetězec o délce 4 bajtů.
C = int-to-str(i,4)
- M' = M||C .
- Přidejme výsledek hash M' na konec řetězce T.
T = T||Hash(M')
- Zapišme horní maskLen bajty řetězce T do mask .
- Výstup masky .
Možnosti
Ve standardu PKCS#1 v2.1 je RSASSA-PSS přiřazen identifikátor id-RSASSA-PSS , se kterým musí být spojena sekvence čtyř parametrů. Mezi tyto parametry patří hashovací funkce, MGF, délka náhodně generovaného řetězce soli ( sLen ), trailerField ( pole TF ). Výchozí hodnoty těchto parametrů, uvedené v příslušné normě, jsou uvedeny v tabulce.
Parametr |
Typ |
Výchozí hodnota
|
hashAlgorithm |
HashAlgorithm |
sha1
|
maskGenAlgorithm |
MaskGenAlgorithm |
mgf1SHA1
|
sůlDélka |
CELÉ ČÍSLO |
dvacet
|
pole přívěsu |
TrailerField |
trailerFieldBC
|
- Doporučuje se, aby hashovací funkce, na které je založen MGF (pokud existuje), byla stejná jako ta, která je specifikována parametrem hashAlgorithm .
- Výchozí hodnota parametru saltLength je rovna délce výstupního řetězce vybrané hashovací funkce ( hLen ). Na rozdíl od ostatních možností nemusí být saltLength pro daný pár klíčů RSA fixována.
- Pole TF je zavedeno kvůli kompatibilitě s návrhem IEEE P1363a . V uvažovaném standardu je podporována pouze hodnota trailerField rovna 0xBC . Může však mít i jinou formu, například HID||0xCC , kde HID je identifikátor hashovací funkce specifikovaný v normě ISO/IEC 10118.
Funkce
Přípustná délka zprávy pro metodu RSA-PSS je buď neomezená, nebo omezená na velmi vysokou hodnotu kvůli hashovací funkci použité v kódování PSS.
RSA-PSS se liší od jiných schémat digitálního podpisu založených na RSA v tom, že je spíše pravděpodobnostní než deterministický. zahrnuje použití náhodně generované hodnoty ( sůl ). Hodnota soli zvyšuje spolehlivost obvodu
[1] .
Spolehlivost
Za předpokladu, že výpočet libovolného kořenového modulu n je operace, která je neproveditelná a hašovací funkce a MGF mají potřebné vlastnosti, RSA-PSS zajišťuje bezpečnost podpisu. Robustnost je prokazatelná v tom smyslu, že obtížnost rozbití podpisu může přímo souviset s obtížností rozbití kryptografického primitiva (matematický problém, který je základem RSA ). Pravděpodobnost úspěšného praskání a doba běhu nejlepší krakovací metody RSA-PSS jsou velmi blízké stejným parametrům algoritmu pro nalezení inverzní funkce RSA .
Schéma podpisu popsané dříve se liší od původního algoritmu navrženého Mihirem Bellarem a Phillipem Rogawayem [1] . Potřebný důkaz pro toto schéma však poskytuje Jacob Jonsson [2] .
Poznámky
- ↑ 1 2 3 Mihir Bellare, Phillip Rogaway „Přesná bezpečnost digitálních podpisů – Jak podepisovat s RSA a Rabinem“ . Získáno 1. listopadu 2010. Archivováno z originálu 13. června 2010. (neurčitý)
- ↑ Jacob Jonsson „Bezpečnostní důkazy pro schéma podpisu RSA-PSS a jeho varianty“ (PDF) . Získáno 1. listopadu 2010. Archivováno z originálu 6. března 2016. (neurčitý)
Zdroje