Puncte:0

Octeți suplimentari când decriptați cu OpenSSL

drapel fr

Șirul este criptat cu următoarele proprietăți (folosind C#):

myAes.Mode = CipherMode.CBC

myAes.KeySize = 128

myAes.Padding = PaddingMode.PKCS7

myAes.BlockSize = 128

myAes.FeedbackSize = 128

Cheie: 5753B8AA97BE5B5D9584864DF3134E64

Aceasta este funcția mea de decriptare:

int AESdecrypt(unsigned char *ciphertext, size_t ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext)
  {
    EVP_CIPHER_CTX *ctx;

    int len;
      int reErori=1;

    int plaintext_len;

    /* Creați și inițializați contextul */
    dacă(!(ctx = EVP_CIPHER_CTX_new()))
    {
        LOGF_TRACE("\t Eroare în EVP_CIPHER_CTX_new");
        EVP_CIPHER_CTX_free(ctx);
        întoarce 0;
    }

    /*
     * Inițializați operația de decriptare. IMPORTANT - asigurați-vă că utilizați o cheie
     * și dimensiunea IV adecvată pentru cifra dvs
     * În acest exemplu, folosim AES de 256 de biți (adică o cheie de 256 de biți). The
     * Mărimea IV pentru *majoritatea* modurilor este aceeași cu dimensiunea blocului. Pentru AES asta
     * este de 128 de biți
     */
    if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, cheie, iv))
    {
      LOGF_TRACE("\t Eroare în EVP_DecryptInit_ex");
      EVP_CIPHER_CTX_free(ctx);
      întoarce 0;
    }

    /*
     * Furnizați mesajul de decriptat și obțineți rezultatul text simplu.
     * EVP_DecryptUpdate poate fi apelat de mai multe ori dacă este necesar.
     */
    if(1 != EVP_DecryptUpdate(ctx, text simplu, &len, text cifrat, text_cifrat_len))
    {
      LOGF_TRACE("\t EVP_DecryptUpdate");
      EVP_CIPHER_CTX_free(ctx);
      întoarce 0;
    }
        
    plaintext_len = len;

    /*
     * Finalizați decriptarea. Alți octeți de text simplu pot fi scrieți la
     * această etapă.
     */
    if(1 != EVP_DecryptFinal_ex(ctx, text simplu + len, &len))
    {
      LOGF_TRACE("\t EVP_DecryptFinal_ex");
      EVP_CIPHER_CTX_free(ctx);
      întoarce 0;
    }
        
    text_len += len;

    /* Curăță */
    EVP_CIPHER_CTX_free(ctx);

    return text_len;
  }

Cu toate acestea, când încerc să decriptez șirul rezultat are 16 (0x10) octeți suplimentari: (S-au eliminat unele caractere din motive de securitate).

0000 - 2e 3c 81 6b ed 2e 6b 59-fe 38 ae b7 56 11 1f c2 .<.k..kY.8..V...

0010 - 45 53 54 41 20 45 53 20-55 4e 41 20 50 52 55 45 ESTA ES UNA PRUE

0020 - 42 41 20 44 45 20 43 49-46 52 41 44 4f 20 41 45 BA DE CIFRADO AE

0030 - 53 20 50 41 52 41 20 45-54 48 45 52 4e 45 54 20 S PARA ETHERNET

0040 - XX XX XX XX XX XX XX XX-XX XX XX XXXXXXXX

Aș dori să știu dacă acest lucru este normal și ar trebui să șterg primii 16 octeți sau cum să evit să am acești octeți suplimentari (nu mi se pare normal).

Ar putea avea vreo legătură cu IV-ul pe care îl folosesc pentru criptare?

Mulțumiri.

Puncte:3
drapel my

Din simptomele dumneavoastră, se pare că IV-ul este inclus cu textul cifrat (ca primii 16 octeți); îl lași pornit când apelezi AESdecrypt.

Dacă da, atunci aveți două opțiuni:

  • Extrageți primii 16 octeți din textul cifrat; treceți cei 16 octeți ca IV, iar restul (adică cu primii 16 octeți eliminați) ca text cifrat

  • Faceți ceea ce faceți și tăiați primii 16 octeți ai textului simplu decriptat.

BTW: cu modul CBC, este, în general, o idee bună să includeți un fel de cod de autentificare a mesajelor (fie el CMAC, HMAC sau altceva), care să se asigure că cineva nu poate modifica textul cifrat fără a fi detectat (cum ar fi un atacator altfel). capabil să modifice textul cifrat și să aibă un anumit control asupra modului în care acesta modifică decriptarea). Faci ceva pentru a te proteja de asta?

David Merinos avatar
drapel fr
Ar fi rezolvat dacă textul cifrat este generat cu și IV de 16 zerouri? Pentru că folosesc un IV de 16 zerouri pentru decriptare. Despre autentificare, încă lucrăm la ea.
David Merinos avatar
drapel fr
De asemenea, putem fi siguri că OpenSSL folosește PKCS#7 pentru decriptare ca implicit?
poncho avatar
drapel my
@DavidMerinos: un IV din toate 0-urile este bine dacă acesta este singurul mesaj care va fi criptat cu această cheie; dacă reutilizați cheia pentru a cripta mai multe mesaje (ceea ce este de obicei, dar nu întotdeauna, cazul), ar trebui să selectați un IV imprevizibil pentru fiecare.
David Merinos avatar
drapel fr
Interesant. Dar ar rezolva asta problema celor 16 octeți suplimentari?
poncho avatar
drapel my
@DavidMerinos: pentru problema suplimentară de 16 octeți, vedeți răspunsul; comentariul meu a fost în special despre ideea de a folosi un all-0’s IV (funcționează dacă criptezi un singur mesaj; nu atât de bine dacă criptezi mai multe mesaje cu aceeași cheie)
poncho avatar
drapel my
@DavidMerinos: BTW: sunteți sigur că problema este de 16 octeți suplimentari în față, mai degrabă decât primii 16 octeți decriptați ca farfurie (și restul sunt în regulă) - acesta din urmă indică faptul că ați greșit IV-ul (și totul a fost corect)
David Merinos avatar
drapel fr
Ei bine, știu că mesajul decriptat este: „ESTA ES UNA PRUEBA DE CIFRADO AES PARA ETHERNET XXXXXXXX” Nu primesc niciun IV din partea de criptare; ceea ce fac este să setez IV ca o matrice de 16 zerouri. Voi încerca să extrag primii 16 octeți. Înseamnă asta că trebuie să-l decupez înainte de a încerca decriptarea?
dave_thompson_085 avatar
drapel cn
@DavidMerinos: da, OpenSSL _EVP pentru modurile de blocare_ folosește implicit padding-ul numit fie PKCS5, fie PKCS7, în funcție de momentul în care a fost făcută denumirea. Dacă nu ar fi făcut-o, ați fi adăugat gunoi sau valori corecte eliminate la _sfârșitul_ textului simplu. Alte părți ale OpenSSL sunt diferite.
David Merinos avatar
drapel fr
Astăzi am făcut un test în care criptez același mesaj folosind IV de zerouri, apoi îl decriptez cu același IV și nu primesc octeți suplimentari, așa că putem concluziona că problema este că.

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.