Puncte:3

RSA: Lăsând algoritmul deoparte, cum transformăm un șir într-un int și invers?

drapel cn

Să presupunem că vreau să criptez fișierul simplu.txt. Primul pas este de fapt să transformați conținutul acelui fișier (să spunem că conține doar șirul „Bună ziua”) într-un int. Văd coduri python de genul acesta:

din Crypto.Util.number import bytes_to_long
cu open('plain.txt', 'rb') ca f:
    steag = f.read()

m = bytes_to_long(steagul)

Totuși, nu prea înțeleg ce se întâmplă. În plus, când textul cifrat a fost decodat înapoi în text simplu, dar încă sub formă de număr, nu văd long_to_bytes sau orice pentru a converti numărul în șir. Înțeleg

import binascii
binascii.unhexlify('{:x}'.format(m))

Care arată complet diferit de celălalt cod, dar încă funcționează.Poate cineva să-mi explice aceste procese, astfel încât să înțeleg intrările și ieșirile unui algoritm de codificare și nu doar algoritmul în sine.

kelalaka avatar
drapel in
Bun venit la Cryptography.SE. Aceasta este o problemă de codificare și decodare și este în afara subiectului aici. În plus, o faci greșit. Ar trebui să decodați exact opusul codificării aplicate,
fgrieu avatar
drapel ng
O conversie comună de la octeți la int este [OS2IP în PKCS#1](https://pkcs1.grieu.fr#page=9).Simplificând ușor descrierea, care consideră octeții ca cifre în baza 256 (adică ca numere întregi de la 0 la 255, la fel ca cifrele obișnuite din baza 10 sunt de la 0 la 9), apoi convertește $n$ octeți $X_1,X_2â¦X_n $ (de la primul/stânga la ultimul/dreapta) la întreg $\displaystyle\sum_{1â¤iâ¤n} 256^{n-i}X_i$. Observați că rar este folosit pentru _text_ în afara contextelor CTF. În schimb, este folosită [criptare hibridă](https://en.wikipedia.org/wiki/Hybrid_cryptosystem).
drapel cn
O îmbunătățire a întrebării ar fi eliminarea cuvântului RSA din întrebare. Conținutul real nu are nimic de-a face cu el. Și în practică, RSA nu este aproape niciodată folosit direct pentru a cripta datele, dar este folosită criptarea hibridă.
Maarten Bodewes avatar
drapel in
Am încercat să răspund cum funcționează în mod normal acest gen de lucruri. Dacă vorbiți despre manual RSA, atunci, în general, unul sau mai mulți octeți sunt transformați într-un număr întreg între zero și modul, apoi se aplică exponentiația modulară. Decodarea înseamnă împărțirea textului cifrat în blocuri de aceeași dimensiune cu modulul, decriptare și apoi decodare înapoi. Există prea puține detalii în întrebare pentru a indica mai mult decât atât.
Puncte:7
drapel in

Practic, sunt doi pași în acest sens:

  1. codificați textul în octeți - acest lucru necesită, în general, o codificare de caractere, cum ar fi UTF-8 sau codificare latină;
  2. codifică octeții în număr întreg - asta este parte din operația de criptare în RSA, așa cum este specificat în PKCS#1, și este efectuată folosind o funcție numită OS2IP.

În cazul dvs., textul este, evident, deja codificat ca octeți; fișierele constau, până la urmă, din octeți și deschideți fișierul ca fișier binar (b din steag-ul rb).

OS2IP înseamnă șir de octet la primitivă întreg. Un șir de octet nu este altceva decât o matrice de octeți. Dacă octeții sunt deja în forma corectă, atunci este doar o chestiune de interpretarea octeții ca număr, deoarece computerul gestionează întotdeauna totul ca binar oricum.

Totuși, în RSA bazat pe PKCS#1, OS2IP nu este utilizat direct: mai întâi se aplică o umplutură relevantă pentru securitate. Aceasta ar fi fie umplutura definită PKCS#1 v1.5, fie umplutura OAEP. Adăugarea de umplutură înseamnă că se adaugă o cantitate nu nesemnificativă de suprasarcină înainte ca mesajul să fie aplicat; cantitatea de text simplu este mult mai mică decât modulul RSA.


Acesta este unul dintre motivele pentru care fișierele nu sunt, în general, criptate folosind RSA direct. Celălalt motiv principal este că operațiunile de criptare RSA și în special de decriptare sunt foarte ineficiente în comparație cu de ex. Criptare bazată pe AES. În schimb, folosim un protocol precum PGP care realizează criptarea hibridă. RSA într-un mod de operare securizat are o anumită suprasarcină și un maxim pe operațiune, deci, în general, o cheie simetrică este criptată sau derivată folosind în schimb RSA; această cheie simetrică este apoi utilizată pentru a cripta datele. Cifrurile simetrice, cum ar fi AES, operează direct pe date binare, astfel încât, pe lângă manipularea IV-ului și umplutura, datele pot fi criptate direct fără conversie.

drapel us
Presupun că OS2IP presupune limite de lungime pentru conversia unul câte unul a șirurilor de octeți, deci venind dintr-un flux de octeți în pasul 2., OS2IP este precedat de fragmentarea în pachete, unde dimensiunea pachetului depinde de lungimea cheii și de modul de umplutură.
Maarten Bodewes avatar
drapel in
Nu, OS2IP nu este în general precedat de fragmentarea în pachete; pentru RSA nu folosești modul CBC sau chiar modul ECB, doar criptezi un mesaj de o singură dimensiune. Am adăugat câteva detalii la răspuns.
drapel us
A intelege. De aceea anumite biblioteci, de ex. JCE nici măcar nu reflectă dimensiunea maximă pe care o poți trece la metoda de criptare, pentru că nu ai nevoie de ea.
Maarten Bodewes avatar
drapel in
Meh, oricum JCA nu returnează atât de multe meta informații. Nu sunt sigur de ce este, este destul de ușor să calculezi supraîncărcarea în comparație cu modulul, de ex. doar 11 octeți (pentru securitate minimă) pentru PKCSv1 1.5 și ei bine, [diferă pentru OAEP](https://crypto.stackexchange.com/a/42100/1172).
drapel us
Hopa, vezi două dintre comentariile mele cenzurate. Luați asta ca o confirmare. Da, cel mai simplu mod de a găsi sarcina utilă maximă este să puneți un mesaj cu lungimea modulului și să analizați excepția ridicată, corect conform PKCSv1/OS2IP.
drapel cn
Nu aș recomanda padding PKCS#1 v1.5, din cauza diferitelor atacuri Bleichenbacher (atacul ROBOT este cel mai recent de care știu). Versiunea 1.5 a fost lansată și a fost depreciată (de către versiunea 2.0) tot același an, în 1998, din cauza că această umplutură a fost ruptă în același an. Chiar dacă este încă în uz practic, această umplutură ar trebui să vină de obicei cu un avertisment de genul „nu utilizați niciodată acest lucru, nu pentru criptare, schimb de chei sau semnături”.
drapel us
@tylo OS2IP nu atinge umplutura. În ceea ce privește Bleichenbacher, luați în considerare ideea că unele umpluturi false cu constante în ieșire au fost setate în mod intenționat.
drapel cn
@SamGinrich Nu am sugerat, că a fost. Răspunsul afirmă doar că, conform specificației PKCS#1, se folosește umplutura V1.5. Și după părerea mea, acest lucru ar trebui să vină întotdeauna cu un avertisment de genul „nu folosi asta”. Chiar dacă există un anumit caz de utilizare, căptușeala V1.5 ar fi bine de utilizat - acest lucru ar trebui să fie dovedit, necesitând cunoaștere aprofundată a subiectului și este un potențial de eroare umană. Sfatul cu un risc general minim este să nu utilizați/permiteți deloc această umplutură.
drapel us
@tylo Sunt de acord cu sfatul tău. Există o comunitate preocupată de securitate, unde acest aspect ar trebui să fie prioritatea 1. Aici, în Criptografie, mă aștept la o discuție despre un concept incomplet de algoritm și fără gând bun. Deși, mi se mărturisesc cu detalii despre anumite variante de algoritm, nu m-aș aștepta să iei vreun sfat de la mine, fără a oferi o explicație urmăribilă sau măcar o referire la acestea.
Maarten Bodewes avatar
drapel in
Nu puteți aplica alte moduri de criptare bloc decât ECB la RSA *cu o umplutură securizată* - cel puțin nu fără modificări. Și ar duce întotdeauna la supraîncărcare altfel. Evident, este și mult mai puțin eficient, mai ales în timpul decriptării. Lipsa eficienței și extinderea mesajului sunt mai degrabă dezavantaje obiective decât politice dacă mă întrebați pe mine.
drapel us
Cred că majoritatea utilizatorilor sunt aici pentru a ajuta oamenii și eu sunt unul dintre ei.

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.