Puncte:3

Există o modalitate ușoară de a face manualul RSA suficient de sigur pentru a putea fi folosit în viața reală?

drapel cn

Am scris o implementare RSA brută (de manual) (doar pentru distracție) și mă întreb dacă există o modalitate ușoară de a o face suficient de sigură pentru a putea fi folosită în viața reală (fără a implementa OAEP+ și RSASSA-PSS)? Există algoritmi simpli pentru completarea și generarea de semnături digitale sigure?

kelalaka avatar
drapel in
Și [PKCS1-v1_5 Signature Scheme](https://crypto.stackexchange.com/a/88101/18298) are o dovadă _de la o perspectivă de securitate demonstrabilă RSA PKCS#1 v1.5 poate fi utilizată în siguranță, dacă lungimea de ieșire a hash-ului funcția este aleasă corespunzător_
Brongs Gaming avatar
drapel cn
Mulțumesc pentru răspuns, @kelalaka!
Puncte:7
drapel my

De fapt, umplutura de semnătură RSASSA-PKCS1-v1_5 este destul de simplă și nu are slăbiciuni cunoscute (padding-ul RSAES-PKCS1-v1_5, numit în mod similar, este rupt pentru criptare, dacă nu este implementat într-un mod foarte atent; nu utilizați asta).

Formatul de umplutură este:

00 01 FF FF FF ... FF FF 00 <DER de tip Hash> <Hash>

Unde DER de tip Hash este un șir de octeți care depinde de tipul de hash pe care l-ați folosit și Hash este rezultatul funcției hash. Pentru SHA-256, DER este șirul de octeți:

30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20

Deci, îți iei hash, îl adaugi înainte cu un șir fix și gata.

Dacă vrei să faci lucrurile un pic mai simple, poți omite DER de tip Hash (ceea ce ar însemna că nu ești tocmai PKCS #1.5, dar nu introduce nicio slăbiciune cunoscută.

Brongs Gaming avatar
drapel cn
Multumesc pentru raspuns! Am înțeles corect că RSASSA-PKCS1-v1_5 poate fi folosit doar pentru generarea de semnături digitale?
SAI Peregrinus avatar
drapel si
Da, asta e doar pentru semnături. Criptarea RSA este utilă mai ales ca un bloc pentru alte constructe (de exemplu, criptarea homomorfă). Alternativa simplă ar fi RSA-KEM, care nu este tocmai criptare (schimbă un număr aleatoriu care este folosit pentru a obține o cheie de criptare pentru a fi utilizată cu un AEAD simetric), dar este simplă și sigură.
poncho avatar
drapel my
@BrongsGaming: ei bine, da, totuși întrebarea a fost „Există algoritmi simpli pentru umplutura și generarea de semnături digitale sigure?” - nu ai cerut algoritmi simpli pentru criptare. Pentru asta, cel mai simplu ar putea fi „nu faceți deloc umplutură; în schimb, cereți criptatorului să aleagă o valoare aleatorie între 2 și $n-2$, iar manualul RSA să o cripteze; utilizați numărul aleatoriu original pe care l-ați ales pentru a genera o cheie simetrică și utilizați acea cheie simetrică pentru a cripta mesajul pe care doriți să-l trimiteți.
SAI Peregrinus avatar
drapel si
De notat, RSA-KEM este, în esență, o versiune mai formală a acesteia (specifică modul de utilizare a numărului aleatoriu pentru a genera o cheie simetrică și alți câțiva biți despre format).
Brongs Gaming avatar
drapel cn
Mulțumesc @SAI Peregrinus și @poncho! Scuze că întrebarea mea nu este clară. Sunt un începător în aceste lucruri și engleza nu este limba mea maternă. :)
Brongs Gaming avatar
drapel cn
@poncho, dar cum pot transfera în siguranță acel număr aleatoriu dacă manualul RSA este considerat nesigur?
poncho avatar
drapel my
@BrongsGaming: motivul pentru care manualul RSA este considerat nesigur este a) pentru că este determenistic; atacatorul poate ghici textul simplu și le poate cripta - dacă ghicesc corect, el cunoaște textul simplu și b) proprietățile homomorfe ale RSA; dacă valoarea criptată este un număr neted, adică un produs de numere prime mici, atunci atacatorul poate recupera acel text simplu surprinzător de rapid. Niciuna dintre acestea nu se aplică RSA-KEM (unde alegeți un număr aleatoriu de n biți)
poncho avatar
drapel my
@Gilles: de fapt, RSASSA-PKCS1-v1_5 este un format de semnătură (și nu poate fi folosit pentru criptare, deoarece este determinist). Te gândești la RSAES-PKCS1-v1_5; este slab, cu toate acestea descriu formatul de umplutură RSASSA suficient de detaliat încât să nu existe într-adevăr nicio confuzie
Gilles 'SO- stop being evil' avatar
drapel cn
Ah, scuze, am simplificat prea mult propoziția. Cred că este important să insistăm că numai semnătura PKCS1v1.5 este ok, și nu criptarea PKCS1v1.5.
Puncte:6
drapel in

Există, de asemenea, o schemă de semnătură mai simplă, dar nu binecunoscută pentru RSA;

Are de nefalsificat din punct de vedere existențial sub atacuri adaptive cu mesaje alese în modelul aleator ale oracolului.

Astăzi RSA-FDH este foarte simplu;

  • Semn: $\sigma = Semn(H, m) = (H(m))^d \bmod n$
  • Verifica: $\{0,1\} = Verificați(H, m, \sigma) = [\sigma^e \bmod n \overset{?}= H(m) \bmod n]$

Nu a fost ușor să semnezi atunci din cauza cerinței de dimensiune; haşişul $H$ trebuie să aibă o dimensiune de ieșire egală cu dimensiunea modulului RSA. Acum, alegerea evidentă este eXtendibilă Oieșire Funcțiuni (XOF) ca SHAKE128/SHKE256 de SHA-3.

Solicitați dimensiunea de ieșire de la SHAKE128 (sau SHAKE256) egală cu dimensiunea modulului RSA, hash-o apoi semnați, asta este!


import hashlib
import rsa

(pubkey, privkey) = rsa.newkeys(2048)


FHD = hashlib.shake_128()
FHD.update(b'Mesaj de semnat')
digestFDH = int.from_bytes(FHD.digest(255),byteorder='little')

#doar m^d mod n    
signed = rsa.core.decrypt_int(digestFDH,privkey.d,pubkey.n)

#just m^e mod n
dacă digestFDH == rsa.core.encrypt_int( semnat ,pubkey.e,pubkey.n):
    print("Verificat")
altceva:
    print("!!!Verificarea eșuată. Oprire!!!")

Definiția exactă ca în lucrarea din 1998 (nu între ghilimele)

Algoritmul de semnare și verificare are acces la oracol la o funcție hash $H_{FDH} : \{0, 1\}^â \to \mathbb{Z}^*_N$. Generarea și verificarea semnăturii sunt după cum urmează:

$\operatorname{SignFDH}_{N,d}(M) $
$\quad y \leftarrow H_{FDH}(M)$
$\quad \text{retur }y^d \bmod N$

$\operatorname{VerifyFDH}_{N,e}(M, x)$
$\quad y \leftarrow x^e \bmod N;$ $\quad y' \leftarrow H_{FDH}(M)$
$\quad\text{dacă }y = y' \text{ atunci returnează }1 \text{ else return } 0$

și rețineți că, cel puțin unele dintre elementele $\mathbb{Z}_N^*$ nu poate fi scos de un XOF standard. Modulul nu este o putere exactă de 2, așa că trebuie să ieșiți cu un bit mai puțin decât modulul. Biblioteca pe care am folosit-o pentru implementarea eșantionului folosește octeți pentru dimensiunea de ieșire, deci nu poate acoperi până la 8 biți.

De asemenea, ieșirea total-zero este exclusă!.

Brongs Gaming avatar
drapel cn
Multumesc pentru raspuns! Interesanta idee. Dar unde ați solicitat ca dimensiunea de ieșire de la Shake128 să fie egală cu dimensiunea modulului RSA în acest fragment de cod?
kelalaka avatar
drapel in
`digest(255)` și rețineți că nu pretind că aceasta este o implementare sigură, în special împotriva canalelor laterale, [putine informații](https://crypto.stackexchange.com/q/75408/18298). Poate fi necesar să utilizați unul sigur. Vezi [avertismentul bibliotecii](https://pypi.org/project/rsa/)
Maarten Bodewes avatar
drapel in
Comentariile nu sunt pentru discuții extinse; această conversație despre faptul că mai sus este o semnătură **aproape FDH** a fost [mutată în chat](https://chat.stackexchange.com/rooms/131177/discussion-on-answer-by-kelalaka-is- acolo-o-o modalitate-ușoară-de-a-face-manual-rsa-secur).
Ruggero avatar
drapel kr
Nu sunt cele mai bune limite cele de la „Optimal Security Proofs for Full Domain Hash, Revizitat" de Kakvi și Kiltz?
kelalaka avatar
drapel in
@Ruggero Se pare că am ratat asta. Mulțumesc, voi actualiza după ce citesc mai multe...
Puncte:2
drapel vu

Alte răspunsuri au oferit o imagine de ansamblu bună asupra schemelor de semnătură RSA, care au căptușeli simple care pot fi utilizate în siguranță.

Aș dori să atrag atenția cititorilor asupra schemei de criptare „RSA-KEM” (deoarece această întrebare este etichetată și OAEP) specificată într-un RFC standard-track (care specifică utilizarea sa în CMS mediile Cryptographic Message Syntax).

https://datatracker.ietf.org/doc/html/rfc5990#appendix-A

În esență, este ca o contraparte de criptare a „hash-ului întregului domeniu”, unde materialul cheie criptat de algoritmul RSA este „domeniu complet”, adică este o valoare aleasă, uniform aleatorie, în intervalul de $[0,N)$ Unde $N$ este modulul public.

Apoi, folosește o funcție de derivare a cheii pentru a obține o cheie, care este apoi utilizată într-o criptare de ambalare a cheii.

Brongs Gaming avatar
drapel cn
Multumesc pentru raspuns!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.