La sicurezza non riesce in chiave privata e xor

-1

Ho implementato un programma molto breve per crittografare un file e inviarlo su un server remoto. Innanzitutto, costruisco una chiave basata su una passphrase e un sottoinsieme di numeri primi (la lunghezza della chiave è definita dall'utente, 100 KB per impostazione predefinita). La crittografia è costituita da un semplice XOR dai byte sorgente e dai "byte modulati" della chiave, ad es .: s ^ k . Viene inviato anche un indice dei file, criptato.

Se la chiave privata e la pass-frase privata non vengono mai inviate al server, è possibile decodificare file, tipo di file o nomi?

Questo è il codice della crittografia quando è stata generata la chiave.

while (!feof(fp_src))
{
    v = fgetc(fp_src) ;
    if (v == EOF) { break ; } // Success : end of process.

    // Loop on key content :
    p = fgetc(fp_key) ;
    if (p == EOF) {
        fseek(fp_key, 0, SEEK_SET) ;
        p = fgetc(fp_key) ;
        if (p == EOF) { break ; }
    }

    o = v ^ p ;
    fputc(o, fp_out) ;

    show_progress(src_len, proc_idx) ;
    proc_idx++ ;
}

Grazie mille.

    
posta Etsig 21.05.2016 - 00:36
fonte

2 risposte

0

Ok, quindi stai facendo un one time pad - ma in realtà è un pad multi-time perché la chiave è finita (< 100kb) e deriva da una passphrase.

Breaking (aka cryptanalysing) questo sarebbe divertente! Ecco alcune cose che vorrei iniziare con:

  1. Dici che la chiave è derivata da una passphrase. Non ci dici come nella tua domanda, ma se avessi accesso al tuo binario, potrei invertire la progettazione per capirlo. Da lì posso provare un dizionario di passphrase comuni fino a quando ottengo un testo cifrato che corrisponde - quindi so qual è la tua chiave (questa è una forma di selected-plaintext attack ).

  2. Analisi di frequenza: poiché so che stai ripetendo la chiave XORing di ogni byte del tasto più volte (e presumibilmente partendo sempre dal primo byte del tasto per un nuovo massaggio), posso contare quante volte ogni byte di chiave produce ogni carattere di testo cifrato. Il carattere più comune di testo cifrato (per ogni byte di chiave) deve essere associato alla lettera "e", che consentirà di calcolare l'intera chiave. Non conoscere la lunghezza della chiave rende questo più difficile, ma certamente non impossibile.

Come hanno detto @Aurora e @LukePark, la frase "non tirare il tuo" esiste per una ragione. Se stai facendo questo per il tuo apprendimento e non hai mai intenzione di usarlo, allora puoi farlo, ma altrimenti usa PBKDF2 per ricavare la chiave da una passphrase, e per favore usa AES per la crittografia.

    
risposta data 21.05.2016 - 07:18
fonte
1

Sì. È relativamente banale rompere questo codice senza che la chiave o la passphrase vengano inviate, con un traffico abbastanza intercettato.

    
risposta data 21.05.2016 - 06:47
fonte

Leggi altre domande sui tag