Conoscendo il testo in chiaro, come scoprire lo schema di crittografia utilizzato? [chiuso]

StackOverflow https://stackoverflow.com/questions/231592

  •  04-07-2019
  •  | 
  •  

Domanda

Ho alcuni campi char () in una tabella DBF che sono stati lasciati crittografati da uno sviluppatore passato nel progetto.

Tuttavia, conosco il risultato in chiaro della decrittazione di diversi record. Come posso determinare la funzione / algoritmo / schema per decrittografare i dati originali? Questi sono alcuni campi di esempio:

Per crittografia:

b5 01 02 c1 e3 0d 0a

il testo in chiaro dovrebbe essere:

3543921 or 3.543.921

E per crittografia:

41 c3 c5 07 17 0d 0a

testo in chiaro dovrebbe essere

1851154 or 1.851.154

Credo che 0d 0a sia solo un riempimento. Veniva dai dati raccolti nella codifica win-1252 (non so se conta)

EDIT: è per motivi di curiosità e apprendimento. Voglio essere in grado di capire la crittografia utilizzata (sembra semplice, anche se sono dati binari) per recuperare il valore dei campi per le tuple di cui non conosco il testo in chiaro.

MODIFICA 2: aggiunti un paio di campioni.

È stato utile?

Soluzione

In generale non esiste un modo semplice. Questa domanda è troppo generica. Prova a pubblicare queste stringhe semplici + crittografate.

EDIT:

  • per motivi di apprendimento puoi leggere questo articolo: Crittografia su Wikipedia
  • se credi davvero che la crittografia sia semplice - controlla se è un XOR a livello di byte (o parola) - vedi il seguente pseudocodice

    for (i in originalString) {
    newString[i] = originalString[i] ^ CRYPT_BYTE;
    }
    

Altri suggerimenti

Supponendo che non sia qualcosa di semplice come un codice di sostituzione (prova l'analisi di frequenza) o un XOR applicato male (ad esempio, riutilizzare la chiave; prova a XORing due codici cifrati con caratteri di testo noti e poi vedi se il risultato è l'XOR dei caratteri di testo; o prova a XORare il testo cifrato con se stesso spostato di un certo numero di byte), dovresti probabilmente supporre che sia un noto codice stream / block con una chiave sconosciuta (che molto probabilmente è composta da caratteri ASCII). Se si dispone di un campione abbastanza grande di coppie di testo cifrato-testo in chiaro, è possibile iniziare controllando se i testi in chiaro con gli stessi primi caratteri / byte hanno valori in testo cifrato con gli stessi primi caratteri / byte. Lì potresti anche vedere se si tratta di un blocco o di un codice di flusso e se è coinvolto un meccanismo di feedback. Il riempimento, se presente, potrebbe anche suggerire che si tratta di un codice a blocchi anziché di un codice a flusso.

A seconda di quanto impegno vuoi impegnarti, dovresti essere in grado di andare da qualche parte. Inizia leggendo su cryptanalysis , in particolare metodi di crittoanalisi .

Le cose che determineranno quanto sarà facile questa attività sono:

  • quanto è buono il metodo di crittografia utilizzato; se è un metodo recente e ben considerato come RSA o AES, probabilmente sei sfortunato
  • quanto testo in cifratura e testo in chiaro hai, più è meglio
  • che tipo di dati è: il testo semplice è il più semplice, mentre i dati casuali sarebbero i più difficili
  • se i dati sono tutti crittografati con la stessa chiave o se sono state utilizzate più chiavi.

La chiave del successo è non scoraggiarti; la storia della crittoanalisi è piena di storie di codici apparentemente infrangibili che vengono violati; forse la più famosa è la macchina Enigma della seconda guerra mondiale, il cui crack ha contribuito allo sviluppo di computer moderni.

Possiamo dire alcune cose da ciò che hai fornito:

  • Con una lunghezza del testo cifrato di 7 byte in ogni caso, è improbabile che sia un cifrario a blocchi (poiché i cifrari a blocchi crittografano un blocco alla volta, la loro lunghezza sarà un multiplo della dimensione del blocco e una dimensione del blocco di 56 bit è piuttosto improbabile *).
  • La lunghezza del testo cifrato e il numero di caratteri nel testo in chiaro è la stessa in ogni caso, quindi potrebbe essere una codifica semplice di numeri come ascii con un codice di flusso applicato.
  • XORing il testo in chiaro (come ASCII) e il testo cifrato insieme non danno né un singolo ottetto ripetuto né lo stesso cryptostream per ciascuno, quindi non è un codice banale. Inoltre, non è un semplice codice di flusso che utilizza la stessa chiave per entrambi, a meno che alcuni byte del testo cifrato non siano IV.
  • Gli ultimi due byte sono identici nel testo cifrato ma non nel testo normale. Questa potrebbe essere una coincidenza ma potrebbe anche essere indicativa di imbottitura come suggerisci. Se sono padding, è necessario utilizzare qualche altro meccanismo di codifica.

Sai se tutti i valori crittografati sono numeri interi o sono possibili anche altri valori?

Determinare l'algoritmo usato senza la chiave corrispondente potrebbe non essere del tutto utile.

Se il testo è abbastanza piccolo e hai il testo in chiaro, perché dovresti capirlo? Altro che, naturalmente, per motivi di curiosità?

Non esiste un modo deterministico per dirlo, ma spesso ci sono suggerimenti nel testo cifrato. È davvero crittografato (con una sorta di chiave)? O è solo hash e (probabilmente) salato.

Se è hash, potresti essere fortunato e solo google per una coppia corrispondente (supponendo che tu abbia qualcuno che sia parole del dizionario) perché ci sono già dei dizionari pre-hash online.

Se hai un esempio del testo cifrato, potresti pubblicarlo, qualcuno potrebbe riconoscere il formato cifrato ...

Penso sia un'idea sbagliata che XOR sia uno schema facilmente decifrabile. La forma di crittografia teoricamente più potente è un pad una tantum: semplicemente una stringa di bit predeterminati che xor il tuo testo in chiaro con ...

XOR finiti, d'altra parte ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top