Puncte:0

RSA Blind Signatures Secure Implementation

drapel in

Notă: Nu sunt un criptograf

Vreau să verific dacă implementarea mea RSA Blind Signatures este sigură pentru a fi utilizată într-o aplicație în faza de producție și am și câteva întrebări la care aș fi atât de recunoscător să primesc un răspuns.
Am făcut multe cercetări în ultimele zile și am ieșit cu asta:

Etapa emiterii semnăturii

  1. Obțineți cheia publică; exponent $e$, modul $n$
  2. Generați un număr aleatoriu $r$ care este mai mic decât și relativ prim față de modul $n$
  3. Calculați hash-ul jetonului privat $m$
  4. Calculați mesajul orb $ M = h(m).(r^emod$ $n) $
  5. Trimiteți mesajul orb la server care va returna semnătura orbită $S = M^d mod $ $n$, Unde $d$ este exponentul privat
  6. Calculați semnătura neblindată $s = S.r^{-1}$

Dacă am dreptate, se va ajunge cu un token privat $m$ și semnătura sa valabilă $s$

Intrebarea 1: Cum se înmulțește $h(m)$ și $r^emod$ $n$ ? Rezultatul nu va fi mai mare decât $n$ ?
intrebarea 2: Pot folosi orice algoritm hash activat $m$ ca SHA-256?
Întrebarea 3: Serverul nu va hash sau nu va bloca mesajul orb înainte de a-l semna. Este corect și sigur?

Etapa de verificare a semnăturii

  1. Clientul își trimite tokenul privat $m$ și semnătura acesteia $s$
  2. Serverul va verifica semnătura $s^e = h(m)$ $mod$ $n$

Întrebarea 4: Cum se implementează o schemă de umplutură pentru a preveni falsificarea semnăturilor din cauza proprietății homomorfe a RSA?
Întrebarea 5: Este această implementare vulnerabilă la orice atac? Există îmbunătățiri?

fgrieu avatar
drapel ng
Ecuația pentru $M$ este $ M = h(m).(r^emod$ $n) $ în întrebare. Cu o tipografie bună, cred că asta dă $M=h(m)\cdot(r^e\bmod n)$. Dar este corect? Nu este $M=h(m)\cdot r^e\bmod n$ ? Acesta poate fi calculat ca $M=(h(m)\cdot (r^e\bmod n))\bmod n$. De asemenea, sunt destul de sigur că înseamnă $s = S\cdot r^{-1}\bmod n$ unde există $s = S.r^{-1}$, iar tipografia corectă este $S=M^d \bmod n$.
Puncte:2
drapel my

notă: nu sunt criptograf

Vreau să verific dacă implementarea mea RSA Blind Signatures este sigură pentru a fi utilizată într-o aplicație în faza de producție și am, de asemenea, câteva întrebări la care aș fi atât de recunoscător să primesc un răspuns.

Îmi pare rău, dar când aud întrebări de genul acesta, sună astfel:

Nu sunt chirurg, dar vreau să fac o intervenție chirurgicală pe inimă. Am făcut multe cercetări timp de câteva zile și vreau să mă asigur că înțeleg elementele de bază înainte de a începe...

Bine, nu aș face-o acea rău, dar sună oarecum asemănător (și dacă este într-adevăr pentru o „aplicație în faza de producție”, s-ar putea să nu fie chiar atât de departe. Cel puțin, dacă greșești operația pe inimă, vei ști imediat nu a mers...

Cu asta de pe piept, iată câteva răspunsuri:

Întrebarea 1: Cum se înmulțește $h(m)$ și $r^e \bmod n$ ? Rezultatul nu va fi mai mare decât $n$ ?

De fapt, le înmulți modulo $n$.

Întrebarea 2: Pot folosi orice algoritm hash pe m, cum ar fi SHA-256? Întrebarea 4: Cum se implementează o schemă de umplutură pentru a preveni falsificarea semnăturilor din cauza proprietății homomorfe a RSA?

Iau aceste două întrebări împreună pentru că au același răspuns. Ce $h$ trebuie să fie nu SHA-256 direct, ci unul în care efectuați un hash (cum ar fi SHA-256) și apoi completați rezultatul, folosind probabil PKCS 1.5 SSA sau PSS (în funcție de ceea ce se aștepta verificatorul).

Întrebarea 3: Serverul nu va hash sau nu va bloca mesajul orb înainte de a-l semna. Este corect și sigur?

În acest caz, este corect și sigur - dacă serverul ar fi hash sau a completat mesajul, ar încurca lucrurile. Amintiți-vă, ați făcut hashing/padding la pasul 4.

Pe de altă parte (pentru a reveni la comentariile mele inițiale), dacă ai nevoie să pui aceste întrebări, s-ar putea să nu fii pregătit să implementezi asta singur...

Mohamed Waleed avatar
drapel in
Vă mulțumesc pentru răspuns, nu am vrut să implementez acest lucru, deoarece nu sunt criptograf, dar nu am găsit nicio implementare care să fie sigură de utilizat. Așa că am întrebat despre detaliile implementării, apoi voi scrie codul pentru a o efectua.Vreau să mă asigur de un ultim lucru: pentru a verifica dacă o semnătură este completată corect, voi încerca să adaug mesajul original și să verific dacă rezultatele sunt egale (cum ar fi verificarea hash-ului unui mesaj). adică pad(m) = s. Este corect ?

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.