Sì, puoi forzare questa forza piuttosto velocemente, ma se sei curioso, non hai bisogno di forzare questa intera soluzione. C'è un approccio matematico.
Potresti persino richiedere parti di ciò in ogni caso poiché questo sembra essere un algoritmo di hashing e non un algoritmo di crittografia (non è reversibile in modo affidabile).
Ti fa incuriosire che un algoritmo di crittografia ripetibile usi la generazione di numeri casuali? Questo può funzionare solo quando il seme casuale (cercare srand
) è impostato in modo coerente per lo stesso input, il che significa che le chiamate consecutive a rand()
restituiranno la stessa sequenza ordinata di risultati.
Q. Com'è la serie di semi casuali in questo caso?
A. Dal prodotto dei codici carattere dei primi quattro caratteri, quelli che mancano.
Sappiamo dal codice che il testo crittografato risultante avrà la stessa lunghezza dell'input in testo normale. Sappiamo anche che ogni carattere di output crittografato è generato dal carattere originale nel suo indice come questo:
%codice%.
Da questo puoi ricavare una semplice formula matematica per trovare (random number generated from the seed at the n'th pass where n is the current index + 1) ^ (that same random number mod the key length of 13 in your example) ^ (the character code at the current index)
in un dato passaggio attraverso la crittografia basata su un codice di carattere di output e un indice.
Non sono riuscito a trovare una fonte ufficiale gratuitamente, ma diversi luoghi come qui mostrano come il c% la funzioner
è implementata:
static unsigned long int next = 1;
int rand(void) // RAND_MAX assumed to be 32767
{
next = next * 1103515245 + 12345;
return (unsigned int)(next/65536) % 32768;
}
void srand(unsigned int seed)
{
next = seed;
}
Si noti che il seme viene regolato ogni volta che viene generato un numero. Puoi creare un'altra formula basata sull'implementazione rand
per trovare quali valori possibili rand
possono quando next
restituisce il codice carattere associato al quinto carattere dell'output (il primo associato a un carattere chiave che conosci) . Prendi ciascuna di queste possibilità e filtrale eseguendo passaggi successivi attraverso rand
in base al codice precedente e il codice di crittografia utilizzando l'output rand
come valore rand
e controllando i risultati con i successivi caratteri dell'output fino a ti rimane solo una singola opzione valida valida per r
al 5 ° passaggio.
Una volta che lo sai, inverti quella volta per ognuno dei personaggi precedenti per ottenere i primi 4 valori di next
. Dopo aver risolto i valori di r
, tutto ciò che rimane è di invertire r
per risolvere output[i] = r ^ key[(r % strlen(key))] ^ text[i]
. Sarà utile ricordare che l'inverso di text[i]
è y = a ^ x
. Inserisci i valori di y = log base a (x)
che hai risolto in precedenza nell'ordine corretto per ottenere i codici di carattere associati a tale passaggio attraverso la crittografia. Aggiungi quelli all'inizio della chiave e controlla il tuo lavoro invertendo l'algoritmo di crittografia e passando la nuova chiave con il testo crittografato e verificando se l'output ha senso. Se lo fa, hai completato la sfida senza forza bruta (tranne forse nel tuo filtraggio).
Ovviamente, dato che lo spazio chiave è abbastanza piccolo per bruteforce, puoi sempre farlo.