Le défi
Un simple défi "espion contre espion".
Écrivez un programme avec les spécifications suivantes:
- Le programme peut être écrit dans n'importe quelle langue mais ne doit pas dépasser 512 caractères (comme représenté dans un bloc de code sur ce site).
- Le programme doit accepter 5 entiers 32 bits signés comme entrées. Il peut prendre la forme d'une fonction qui accepte 5 arguments, une fonction qui accepte un seul tableau à 5 éléments ou un programme complet qui lit 5 entiers à partir de n'importe quelle entrée standard.
- Le programme doit générer un entier 32 bits signé.
- Le programme doit retourner 1 si et seulement si les cinq entrées, interprétées comme une séquence, correspondent à une séquence arithmétique spécifique du choix du programmeur, appelée "clé". La fonction doit retourner 0 pour toutes les autres entrées.
Une séquence arithmétique a la propriété que chaque élément successif de la séquence est égal à son prédécesseur plus une constante fixe a
.
Par exemple, 25 30 35 40 45
est une séquence arithmétique puisque chaque élément de la séquence est égal à son prédécesseur plus 5. De même, 17 10 3 -4 -11
est une séquence arithmétique puisque chaque élément est égal à son prédécesseur plus -7.
Les séquences 1 2 4 8 16
et 3 9 15 6 12
ne sont pas des séquences arithmétiques.
Une clé peut être n'importe quelle séquence arithmétique de votre choix, avec la seule restriction que les séquences impliquant un débordement d'entier ne sont pas autorisées. C'est-à-dire que la séquence doit être strictement croissante, strictement décroissante ou avoir tous les éléments égaux.
Par exemple, supposons que vous choisissiez la clé 98021 93880 89739 85598 81457
. Votre programme doit renvoyer 1 si les entrées (dans l'ordre) correspondent à ces cinq nombres et 0 sinon.
Veuillez noter que les moyens de protéger la clé doivent être de votre propre conception. De plus, les solutions probabilistes qui peuvent renvoyer des faux positifs avec une probabilité non nulle ne sont pas autorisées. En particulier, veuillez ne pas utiliser de hachages cryptographiques standard, y compris les fonctions de bibliothèque pour les hachages cryptographiques standard.
La notation
La ou les soumissions non fissurées les plus courtes par nombre de caractères 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 programmes, 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.
Voir "Clause de non-responsabilité" ci-dessous pour plus de détails sur la politique de score de craquage mise à jour.
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 un nouveau programme, il doit le faire dans une réponse séparée.
Le ou les crackers ayant obtenu le ou les scores les plus élevés seront déclarés gagnants avec les développeurs des programmes gagnants.
Veuillez ne pas casser votre propre soumission.
Bonne chance. :)
Classement
Avant-dernier classement (en attendant la sécurité de la communication de Dennis CJam 49).
Casiers sécurisés
- CJam 49, Dennis
- CJam 62, Dennis en sécurité
- CJam 91, Dennis en sécurité
- Python 156, coffre-fort Maarten Baert
- Perl 256, chilemagic safe
- Java 468, géobits sûrs
Craquelins imparables
- Peter Taylor [Ruby 130, Java 342, Mathematica 146 *, Mathematica 72 *, CJam 37]
- Dennis [Pyth 13, Python 86 *, Lua 105 *, GolfScript 116, C 239 *]
- Martin Büttner [Javascript 125, Python 128 *, Ruby 175 *, Ruby 249 *]
- Tyilo [C 459, Javascript 958 *]
- freddieknets [Mathematica 67 *]
- Ilmari Karonen [Python27 182 *]
- nitreux [C 212 *]
* soumission non conforme
Avis de non-responsabilité (mis à jour à 23 h 15 HNE le 26 août)
Avec les problèmes de notation atteignant enfin la masse critique (étant donné que les deux tiers des soumissions fissurées sont jusqu'à présent non conformes), j'ai classé les meilleurs crackers en termes de nombre de soumissions fissurées (primaire) et de nombre total de caractères dans les soumissions fissurées conformes (secondaire).
Comme précédemment, les soumissions exactes fissurées, la longueur des soumissions et leur statut conforme / non conforme sont toutes marquées afin que les lecteurs puissent déduire leur propre classement s'ils pensent que le nouveau classement officiel est injuste.
Mes excuses pour avoir modifié les règles si tard dans la partie.
Réponses:
CJam, 62 caractères
Stack Exchange a tendance à mutiler des caractères non imprimables, mais copier le code de cette pâte et le coller dans l' interpréteur CJam fonctionne très bien pour moi.
Comment ça marche
Après avoir remplacé la chaîne Unicode par une chaîne ASCII, le code suivant est exécuté:
Cette approche utilise le Bivium-B (voir l' analyse algébrique des chiffres de type Trivium ), une version affaiblie du chiffrement de flux Trivium .
Le programme utilise la séquence d'entiers comme état initial, met à jour l'état 434 fois (354 tours atteignent une diffusion complète) et génère 177 bits de sortie, qu'il compare à ceux de la séquence correcte.
Étant donné que la taille de l'état est précisément de 177 bits, cela devrait suffire pour identifier de manière unique l'état initial.
Exemple d'exécution
la source
CJam, 91 caractères
Stack Exchange a tendance à mutiler des caractères non imprimables, mais copier le code de cette pâte et le coller dans l' interpréteur CJam fonctionne très bien pour moi.
Comment ça marche
Après avoir remplacé la chaîne Unicode par des entiers (en considérant les chiffres des caractères des nombres de base 65533), le code suivant est exécuté:
Étant donné que 13 est coprime au totient du module (le totient est secret, vous n'aurez donc qu'à me faire confiance), différentes bases généreront des résultats différents, c'est-à-dire que la solution est unique.
A moins que quelqu'un ne puisse exploiter le petit exposant (13), le moyen le plus efficace de briser ce verrou est de factoriser le module (voir problème RSA ). J'ai choisi un entier de 512 bits pour le module, qui devrait résister à 72 heures de tentatives de factorisation.
Exemple d'exécution
la source
found 1740001 rational and 1739328 algebraic entries
; il a depuis eu près de 100 heures pour les traiter, et les rapportssieving in progress b = 46583, 0 complete / 0 batched relations (need 44970493)
.Python - 128
Essayons celui-ci:
(Attend de l'utilisateur qu'il saisisse 5 nombres séparés par des virgules, par exemple
1,2,3,4,5
.)la source
32416190039,32416190047,32416190055,32416190063,32416190071
Java: 468
L'entrée est donnée sous la forme
k(int[5])
. Balles tôt si elles ne sont pas également espacées. Sinon, il faut un peu déterminer si les dix hachages sont corrects. Pour les grands nombres, "un peu" peut signifier dix secondes ou plus, donc cela peut dissuader les crackers.la source
Java: 342
Voici un casier basé sur des chaînes qui dépend à la fois du nombre de caractères saisis et de l'entrée spécifique. La séquence peut être basée sur des références obscures à la culture pop. S'amuser!
Un peu non golfé:
la source
-8675309
, delta est5551212
.Python, 147
Edit: version plus courte basée sur le commentaire de Dennis. J'ai également mis à jour la séquence pour éviter de divulguer des informations.
Sur la base du problème de logarithme discret qui est considéré comme non craquable, cependant le premier que j'utilise est probablement trop petit pour être sécurisé (et il peut avoir d'autres problèmes, je ne sais pas). Et vous pouvez le forcer brutalement, car les seules inconnues sont deux entiers 32 bits.
la source
c=1
, en calculantc=(c<<32)+d
et en modifiant la constante en conséquence.Javascript 125
Celui-ci devrait être craqué assez rapidement. Je vais enchaîner avec quelque chose de plus fort.
la source
0, 3913, 7826, 11739, 15652
Rubis, 175
Contrairement à l'utilisation d'un hachage cryptographique ou
srand
, cela est prouvablement unique (ce qui est un léger indice). Prend cinq chiffres via STDIN, délimités par un ou plusieurs caractères non numériques et non de nouvelle ligne. Sorties vers STDOUT.la source
622238809,1397646693,2173054577,2948462461,3723870345
(ma supposition précédente avait une erreur, mais celle-ci est testée). Je ne pense pas que cela soit valable, car le dernier nombre ne tient pas dans un entier 32 bits signé.GolfScript (116 caractères)
Prend les entrées sous forme d'entiers séparés par des espaces.
la source
-51469355 -37912886 -24356417 -10799948 2756521
C 459 octets
RESOLU PAR Tyilo - LIRE MODIFIER CI-DESSOUS
Nous avons besoin de quelqu'un pour écrire une solution C, n'est-ce pas? Je n'impressionne personne avec sa longueur, je ne suis pas un golfeur. J'espère que c'est un défi intéressant!
Je ne pense pas qu'il y ait un moyen évident de le casser, et j'attends avec impatience toutes les tentatives! Je sais que cette solution est unique. Obscurcissement très minime, principalement pour répondre aux exigences de longueur. Cela peut être testé simplement:
PS Il y a une signification en
a[0]
tant que nombre à part entière, et j'aimerais voir quelqu'un le souligner dans les commentaires!MODIFIER:
Solution:
6174, 48216, 90258, 132300, 174342
Une note sur le cracking:
Bien que ce ne soit pas la méthode utilisée (voir les commentaires), il m'est arrivé de casser mon propre chiffre avec une force brute très simple. Je comprends maintenant qu'il est d'une importance vitale de rendre les chiffres importants. Le code suivant peut déchiffrer n'importe quel chiffre où se
upper_bound
trouve une limite supérieure connuea[0] + a[1] + a[2] + a[3] + a[4]
. La borne supérieure du chiffre ci-dessus est457464
, qui peut être dérivée du système d'équationsb[]
et de certains traitements de l'algorithme. On peut le montrerb[4] = a[0] + a[1] + a[2] + a[3] + a[4]
.Avec
a[0] = 6174
, cette boucle a cassé mon travail en un peu moins d'une minute.la source
6174, 48216, 90258, 132300, 174342
.Mathematica
8067Fonctionnement:
Probablement assez facile à casser, pourrait également avoir plusieurs solutions.
Mise à jour: Amélioration du golf en faisant ce que Martin Büttner a suggéré. La fonctionnalité de la fonction et de la touche n'a pas changé.
la source
{58871,5592,-47687,-100966,-154245}
NextPrime
pourrait retourner des valeurs négatives. Comment avez-vous trouvé?Python27,
283182D'accord, je suis très confiant dans mon casier, mais cela fait assez longtemps que j'ai ajouté des calculs `` difficiles à inverser '' à l'entrée, pour le rendre bien - difficile à inverser.
edit: Merci à colevk pour le golf. J'ai réalisé lors de l'édition qu'il y avait un bug ainsi qu'une faille dans mon algorithme, peut-être que j'aurai plus de chance la prochaine fois.
la source
121174841 121174871 121174901 121174931 121174961
fonctionne, mais seulement si la liste[1,3,5,7]
de la ligne 7 est remplacée par[1,3,5,7,11]
.Mathematica
142146EDIT : la clé n'était pas unique, a ajouté 4 caractères, elle l'est maintenant.
(Espaces et nouvelles lignes ajoutés pour plus de lisibilité, non comptés et non nécessaires).
Usage:
la source
256208
, delta-5
.IntegerDigits
, puis à factoriser pour obtenir des candidats pour le mandat initial et le delta.NextPrime
; si nous la modifions de plus ou moins un, au moins l'un d'eux donnera le même nombre premier suivant.Craqué par @Dennis en 2 heures
Juste un simple pour démarrer les choses - je m'attends à ce que cela soit rapidement craqué.
Pyth , 13
Prend une entrée séparée par des virgules sur STDIN.
Exécutez-le comme ceci (-c signifie prendre le programme comme argument de ligne de commande):
Correction du programme - je n'avais pas compris la spécification.
Ce langage pourrait être trop ésotérique pour ce concours - Si OP le pense, je le supprimerai.
la source
1,2,3,4,5
c'est la clé?97,96,95,94,93
(Je viens de tuer mon score de cracking.)Lua 105
Je soupçonne qu'il ne faudra pas longtemps avant qu'il ne soit fissuré, mais c'est parti:
(des espaces ont été ajoutés pour plus de clarté, mais ne font pas partie du décompte)
la source
3, 7, 11, 15, 19
ou6, 14, 22, 30, 38
t1==0
quandS
augmente. De plus, les deux conditions sont homogènes; siS
est une solution, il en est de mêmekS
.Perl - 256
J'ai dû mettre dans beaucoup de logique de gestion des erreurs et cela peut certainement être beaucoup plus bas. Il imprimera un
1
lorsque vous obtenez les cinq bons chiffres. Il nous l' espérons imprimer un0
pour tout le reste (peut - être des erreurs ou rien, je ne sais pas). Si quelqu'un veut aider à améliorer le code ou le jouer davantage, n'hésitez pas à aider!Appeler avec:
la source
Rubis - 130
Basé sur le registre à décalage à rétroaction linéaire. Entrées par arguments de ligne de commande.
Doit être unique en fonction de la nature des LFSR. Indice: ascendant et tout positif.
Donnera plus d'indices si personne ne le résout bientôt.
la source
Rubis, 249
Devrait être amusant. Qui a besoin de mathématiques?
la source
309, 77347, 154385, 231423, 308461
mais je ne pense pas que ce soit unique.103, 232041, 463979, 695917, 927855
et3, 7966741, 15933479, 23900217, 31866955
. Et je suis presque sûr qu'il existe d'autres expressions rationnelles valides en utilisant des+
s supplémentaires .()
ou similaire.CJam, 49 caractères
Essayez-le en ligne.
Comment ça marche
Le résultat sera 1 si et seulement si le deuxième entier est un facteur du premier, qui est un produit de deux nombres premiers: celui correspondant à la séquence secrète et l'autre qui ne correspond à aucune séquence valide. Par conséquent, la solution est unique.
Factoriser un entier de 512 bits n'est pas si difficile, mais j'espère que personne ne pourra le faire en 72 heures. Ma version précédente utilisant un entier de 320 bits a été cassée .
Exemple d'exécution
la source
Javascript 958
Convertit les entrées en un certain nombre de types de données et effectue des manipulations pertinentes pour chaque type de données en cours de route. Devrait être assez facilement inversé pour quiconque prend le temps.
la source
320689, 444121, 567553, 690985, 814417
C, 239 (fissuré par Dennis)
Allez ici pour ma soumission mise à jour.
Pourrait probablement être joué un peu plus à fond. Certes, je n'ai pas pris le temps de prouver que la clé est unique (ce n'est probablement pas le cas) mais elle est définitivement de l'ordre d'une collision de hachage. Si vous le craquez, partagez votre méthode :)
la source
0 0 0 0 0
?C, 212 par Orby - Cracked
https://codegolf.stackexchange.com/a/36810/31064 par Orby a au moins deux clés:
Orby a demandé la méthode que j'ai utilisée pour le casser. La fonction p vérifie si x est premier en vérifiant
x%i==0
tout i entre 2 et x (bien qu'en utilisant(x/i)*i==x
au lieu dex%i==0
), et renvoie vrai si x est un nombre premier. La fonction f vérifie que tous a, b, c, d et e sont premiers. Il vérifie également si le nombre m, une concaténation des représentations décimales de e, d, c, b et a (dans cet ordre), est premier. La clé est telle que a, b, c, d, e et m sont tous premiers.Green et Tao (2004) montrent qu'il existe une infinité de séquences arithmétiques de nombres premiers pour toute longueur k, il nous suffit donc de rechercher ces séquences qui satisfont également m étant premier. En prenant longtemps comme étant limité par -9.223372037e + 18 et 9.223372037e + 18, nous savons que pour que la chaîne concaténée tienne en long long, les nombres ont une limite supérieure de 9999. Donc, en utilisant un script python pour générer tous des séquences arithmétiques dans tous les nombres premiers <10000, puis en vérifiant si leur concaténation inverse est un nombre premier, nous pouvons trouver de nombreuses solutions possibles.
Pour une raison quelconque, j'ai trouvé des faux positifs, mais les deux ci-dessus sont valides selon le programme. De plus, il peut y avoir des solutions où e est négatif et les autres sont positives (p utilise le module de x), mais je ne les ai pas recherchées.
Les clés que j'ai données sont toutes des séquences arithmétiques, mais le script d'Orby ne semble pas exiger que les entrées soient une séquence arithmétique, donc il peut également y avoir des clés invalides.
la source
MATLAB: Apparemment invalide
Très simple, il vous suffit de générer le bon nombre aléatoire.
Il peut toujours y avoir une erreur, mais cela ne devrait pas être un problème.
la source
MATLAB (avec Symbolic Toolbox), 173 caractères
Ce n'est pas une entrée officielle et ne comptera pas pour le score de crack de quiconque, mais cela vous rapportera des droits de vantardise fous. ;)
La boîte à outils symbolique n'est nécessaire que pour gérer la soustraction de grands nombres entiers.
Brute le forçant devrait être un chien, mais si vous connaissez la série qu'elle implique, la solution est triviale.
la source
Python 2 (91)Edit: Ceci n'est pas autorisé car l'argument de l'unicité est probabiliste. J'abandonne.
Prend des listes d'entiers en entrée, comme
[1,2,3,4,5]
.La boucle est destinée à opérer sur les entrées de manière gênante, laissant une tour de sommes et d'exposants. L'idée est comme un journal discret, mais avec des complications compliquées au lieu de la simplicité mathématique. Peut-être que la composition du module est une vulnérabilité, auquel cas je pourrais en faire quelque chose
7**58+8
.Je ne sais pas vraiment comment je prouverais que ma clé est la seule, mais la plage de sorties est au moins 10 fois plus grande que la plage d'entrées, alors probablement? Bien que seule une petite fraction des sorties potentielles soit réalisable. Je pourrais toujours augmenter le nombre de chiffres au détriment des caractères. Je vous laisse le soin de décider ce qui est juste.
Bonne fissuration!
la source
Mathematica - 72
Version 2 de mon script, avec la même clé que celle destinée à ma version 1.
Cela supprime essentiellement les nombres premiers négatifs pour
NextPrime
.Fonctionnement:
la source
9244115
, delta25
.1073743739, 1073886396, 1074029053, 1074171710, 1074314367
Python, 86 caractères
Entrez les chiffres comme
1,2,3,4,5
.la source
1,0,1,63021563418517255630720,0
.19960211, 31167202, 42374193, 53581184, 64788175
63021563418517255630720
n'est pas un nombre 32 bits.Python, 78
(Cracké par Tyilo en 14 minutes)
Amusement!
D'accord, il ne s'affiche pas correctement ici :(
Attend une liste de cinq nombres, par exemple. [1,2,3,4,5]
la source
[-481890276, -594823292, -728999970, -887503650, -1073741792]
CJam, 37 caractères (cassé)
Essayez-le en ligne.
Comment ça marche
Voir ma nouvelle réponse.
Exemple d'exécution
la source
737262825 208413108 3974530688 3445680972 2916831257
fonctionne mais n'est pas une progression arithmétique. Facturée en 3 heures 20 minutes. Les numéros 512 bits étaient apparemment faisables en 72 heures pour 75 $ sur EC2 il y a deux ans, donc je pense que cela aurait été sûr.737262825 208413109 -320436607 -849286323 -1378136039
C, 212 (fissuré)
C'est la même idée que ma soumission précédente , golfée plus en profondeur, avec un bug corrigé qui passait 0,0,0,0,0 (Merci à Dennis d'avoir signalé le bug). Compilez avec -std = c99.
la source
-7 -37 -67 -97 -127
,-157 -127 -97 -67 -37