RSASSA-PSS
Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från
versionen som granskades den 10 januari 2020; kontroller kräver
2 redigeringar .
RSASSA - PSS ( RSA signatursystem med bilaga - P robabilistiskt signatursystem ) är en asymmetrisk digital signaturalgoritm . Baserat på PSS- kodningsprincipen som föreslogs 1996 av Mihir Bellare och Phillip Rogaway [1] . Infört i PKCS # 1 v2.1- standarden från 2002, utvecklad av RSA Laboratories , USA .
Beskrivning av algoritmen
Låt Alice ( A ) vilja skicka ett meddelande M till Bob ( B ) som intygar det med en elektronisk signatur S . B , efter att ha fått ett meddelande från A , måste verifiera signaturen (kontrollera äktheten).
- (n, e) är den publika nyckeln och (n, e , d) är den motsvarande privata nyckeln för A. n är ett positivt heltal av längden modBits-bitar eller k byte (till exempel: binär notation av n kräver 1028 tecken, sedan modBits = 1028 , k = 129 , sedan ).
- emBits = modBits - 1
- zBits = 8emLen - emBits
I den här artikeln hänvisar "hög byte (bit)" till den allra första, vänstra byten (biten). Den "minst signifikanta byten (biten)" hänvisar till den sista högra byten (biten).
En "sträng" ska också förstås som en array, vars element är enkla byte. Således är "strängrepresentationen av talet n " strängen N som erhålls genom att dela upp den binära notationen n i byte. Till exempel:
n = 258 {100000010}
N = [1|2] {00000001|00000010}
I det här fallet är [1] den höga byten och [2] den låga byten.
Funktionerna för att skapa och verifiera en elektronisk signatur beskrivs nedan.
Skapa en signatur
RSASSA-PSS-Sign((n, e, d), M)
Indata:
(n, e, d) - privat nyckel
M - meddelande som ska signeras, sträng
Produktion:
S — signatur, sträng med längden k
Möjliga misstag:
"meddelandet är för långt"; "kodningsfel"
Sekvensering:
- PSS-kodning:
Låt oss tillämpa PSS-Encode- funktionen (som kommer att beskrivas nedan) på strängen M för att få strängen EM med längden x .
EM är sådan att bitlängden för heltalsrepresentationen av EM inte överstiger emBits , och zBits för de mest signifikanta bitarna är 0 .
EM = PSS-Encode(M,emBits)
Observera att längden på EM är (k-1) om emBits är jämnt delbart med 8 och lika med k annars.
Om PSS-kodning returnerar ett "meddelande för långt"-fel, visas ett felmeddelande och arbetet stannar.
Om PSS-kodning returnerar ett "kodningsfel"-fel, visas ett felmeddelande och arbetet stannar.
- RSA-signatur:
- Tilldela m en heltalsrepresentation av strängen EM .
m = str-to-int(EM)
s = m d mod n
- Låt oss representera s som en bytesträng med längden k .
S = int-till-str(s, k)
- Utgång S
PSS-kodning
PSS-kodning (M, emBits)
Alternativ:
Hash -
hash-funktion , returnerar en bytesträng med längden hLen
MGF - maskgenereringsfunktion. Konverterar en indatabytesträng till en sträng med den givna längden (beskrivs i detalj nedan).
sLen är längden på bytesträngsaltet
Indata:
M - meddelande som ska signeras, sträng
emBits är den maximala längden i bitar av heltalsrepresentationen av utmatningssträngen EM , åtminstone (8hLen + 8sLen + 9)
Produktion:
EM - kodat meddelande, emLen-längdsträng
Möjliga misstag:
"meddelandet är för långt"; "kodningsfel"
Sekvensering:
- Om längden på M är större än den maximalt möjliga längden på inmatningssträngen för den valda hashfunktionen ( byte för SHA-1 ), returneras meddelandet "meddelande för långt" och operationen avslutas.
- mHash = Hash(M), sträng med längden hLen .
- Om emLen < (hLen + sLen + 2), returneras ett "kodningsfel"-meddelande och arbetet stannar.
- Ett slumpmässigt strängsalt med längden sLen genereras ; om sLen = 0 är salt en tom sträng .
- M' = (0x)00 00 00 00 00 00 00 00||mHash||salt , en sträng med längd (8 + hLen + sLen), vars första 8 byte är noll.
- H = Hash(M') , sträng med längden hLen .
- En PS - sträng genereras bestående av (emLen - hLen - sLen - 2) nollbyte. PS- längden kan vara noll.
- DB = PS||0x01||salt , längdsträng (emLen - hLen - 1) .
- dbMask = MGF(H, emLen - hLen - 1) , längdsträng (emLen - hLen - 1) .
- maskedDB = DB ⊕ dbMask .
- ZBits för de höga bitarna i den höga byten av maskedDB är satt till 0 .
- TF=0xBC .
- EM = maskedDB||H||TF
- EM -utgång .
Signaturverifiering
RSASSA-PSS-Verifiera((n, e), M, S)
Indata:
(n, e) - offentlig nyckel
M - mottaget meddelande, sträng
S är signaturen som ska verifieras, en sträng med längden k
Produktion:
"signaturen är giltig" eller "signaturen är ogiltig"
Sekvensering:
- Längdkontroll:
Om längden på signaturen S är mer än k byte, fattas beslutet "signaturen är ogiltig", och arbetet avslutas.
- RSA-kontroll:
- Tilldela m en heltalsrepresentation av strängen S .
m = str-till-int(S)
- Vi använder den publika nyckeln.
s = mig mod n
- Låt oss representera m som en bytesträng med längden emLen.
EM = int-till-str(m, emLen)
Observera att emLen är (k-1) om emBits är jämnt delbart med 8 och lika med k annars. Om posten med numret m tar mer än emLen-byte, fattas beslutet "signaturen är ogiltig", och arbetet stannar.
- PSS-kontroll:
Låt oss använda PSS-Verify- funktionen (som kommer att beskrivas nedan). Det slutliga beslutet är detsamma som det beslut som PSS-Verify tog .
Output = PSS-Verify(M, EM, eBits)
PSS check
PSS-Verifiera(M, EM, eBits)
Alternativ:
Hash är en hashfunktion som returnerar en bytesträng med längden hLen.
MGF - maskgenereringsfunktion. Konverterar en indatabytesträng till en sträng med den givna längden (beskrivs i detalj nedan).
sLen är längden på saltbytesträngen.
Indata:
M — mottaget meddelande, sträng.
EM -kodat meddelande, sträng med längd emLen .
emBits är den maximala längden i bitar av en heltalsrepresentation av en EM-sträng, åtminstone (8hLen + 8sLen + 9) .
Produktion:
"signaturen är giltig" eller "signaturen är ogiltig"
Sekvensering:
- Om längden M är större än den maximalt möjliga längden på inmatningssträngen för den valda hashfunktionen ( byte för SHA-1), fattas ett "signatur ogiltig" beslut och arbetet stannar.
- mHash = Hash(M) , en sträng med längden hLen .
- Om emLen < (hLen + sLen + 2) , fattas ett "signatur ogiltig" beslut och arbetet stannar.
- Om den låga byten EM (fältet TF ) inte är lika med 0xBC , fattas beslutet "signaturen är ogiltig" och arbetet stoppas.
- Högre ( emLen - hLen - 1) EM - byte skrivs till den maskeradeDB- strängen och efterföljande hLen- byte skrivs till H - strängen .
- Om de höga zBits- bitarna i den höga byten av maskedDB är icke-noll, så fattas ett "signatur ogiltig"-beslut och arbetet avslutas.
- dbMask = MGF(H, emLen - hLen - 1) , längdsträng (emLen - hLen - 1) .
- DB = maskedDB ⊕ dbMask .
- ZBits för de höga bitarna i den höga byten i DB är satta till 0 .
- Om de högre (emLen - hLen - sLen - 2) byten i DB :n inte är lika med 0 eller om den efterföljande byten (byten vid position (emLen - hLen - sLen - 1) , om man antar positionen för den höga byten är 1 ) är inte lika med 0x01 , då fattas ett beslut "signaturen är ogiltig" och arbetet stoppas.
- De sista sLen-bytena i DB:n skrivs till saltbytesträngen.
- M' = (0x)00 00 00 00 00 00 00 00||mHash||salt , en sträng med längd (8 + hLen + sLen) , vars första 8 byte är noll.
- H' = Hash(M') , en sträng med längden hLen.
- Om H = H' , så fattas beslutet "signaturen är giltig", annars fattas beslutet "signaturen är ogiltig".
Maskgenereringsfunktion
Låt oss beskriva MGF som används i PSS-funktionerna.
MGF accepterar en bytesträng av godtycklig längd och en önskad längd på utmatningssträngen som inmatning, och producerar en bytesträng med önskad längd. Begränsningar kan införas på längden på ingångs- och utgångssträngarna, men de är vanligtvis mycket stora. MGF är deterministisk; utgångssträngen bestäms helt av ingångssträngen. Utsignalen från MGF bör vara pseudo-slumpmässig, det vill säga, om man känner till en del av utmatningssträngen, bör det vara praktiskt taget omöjligt att förutsäga resten av utmatningssträngen. Detta kan uppnås genom att göra MGF baserad på en hashfunktion med samma egenskap. Denna egenskap är nödvändig, eftersom beviset på algoritmens tillförlitlighet är beroende av den.
Standarden PKCS#1 v2.1 föreslår att följande funktion ska användas som MGF:
MGF1(M,maskLen)
Alternativ:
Hash är en hashfunktion som returnerar en bytesträng med längden hLen.
Indata:
M är strängen som ska konverteras.
maskLen är den erforderliga längden på utdatabytesträngen, överstiger inte 2 32 hLen .
Produktion:
mask är en sträng av längd maskLen.
Möjliga misstag:
"Masken är för lång"
Sekvensering:
- Om maskLen > 2 32 hLen visas meddelandet "masklängden är för stor" och operationen stoppas.
- Låt T vara en tom sträng.
- I slingan FÖR i FRÅN 0 TILL UTFÖRS:
- Låt oss representera i som en C -bytesträng med längden 4 byte.
C = int-till-str(i,4)
- M' = M||C .
- Låt oss lägga till hashresultatet M' i slutet av strängen T.
T = T||Hash(M')
- Låt oss skriva den övre maskenLen byte av sträng T till mask .
- Utgången av mask .
Alternativ
I PKCS#1 v2.1 -standarden ges RSASSA-PSS identifieraren id-RSASSA-PSS , med vilken en sekvens av fyra parametrar måste associeras. Dessa parametrar inkluderar hash-funktionen, MGF, längden på den slumpmässigt genererade saltsträngen ( sLen ), trailerField ( TF -fält ). Standardvärdena för dessa parametrar, angivna i standarden i fråga, anges i tabellen.
Parameter |
Sorts |
Standardvärde
|
hashAlgorithm |
HashAlgorithm |
sha1
|
maskGenAlgorithm |
MaskGenAlgorithm |
mgf1SHA1
|
saltLängd |
HELTAL |
tjugo
|
trailerField |
TrailerField |
trailerFieldBC
|
- Det rekommenderas att hashfunktionen som MGF är baserad på (om någon) är densamma som den som anges av parametern hashAlgorithm .
- Standardvärdet för parametern saltLength är lika med längden på utgångssträngen för den valda hashfunktionen ( hLen ). Till skillnad från de andra alternativen behöver saltLength inte fixas för ett givet RSA- nyckelpar.
- TF - fältet introduceras för kompatibilitet med IEEE-utkastet P1363a . I den övervägda standarden stöds endast trailerField- värde lika med 0xBC . Det kan dock också ha en annan form, såsom HID||0xCC , där HID är en hashfunktionsidentifierare som specificeras i ISO/IEC 10118-standarden.
Funktioner
Den tillåtna meddelandelängden för RSA-PSS-metoden är antingen obegränsad eller begränsad till ett mycket stort värde på grund av hashfunktionen som används i PSS-kodningen.
RSA-PSS skiljer sig från andra RSA-baserade digitala signatursystem genom att det är probabilistiskt snarare än deterministiskt. innebär att man använder ett slumpmässigt genererat värde ( salt ). Värdet på salt ökar kretsens tillförlitlighet
[1] .
Tillförlitlighet
Om man antar att beräkning av en godtycklig rotmodul är en operation som är ogenomförbar, och att hashfunktionen och MGF har de nödvändiga egenskaperna, säkerställer RSA-PSS signaturens säkerhet. Robusthet är bevisbar i den meningen att svårigheten att bryta en signatur kan vara direkt relaterad till svårigheten att bryta en kryptografisk primitiv (det matematiska problemet som ligger bakom RSA ). Sannolikheten för framgångsrik sprickning och körtiden för den bästa krackningsmetoden RSA-PSS är mycket nära samma parametrar för algoritmen för att hitta den inversa funktionen av RSA .
Signaturschemat som beskrivits tidigare skiljer sig från den ursprungliga algoritmen som föreslagits av Mihir Bellare och Phillip Rogaway [1] . Det nödvändiga beviset för detta schema tillhandahålls dock av Jacob Jonsson [2] .
Anteckningar
- ↑ 1 2 3 Mihir Bellare, Phillip Rogaway "Den exakta säkerheten för digitala signaturer - hur man signerar med RSA och Rabin" . Hämtad 1 november 2010. Arkiverad från originalet 13 juni 2010. (obestämd)
- ↑ Jacob Jonsson "Säkerhetsbevis för RSA-PSS-signaturschemat och dess varianter" (PDF) . Hämtad 1 november 2010. Arkiverad från originalet 6 mars 2016. (obestämd)
Källor