Le défi
Je vous présente un autre défi espion contre espion opposant les obfuscateurs aux crackers. Dans ce cas, cependant, la donnée à protéger n'est pas une entrée mais une sortie .
Les règles du défi sont simples. Écrivez une routine avec les spécifications suivantes:
- La routine peut être écrite dans n'importe quelle langue mais ne doit pas dépasser 320 octets.
- La routine doit accepter trois entiers signés 32 bits comme entrées. Il peut prendre la forme d'une fonction qui accepte 3 arguments, une fonction qui accepte un seul tableau à 3 éléments ou un programme complet qui lit 3 entiers à partir de n'importe quelle entrée standard.
- La routine doit générer un entier 32 bits signé.
- Sur toutes les entrées possibles, la routine doit sortir entre 2 et 1 000 (inclus) valeurs uniques. Le nombre de valeurs uniques qu'une routine peut produire est appelé sa clé .
Par exemple, le programme C
int foo( int i1, int i2, int i3 ) {
return 20 + (i1^i2^i3) %5;
}
a une clé de 9, car elle (je l' espère) peut sortir les neuf valeurs 16
, 17
, 18
, 19
, 20
, 21
, 22
, 23
et 24
.
Certaines limitations supplémentaires sont les suivantes:
- La routine doit être entièrement déterministe et invariante dans le temps, renvoyant des sorties identiques pour des entrées identiques. La routine ne doit pas appeler les générateurs de nombres pseudo-aléatoires.
- La routine peut ne pas s'appuyer sur des "variables cachées" telles que des données dans des fichiers, des variables système ou des fonctionnalités de langage ésotérique. Par exemple, les routines ne devraient généralement pas faire référence à des constantes à moins que les constantes ne soient clairement définies dans le code lui-même. Les routines qui s'appuient sur des caprices du compilateur, des sorties d'opérations mathématiques non définies, des erreurs arithmétiques, etc. sont également fortement déconseillées. En cas de doute, s'il vous plaît demander.
- Vous (le codeur) devez savoir précisément combien de sorties uniques la routine peut produire et devez être en mesure de fournir au moins une séquence d'entrée qui produit chaque sortie. (Puisqu'il peut potentiellement y avoir des centaines de sorties uniques, cet ensemble ne sera jamais demandé que si votre clé est contestée.)
Étant donné que ce problème ressemble beaucoup moins à un cryptage classique que le précédent, je m'attends à ce qu'il soit accessible à un public plus large.
Plus c'est créatif, mieux c'est.
La notation
La ou les soumissions non fissurées les plus courtes par décompte d'octets seront déclarées gagnantes.
En cas de confusion, n'hésitez pas à demander ou à commenter.
Le contre-défi
Tous les lecteurs, y compris ceux qui ont soumis leurs propres routines, sont encouragés à "cracker" les soumissions. Une soumission est craquée lorsque sa clé est publiée dans la section des commentaires associés. Si une soumission persiste pendant 72 heures sans être modifiée ou fêlée, elle est considérée comme «sûre» et tout succès ultérieur dans la fêlure sera ignoré pour les besoins du concours.
Une seule tentative de piratage par soumission par lecteur est autorisée. Par exemple, si je soumets à l'utilisateur X: "votre clé est 20" et que je me trompe, l'utilisateur X rejette ma supposition comme incorrecte et je ne pourrai plus soumettre de suppositions supplémentaires pour cette soumission.
Les soumissions fissurées sont éliminées de la contention (à condition qu'elles ne soient pas «sécuritaires»). Ils ne doivent pas être modifiés. Si un lecteur souhaite soumettre une nouvelle routine, il doit le faire dans une réponse séparée.
Le score d'un cracker est le nombre de soumissions (conformes ou non) qu'il ou elle cracke. Pour les crackers avec des nombres identiques, le classement est déterminé par le nombre total d'octets dans toutes les soumissions fissurées (le plus élevé, le meilleur).
Le ou les crackers avec le ou les scores les plus élevés seront déclarés gagnants avec les développeurs des routines gagnantes.
Veuillez ne pas casser votre propre soumission.
Bonne chance. :)
Classement
Dernière mise à jour le 2 septembre à 10 h 45 HNE
Barrières inamovibles (soumissions non fissurées):
- CJam, 105 [Dennis]
Forces imparables (craquelins):
- Dennis [ Java, 269 ; C, 58 ; Mathematica, 29 ]
- Martin Büttner [ Java, 245 ]
return
Réponses:
CJam, 105 octets
Ce qui précède utilise le signe d'insertion et la notation M, car il contient un caractère non imprimable. Après avoir converti le flux d'octets en un entier (
256b
), le code suivant est exécuté:Vous pouvez essayer cette version en ligne dans le interpréteur CJam .
Comment ça fonctionne
Cette soumission utilise la théorie des nombres au lieu de l'obscurcissement. Le programme renverra 0 pour presque toutes les entrées. Des quelques entrées qui produisent une sortie non nulle, un module secret est dérivé qui est appliqué aux 10 bits les moins significatifs du troisième entier.
La façon la plus efficace de résoudre ce défi (à laquelle je pense) serait de factoriser l'entier 512 bits, ce qui, je l'espère, ne sera pas réalisable en 72 heures.
Exemple d'exécution
la source
Java - 269
Merci pour la patience de tout le monde, cela devrait maintenant être corrigé.
raccourci:
Non raccourci:
la source
double e,f,d=...;e=...;f=...;
àdouble d=...,e=...,f=...;
1
et votre réponse est également incorrecte;) (123 étant correct ... quelqu'un arrive et récupère le score de cracking). Et je suppose que Stretch Maniac n'a pas tenu comptesin == 1.0
quand il a dit que 122 était correct.Un échantillonneur
Ce n'est pas une entrée officielle bien sûr, et le nombre de caractères est trop élevé, mais je pense que si quelqu'un veut un défi époustouflant, il peut essayer de déterminer combien de sorties uniques la fonction suivante produit (compte tenu de trois entrées décrites dans l'OP) :
En fait, je suis tellement convaincu qu'il est impossible de craquer, je décernerai à quiconque le craquera le "Prix suprême de la force imparable de la nature".
Parce que vraiment, ils le méritent.
la source
C, 58 octets (fissuré)
Un simple:
la source
-15485867, -1299721, -104287, 0, 104287, 1299721, 15485867
).Java - 245
Craqué par Martin Büttner
Alimentez l'entrée en tant que tableau int:
a(new int[]{1,2,3})
. Je ne m'attends pas à ce que ça dure 72 heures, mais amusez-vous avec.Le voici avec des sauts de ligne, pour le rendre un peu plus lisible:
la source
Mathematica, 29 octets, clé: 715, fissuré par Dennis
Ceci est juste une version fixe de ma réponse initiale, qui ne fonctionnait pas pour les entrées non positives.
Prend une liste d'entiers comme
la source
349
des sorties uniques. La plage allait de3
à717
.3 ... 717
).207 caractères, en C / C ++, pas encore obscurcis:
la source