Nello spirito del Underhanded C Contest , sto avviando un Underhanded Code Contest. L'obiettivo di questo concorso è implementare in modo diretto un po 'di codice, nascondendo sottilmente un insetto nefasto al suo interno.
Il contesto
Sei una talpa russa segreta che lavora nel dipartimento IT di un'agenzia di spionaggio americana. Il tuo capo americano ti ha appena chiesto di implementare un algoritmo di hashing della password da utilizzare per crittografare i messaggi segreti.
Il tuo capo vuole che tu attui la seguente funzione:
f: String -> byte[16]
che converte una password in una quantità di 16 byte adatta all'uso come chiave AES. Il tuo capo vuole una funzione sicura, che in questo contesto significa che stringhe di password diverse dovrebbero generare risultati diversi con una probabilità schiacciante. Ad esempio, restituire l' hash md5 dell'input sarebbe una semplice implementazione di f
.
Naturalmente, il tuo vero capo nell'agenzia di spionaggio russa vorrebbe che tu sovvertissi questo processo. Il tuo compito è implementare in modo f
tale che i russi possano decifrare tutti i messaggi segreti crittografati usando le chiavi restituite da f
.
Per fare ciò, è necessario implementare in f
modo che restituisca solo un piccolo sottoinsieme delle 2 ^ 128 possibili uscite. In particolare, f
devi restituire al massimo 2 ^ 16 risultati diversi in modo che i russi possano fare una semplice ricerca della forza bruta per la chiave corretta per ogni messaggio crittografato che desiderano decrittografare.
Tieni presente, tuttavia, che lo spionaggio comporta la pena di morte. Per non essere scoperto, la tua funzione f
deve generare almeno 2 ^ 8 risultati diversi, quindi f
è improbabile che un'ispezione superficiale di alcune uscite di rivelare un duplicato. E, soprattutto, il codice che introduci per limitare l'intervallo f
deve apparire involontario, non intenzionale. Se vieni mai trascinato in un'aula di tribunale, ci deve essere qualche ragionevole dubbio sul fatto che tu abbia introdotto il bug deliberatamente o per caso.
A giudicare
Io e altri due che assumerò giudicherò le voci (inviami un'e-mail se vuoi giudicare). Offro un premio di 200 reputazione per l'iscrizione vincente. Le candidature devono essere caricate entro il 1 maggio.
Il giudizio terrà conto dei seguenti criteri:
- fa
f
aderire alla specifica, cioè non genera tra 2 ^ 8 e 2 ^ 16 possibili uscite. Non pensare che si tratti di limiti rigidi, ma dedurremo dei punti se sei troppo fuori portata. - Il bug è plausibilmente il risultato di un errore involontario?
- Le uscite di
f
sembrano casuali? - Più breve è la tua implementazione
f
, meglio è. - Più chiara è la tua implementazione
f
, meglio è.
Gli appunti
È possibile utilizzare qualsiasi lingua per implementare il codice. Stai cercando di nascondere un bug in bella vista, quindi il codice offuscato non è consigliato.
Potresti dare un'occhiata ad alcuni dei precedenti vincitori del concorso Underhanded C per avere un'idea di ciò che rende una buona presentazione.
Le stringhe di input saranno ascii stampabili (da 32 a 126, incluso). Se lo desideri, puoi assumere una lunghezza massima ragionevole.