Dans l'esprit du concours Underhanded C , je lance un concours de code Underhanded. L’objectif de ce concours est d’implémenter directement du code, tout en y dissimulant de manière subtile un bogue infâme.
La compétition
Vous êtes une taupe russe secrète qui travaille au service informatique d'une agence d'espionnage américaine. Votre patron américain vient de vous demander de mettre en œuvre un algorithme de hachage de mot de passe à utiliser pour chiffrer les messages secrets.
Votre patron souhaite que vous implémentiez la fonction suivante:
f: String -> byte[16]
qui convertit un mot de passe en une quantité de 16 octets pouvant être utilisée comme clé AES. Votre patron souhaite une fonction sécurisée, ce qui signifie dans ce contexte que différentes chaînes de mots de passe doivent générer des résultats différents avec une probabilité écrasante. Par exemple, renvoyer le hachage md5 de l'entrée serait une simple implémentation de f
.
Bien sûr, votre vrai patron de l'agence d'espionnage russe voudrait que vous subvertissiez ce processus. Votre tâche consiste à mettre en place f
des systèmes permettant aux Russes de déchiffrer tous les messages secrets chiffrés à l'aide des clés renvoyées par f
.
Pour ce faire, vous devez implémenter f
afin de ne renvoyer qu'un petit sous-ensemble des 2 ^ 128 sorties possibles. En particulier, vous f
devez renvoyer au plus 2 ^ 16 résultats différents afin que les Russes puissent effectuer une recherche simple et brutale de la clé correcte pour chaque message chiffré qu'ils souhaitent déchiffrer.
Gardez toutefois à l'esprit que l'espionnage est passible de la peine de mort. Pour ne pas être pris au piège, votre fonction f
doit générer au moins 2 ^ 8 résultats différents, de sorte qu'une inspection superficielle de quelques sorties de f
ne donnera probablement pas un doublon. Et plus important encore, le code que vous introduisez pour limiter la portée f
doit paraître non intentionnel, et non délibéré. Si jamais vous êtes amené dans une salle d'audience, il doit exister un doute raisonnable quant à savoir si vous avez introduit le bogue délibérément ou par accident.
Juger
Les recrues et moi-même jugerons les entrées (envoyez-moi un courrier électronique si vous souhaitez juger). J'offre une prime de 200 points de réputation pour l'inscription gagnante. Les soumissions doivent être téléchargées avant le 1er mai.
Le jugement tiendra compte des critères suivants:
- Est -ce que
f
Adhérez à la spécification, à savoir qu'elle produit de entre 2 ^ 8 et 2 ^ 16 sorties possibles. Ne croyez pas que ce sont des limites strictes, mais nous déduirons des points si vous êtes trop loin des marges. - Le bogue est-il plausiblement le résultat d'une erreur involontaire?
- Les sorties de
f
look sont-elles aléatoires? - Plus votre mise en œuvre est courte
f
, mieux c'est. - Plus votre mise en œuvre sera claire
f
, mieux ce sera.
Remarques
Vous pouvez utiliser n'importe quel langage pour implémenter votre code. Vous essayez de cacher un bug à la vue de tous, donc le code obfusqué n'est pas suggéré.
Vous voudrez peut-être jeter un coup d'œil à certains des gagnants précédents du concours Underhanded C pour avoir une idée de ce qui fait une bonne soumission.
Les chaînes en entrée seront des caractères ASCII imprimables (32 à 126 inclus). Vous pouvez supposer une longueur maximale raisonnable si vous le souhaitez.