Ce concours est terminé.
En raison de la nature des défis posés par les flics et les voleurs , le défi des flics devient beaucoup plus facile lorsque l'intérêt pour le défi des voleurs associés a diminué. Par conséquent, même si vous pouvez toujours publier des fonctions de hachage, votre réponse ne sera ni acceptée ni intégrée au classement.
Ce défi est une recherche de la mise en œuvre la plus courte d'une fonction de hachage qui est une collision résistant , à savoir, il devrait être impossible de trouver deux messages différents avec le même hachage.
En tant que policier, vous essayez d’inventer et de mettre en oeuvre une fonction de hachage pour trouver le meilleur compromis entre la taille du code et la résistance aux collisions. Utilisez trop d'octets et un autre flic vous égrenera!
En tant que voleur, vous essayez de déjouer les tentatives des flics en craquant leurs fonctions, prouvant qu'elles ne conviennent pas. Cela les obligera à utiliser plus d'octets pour renforcer leurs algorithmes!
Défi Cops
Tâche
Implémentez une fonction de hachage cryptographique H: I -> O de votre choix, où I est l’ensemble des entiers non négatifs inférieur à 2 2 30 et O l’ensemble des entiers non négatifs inférieurs à 2 128 .
Vous pouvez implémenter H en tant que fonction réelle qui accepte et retourne un entier unique, une représentation sous forme de chaîne d'un entier ou d'un tableau d'entiers ou un programme complet qui lit à partir de STDIN et imprime vers STDOUT en base 10 ou 16.
Notation
H qu’il doit résister au défi des voleurs défini ci-dessous.
Si un voleur triomphe de votre soumission dans les 168 heures qui suivent son envoi, elle est considérée comme fissurée .
La mise en œuvre de H devrait être aussi courte que possible. La soumission non fissurée la plus courte sera la gagnante du défi des flics.
Règles supplémentaires
Si vous implémentez H en tant que fonction, veuillez fournir un wrapper pour exécuter la fonction à partir d'un programme qui se comporte comme expliqué ci-dessus.
Veuillez fournir au moins trois vecteurs de test pour votre programme ou votre wrapper (exemples d'entrées et leurs sorties correspondantes).
H peut être votre nouveau design (préféré) ou un algorithme bien connu, à condition de le mettre en œuvre vous-même. Il est interdit d'utiliser une fonction de hachage, une fonction de compression, un chiffrement, un PRNG, etc.
Toute fonctionnalité intégrée couramment utilisée pour implémenter des fonctions de hachage (par exemple, la conversion de base) constitue un jeu équitable.
Le résultat de votre programme ou fonction doit être déterministe.
Il devrait exister un compilateur / interprète gratuit (comme dans Beer) pouvant être exécuté sur une plate-forme x86 ou x64 ou à partir d'un navigateur Web.
Votre programme ou fonction doit être raisonnablement efficace et doit hacher tout message en I inférieur à 2 2 19 en moins d'une seconde.
Pour les cas extrêmes, le temps (mural) pris sur ma machine (Intel Core i7-3770, 16 Go de RAM) sera déterminant.
Compte tenu de la nature de ce défi, il est interdit de modifier le code de votre réponse de quelque manière que ce soit, que cela modifie la sortie ou non.
Si votre soumission a été fissurée (ou même si elle ne l’a pas été), vous pouvez poster une réponse supplémentaire.
Si votre réponse est invalide (par exemple, si elle n'est pas conforme à la spécification d'E / S), veuillez la supprimer.
Exemple
Python 2.7, 22 octets
def H(M): return M%17
Wrapper
print H(int(input()))
Le défi des voleurs
Tâche
Crack quelconque des cops d'arguments en affichant la suivante dans les voleurs de thread : deux messages M et N en I de telle sorte que H (M) = H (N) et M ≠ N .
Notation
Craquer chaque soumission de flic vous rapporte un point. Le voleur avec le plus de points gagne.
En cas d'égalité des voix, le voleur à égalité qui a soumis la plus longue soumission est déclaré vainqueur.
Règles supplémentaires
Chaque soumission de flic ne peut être craquée qu'une seule fois.
Si une soumission de flic repose sur un comportement défini ou non défini par l'implémentation, il vous suffit de trouver une fissure qui fonctionne (de manière vérifiable) sur votre machine.
Chaque fissure appartient à une réponse distincte dans le fil du voleur.
Publier une tentative de cracking non valide vous interdit de cracker cette soumission pendant 30 minutes.
Vous ne pouvez pas craquer votre propre soumission.
Exemple
Python 2.7, 22 octets par utilisateur8675309
1
et
18
Classement
Soumission sécurisée
Soumissions non fissurées
Vous pouvez utiliser cet extrait de pile pour obtenir une liste des réponses non encore résolues.
function g(p){$.getJSON('//api.stackexchange.com/2.2/questions/51068/answers?page='+p+'&pagesize=100&order=desc&sort=creation&site=codegolf&filter=!.Fjs-H6J36w0DtV5A_ZMzR7bRqt1e',function(s){s.items.map(function(a){var h=$('<div/>').html(a.body).children().first().text();if(!/cracked/i.test(h)&&(typeof a.comments=='undefined'||a.comments.filter(function(b){var c=$('<div/>').html(b.body);return /^cracked/i.test(c.text())||c.find('a').filter(function(){return /cracked/i.test($(this).text())}).length>0}).length==0)){var m=/^\s*((?:[^,(\s]|\s+[^-,(\s])+)\s*(?:[,(]|\s-).*?([0-9]+)/.exec(h);$('<tr/>').append($('<td/>').append($('<a/>').text(m?m[1]:h).attr('href',a.link)),$('<td class="score"/>').text(m?m[2]:'?'),$('<td/>').append($('<a/>').text(a.owner.display_name).attr('href',a.owner.link))).appendTo('#listcontent');}});if(s.length==100)g(p+1);});}g(1);
table th, table td {padding: 5px} th {text-align: left} .score {text-align: right} table a {display:block}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><table><tr><th>Language</th><th class="score">Length</th><th>User</th></tr><tbody id="listcontent"></tbody></table>
Réponses:
CJam, 21 octets
Prend une chaîne d'octets en entrée.
En pseudocode:
Exemple de hachage:
"" (chaîne vide) -> 1
"Test" -> 2607833638733409808360080023081587841
"test" -> 363640467424586895504738713637444713
C’est peut-être un peu simple, la plage de sortie n’est qu’un peu plus de 122 bits, le renforcement en triple itération est déjà un peu cassé car il fait exactement la même chose à chaque fois, donc une entrée qui passe à 1 dans le premier itération sera une pause complète. Mais c'est court, et il n'y a pas de plaisir à être trop en sécurité.
la source
Python, 109 octets [ fissuré , et encore ]
J'ai essayé d'implémenter Jenkins un à la fois telle quelle, la seule différence étant la valeur initiale et le nombre de bits.
Fait amusant: Apparemment, Perl a utilisé le hasch de Jenkins à un moment donné .
Wrapper
Exemples
la source
C ++, 148 octets
__uint128_t est une extension GCC et fonctionne comme prévu. Le hachage est basé sur l'itération FNV (j'ai emprunté leur nombre premier, bien que ce
a
soient les premiers chiffres de Pi en hex), avec une rotation semblable à sha1 au début de chaque itération. Compiler avec-O3
, hacher un fichier de 10 Mo prend moins de 2 secondes, il reste donc une marge pour augmenter les itérations dans la boucle intérieure - mais je me sens généreux aujourd'hui.De-uglified (noms de variables modifiés, commentaires ajoutés, espaces et paire d'accolades) pour votre plus grand plaisir:
Les suggestions de golf sont les bienvenues (même si je ne parviens pas à améliorer le code basé sur elles).
edit: correction de fautes de frappe en code dé-uglifié (la version golfée reste inchangée).
la source
o
semble être non initialisé. Oùoutput
est déclaré? Ou peuto
- être est-ceoutput
?n
. Avez-vous réellement vérifié le code "dé-uglifié" à exécuter?U i=81;i-=3
aurait pu être encore plus vil, sans coûts d’exécution considérables.CJam, 44 octets [ fissuré ]
L'entrée est en base 10.
CJam est lent. J'espère que ça marche en 1 seconde sur un ordinateur ...
Des explications
Eh bien, les choses en deux dimensions semblaient être une faiblesse ... Elle était destinée à faire des calculs lents plus rapidement au début. Mais il ne peut pas fonctionner en une seconde, peu importe ce que je fais, alors j'ai finalement supprimé le code lent.
Cela devrait également être mieux si j'ai utilisé des bits binaires et des bases supérieures.
Version C
la source
C ++, 182 caractères (+ environ 51 caractères de passe-passe)
Plaque de cuisson:
Programme exécutable avec une fonction de golf
la source
__uint128_t
seulement après avoir implémenté ceci.Pyth, 8 Cracked
Essayez-le en ligne
Une réponse un peu bête, je vais expliquer comment cela fonctionne car la plupart des gens ne peuvent pas lire Pyth. Cela prend le journal naturel de un plus l'entrée, puis le convertit en chaîne. Cette chaîne est inversée, puis évaluée et convertie en un entier.
Une traduction en python ressemblerait à ceci:
la source
Python 3, 216 octets [ fissuré ]
En raison d'une incompatibilité avec les spécifications, je peux penser à au moins un léger vulnérabilité, mais à part cela, je pense que c'est au moins une preuve de force brute. J'ai vérifié les 10 premiers millions de hachages, entre autres choses.
En termes de golf, cela serait plus court en Python 2, mais j'ai sacrifié quelques octets pour plus d'efficacité (car cela ne va probablement pas gagner de toute façon).
Edit: C’était ma tentative de mettre en œuvre le hachage très lisse , mais malheureusement 128 bits était beaucoup trop petit.
Wrapper
Exemples
Explication du code
Un exemple de remplissage pour
f(6)
:la source
C, 87 octets [ fissuré ]
C'est le programme complet. aucun emballage requis. Accepte les entrées binaires via stdin et génère un hachage hexadécimal sur stdout.
Cela ne fait que calculer un hachage 64 bits, alors je prends un peu de risque ici.
Au cas où quelqu'un se le demanderait, les deux constantes
'foo+'
et'bar/'
sont les nombres premiers 1718578987 et 1650553391.Exemples:
Ignore les zéros de tête:
Entrées à un octet:
Entrées multi-octets:
la source
foo|
(d5c9bef71d4f5d1b) etfoo\
(d5c9bef71d4f5d1b) produisent des hachages TRÈS similaires.\x00
et\x00\x00
!J - 39 octets - fissuré
Fonction prenant une chaîne en entrée et renvoyant un entier <2 128 . Je suppose que nous devons nommer notre fonction pour qu'elle soit valide; supprimez donc 3 caractères supplémentaires du compte si nous pouvons soumettre des fonctions anonymes.
Pour ceux d'entre vous qui ne lisent pas les hiéroglyphes, voici un aperçu de ce que je fais.
a=.(2^128x)&|@^/@
Ceci est un sous-programme * qui prend un tableau de nombres, puis le traite comme une tour de puissance, où l’exponentiation est prise mod 2 128 . Par "tour de pouvoir", je veux dire que si vous lui fournissiez une entrée3 4 5 6
, elle calculerait3 ^ (4 ^ (5 ^ 6))
.(".p:@+5,9:)a
Cette fonction prend une chaîne, la convertit en un nombre N , puis calcule les nombres premiers ( n +5) et les n premiers ( n +9), puis jette lesa
précédents sur elle. C'est, nous trouvons lep(n+5) ^ p(n+9)
mod 2 128 oùp(k)
est lek
-th prime.H=:_8...\(a...)]
Effectuez la fonction ci-dessus sur les sous-blocs de 8 caractères de l'entrée, puisa
tous les résultats ensemble et appelez la fonction de hachage résultanteH
. J'utilise 8 caractères parce que la fonction "k
-th prime" de J échoue lorsquep(k)
> 2 31 , c'estk=105097564
-à- dire le coffre-fort le plus grandk
.Avoir quelques exemples de sorties. Vous pouvez essayer cela vous-même en ligne sur tryj.tk , mais je vous le recommande vivement en téléchargeant l'interprète de Jsoftware .
* Techniquement, ce n'est pas une fonction en soi, il s'attache à d'autres fonctions et agit sur leur sortie. Mais c’est une question sémantique de J, pas une différence conceptuelle: le déroulement du programme est tel que je l’ai décrit ci-dessus.
la source
Python 3, 118 octets [ fissuré ]
L'indentation est un seul onglet. Simple hash, je ne l'ai pas encore vraiment testé.
Appeler comme suit:
résultat:
73117705077050518159191803746489514685
la source
ord(c)
que toute chaîne conviendra :) (sauf des caractères tels que des caractères nuls, je pense que ceux-ci facilitent les collisions de hachage. Conservez-vous donc avec une chaîne 0-9.)C ++, 239 octets
Mon tout premier code golf! [ S'il vous plaît soyez doux ]
Version non-golfée:
Pas le meilleur hash, et certainement pas le code le plus court existant. Accepter les astuces de golf et espérer s'améliorer!
Wrapper
Probablement pas le meilleur au monde, mais un emballage quand même
la source
printf '33333333\x40\xF3\x32\xD6\x56\x91\xCA\x66' | ./hash7_
->a4baea17243177fd
;printf '33333333\x77\x39\xF3\x82\x93\xDE\xA7\x2F' | ./hash7_
->a4baea17243177fd
. Le bruteforcer détecte les collisions ici beaucoup plus rapidement que dans d'autres hachages 64 bits.Java,
299291282 octets, fissuré.Fait quelques opérations sur BigIntegers, prend ensuite le résultat modulo 2 128 .
la source
public
vous-même, en sauvant 7 caractères?C, 128 octets [ fissuré ]
C'est plus ou moins le même algorithme que mon dernier effort (craqué par Vi.) , Mais il a maintenant assez de roues de hamster pour générer le hachage à 128 bits approprié.
Les quatre constantes principales du code sont les suivantes:
Comme auparavant, il s’agit d’un programme complet ne nécessitant pas de wrapper. L'entier I est entré via stdin sous forme de données binaires brutes (big-endian), et le hachage O est imprimé en hexadécimal vers stdout. Les zéros non significatifs dans I sont ignorés.
Exemples:
la source
C, 122 octets [ fissuré ]
Boucles imbriquées, GCL à moitié calibrés et permutation de variables. Qu'est-ce qu'il n'y a pas à aimer?
Voici une version non-golfée avec laquelle jouer:
Il s'agit d'un programme entièrement autonome qui lit à partir de STDIN et imprime vers STDOUT.
Exemple:
Dans certains tests simples, il se situe autour de 3 Mo / s de données texte. La vitesse de hachage dépend des données d'entrée elles-mêmes, vous devriez donc probablement en tenir compte.
la source
PHP 4.1, 66 octets [ fissuré ]
Je suis juste en train de me réchauffer.
J'espère que vous trouvez cela instinctif.
J'ai essayé des nombres aussi grands que 999999999999999999999999999.
La sortie semblait se situer dans la plage 2 128 .
PHP 4.1 est requis en raison de la
register_globals
directive.Cela fonctionne en créant automatiquement des variables locales à partir de la session, POST, GET, REQUEST et des cookies.
Il utilise la clé
a
. (EG: accès par dessushttp://localhost/file.php?a=<number>
).Si vous voulez le tester avec PHP 4.2 et plus récent, essayez ceci:
Cette version ne fonctionne qu'avec POST et GET.
Exemple de sortie:
(Je vous assure qu'il y a des nombres qui produisent le même hash).
la source
C, 134 octets, fissuré
C'est le programme complet en C.
Son effet: l’idée est de prendre l’entrée sous forme de tableau d’octets et d’ajouter à la fin des octets pseudo-aléatoires (mais déterministes) pour que la longueur soit égale à environ 2 2 30 (un peu plus). L'implémentation lit entrée par octet et commence à utiliser des données pseudo aléatoires lorsqu'elle trouve le premier caractère qui n'est pas un chiffre.
Comme PRNG intégré n'est pas autorisé, je l'ai mis en œuvre moi-même.
Il existe un comportement non défini / défini par l'implémentation qui raccourcit le code (la valeur finale doit être non signée et je dois utiliser différents types pour différentes valeurs). Et je ne pouvais pas utiliser les valeurs 128 bits en C. Version moins obscurcie:
la source
Python 2.X - 139 octets [[ fissuré ]]
Ceci est assez similaire à tous les autres hachages (LOOP, XOR, SHIFT, ADD) ici. Venez chercher vos voleurs de points;) Je vais en faire un plus dur une fois celui-ci résolu.
Wrapper (attend un argument en base 16 également appelé hexadécimal):
la source
H(2**(2**10))
pris environ 8 ou 9 secondes, alors qu’il aH(2**(2**12))
fallu environ 29 secondes etH(2**(2**14))
plus de deux minutes.Python 2.7 - 161 octets [[ Cracked ]]
Eh bien, puisque j'ai réussi à changer ma première fonction de hachage en une version inutile avant de la publier, je pense que je publierai une autre version d'une structure similaire. Cette fois-ci, je l'ai testé contre des collisions triviales et la plupart des magnitudes d'entrée possibles pour la vitesse.
Wrapper (non compté dans le bytecount)
Exemple d'exécution (l'entrée est toujours un nombre hexadécimal):
la source
Ruby, 90 octets
Un algorithme de hachage hautement aléatoire que j'ai créé sans regarder aucun hachage réel ... aucune idée si c'est bon. il faut une chaîne en entrée.
Wrapper:
la source
comparison of String with 255 failed (ArgumentError)
.gets.to_i
in the wrapper.Mathematica, 89 bytes, cracked
Not the shortest.
la source
PHP, 79 Bytes (cracked. With a comment):
This does alot of scary things via type-conversions in php, which makes it hard to predict ;) (or at least I hope so). It's not the shortest or most unreadable answer, however.
To run it you can use PHP4 and register globals (with ?i=123) or use the commandline:
la source
C# - 393 bytes cracked
Ungolfed:
I have never touched cryptography or hashing in my life, so be gentle :)
It's a simple implementation of an FNV-1a hash with some array pivoting on the input. I am sure there is a better way of doing this but this is the best I could do.
It might use a bit of memory on long inputs.
la source
Python 2, 115 bytes [Cracked already!]
OK, here's my last effort. Only 115 bytes because the final newline isn't required.
This is a complete program that inputs a decimal integer on stdin and prints a decimal hash value on stdout. Extra leading zeroes will result in different hash values, so I'll just assume that the input doesn't have any.
This works by stuffing 197-digit chunks of the input number through a modular exponentiation. Unlike some languages, the
int()
function always defaults to base 10, soint('077')
is 77, not 63.Sample outputs:
la source