Qual è il modo più sicuro per capire se la decrittografia ha avuto successo?

4

Sto facendo un programma C che usa GTK3 (la migliore documentazione di sempre) e OpenSSL (la peggiore documentazione di sempre) per semplicemente crittografare / decifrare un file usando una password. Le funzioni di crittografia e decrittografia funzionano entrambe, tuttavia se inserisco la password errata nella fase di decodifica, il file diventa corrotto (ovviamente). Quindi ho bisogno di un modo per il decryptor di rilevare se il lavoro ha avuto successo. Ecco le mie soluzioni finora:

  • DOPO la crittografia, anteporre una somma di controllo (sha1 / sha256) dei dati originali al file. Quindi il decryptor può validare il checksum originale e decifrare il checksum dei dati.

  • PRIMA di crittografare, anteporre un valore costante (ad es. "CHECK STRING") al file, e se il decrittore vede che il valore costante è stato decrittografato con successo, può presumere che sia anche l'intero file.

Il checksum non crittografato può essere sottoposto ad analisi incrociata con i dati crittografati al fine di accelerare una forza bruta?

Il valore costante crittografato, il cui valore non crittografato è noto all'attore , rivela all'utente malintenzionato un numero limitato di password in grado di crittografare la costante in questo modo?

Spero che abbia senso, odio essere esoterico.

    
posta Sanchke Dellowar 30.11.2016 - 02:55
fonte

5 risposte

4

Raccomando di utilizzare crittografia autenticata . Il suo scopo principale è che un utente malintenzionato che manipola il testo cifrato non può modificare il messaggio senza essere rilevato. Ma rifiuterà anche chiavi errate.

Puoi:

  • Utilizza un algoritmo di crittografia autenticato esistente, come AES-GCM, AES-CCM o XSalsa20Poly1305.
  • Costruisci uno dalla crittografia e un MAC utilizzando encrypt-then-MAC costruzione.

    Un MAC è simile a un hash, ma con chiave. Puoi calcolarne l'output solo se conosci la chiave.

Altre costruzioni, come quelle menzionate nella domanda, non sono sicure se combinate con algoritmi di crittografia comuni come AES in modalità CBC. Il punto debole più noto è il riempimento dell'attacco oracle contro la modalità CBC non autenticata, ma simili attacchi si applicano a molte di queste costruzioni ad-hoc.

Se lo desideri, puoi memorizzare un valore derivato dalla chiave principale (ad esempio utilizzando HKDF) nell'intestazione. Ciò può aiutare a distinguere tra una chiave errata e un file corrotto / troncato.

    
risposta data 30.11.2016 - 09:23
fonte
1

Penso che il tuo approccio di accodamento o preposizione del checksum sarebbe un approccio più solido rispetto all'utilizzo di una stringa di controllo magico.

Motivo: non è possibile essere completamente sicuri che una sequenza di immondizia generata da decryptor quando si utilizza una password errata non contenga la stringa magica. Anche se la probabilità potrebbe essere bassa. È possibile che si esaurisca la fortuna.

    
risposta data 30.11.2016 - 07:39
fonte
0

Un modo semplice per essere sicuro di crittografare in questo modo.

  • crea un hash per il file,
  • aggiungi l'hash al file e crittografa questa somma.

On decrypt:

  • dopo la decrittografia ha sversato l'hash aggiunto,
  • ricrea l'hash per il file reale e vedi se è uguale a quello decrittografato.

Dato che aggiungi un hash non aggiungerai ulteriori informazioni per un attacco di forza bruta. Un hash però permetterà di essere quasi (!) Sicuro al 100% che la decrittazione è ok.

    
risposta data 30.11.2016 - 10:09
fonte
-2

Direi che qualsiasi file di input deve essere verificato e non può essere considerato attendibile. Ad esempio se si dispone di un file di input che dovrebbe essere un file JPEG, qualcosa nel codice deve controllarlo e trasformarlo in un'immagine in modo sicuro o fallire in sicurezza, senza alcun attacco possibile per mettere in errore alcuni dati inattesi.

Se lo fai, allora non c'è bisogno di controllare se il file è stato correttamente decrittografato - il risultato della decrittografia sarebbe un file che dovrebbe essere un file JPEG in questo esempio, e molto probabilmente non lo è se il la password era sbagliata Se controlli correttamente il contenuto del file, scoprirai che non può essere trasformato in un'immagine, e questo è tutto ciò che devi sapere.

    
risposta data 30.11.2016 - 10:14
fonte
-6

Piuttosto che cercare di verificare la decrittazione. Perché non passare il file a qualcosa che può leggerlo. vale a dire un'API o un'applicazione. Se fallisce la decodifica, il software non sarà in grado di leggerlo e dovrebbe generare un errore.

    
risposta data 30.11.2016 - 03:24
fonte

Leggi altre domande sui tag