Dieser Wettbewerb ist vorbei.
Aufgrund der Art der Cops-and-Robbers- Herausforderungen wird die Cops-Herausforderung viel einfacher, wenn das Interesse an der zugehörigen Robbers-Herausforderung nachgelassen hat. Obwohl Sie weiterhin Hash-Funktionen bereitstellen können, wird Ihre Antwort daher nicht akzeptiert oder ist Teil der Rangliste.
Diese Herausforderung ist eine Suche nach der kürzesten Implementierung einer Hash - Funktion , die ist resistent gegen Kollisionen , also sollte es nicht machbar sein , zwei verschiedene Nachrichten mit dem gleichen Hash zu finden.
Als Cop versuchen Sie, eine Hash-Funktion zu erfinden und zu implementieren, um den besten Kompromiss zwischen Codegröße und Kollisionsfestigkeit zu finden. Verwenden Sie zu viele Bytes und ein anderer Polizist wird Sie überraschen!
Als Räuber versuchen Sie, die Versuche der Bullen zu vereiteln, indem Sie ihre Funktionen knacken und beweisen, dass sie ungeeignet sind. Dies wird sie zwingen, mehr Bytes zu verwenden, um ihre Algorithmen zu stärken!
Polizisten fordern heraus
Aufgabe
Implementieren Sie eine kryptografische Hash-Funktion H: I -> O Ihrer Wahl, wobei I die Menge aller nicht negativen Ganzzahlen unter 2 2 30 und O die Menge aller nicht negativen Ganzzahlen unter 2 128 ist .
Sie können H entweder als eine tatsächliche Funktion implementieren , die eine einzelne Ganzzahl, eine Zeichenfolgendarstellung einer Ganzzahl oder eines Arrays von Ganzzahlen akzeptiert und zurückgibt, oder als ein vollständiges Programm, das aus STDIN liest und in STDOUT in Basis 10 oder 16 druckt.
Wertung
H dass sie die zu wider Räuber Herausforderung unten definiert.
Wenn ein Räuber Ihre Übermittlung in den ersten 168 Stunden nach dem Posten besiegt, gilt sie als geknackt .
Die Implementierung von H sollte so kurz wie möglich sein. Die kürzeste ungerissene Einsendung ist der Gewinner der Cops Challenge.
Zusätzliche Regeln
Wenn Sie H als Funktion implementieren , stellen Sie bitte einen Wrapper bereit, um die Funktion in einem Programm auszuführen, das sich wie oben beschrieben verhält.
Bitte geben Sie mindestens drei Testvektoren für Ihr Programm oder Ihren Wrapper an (Beispieleingaben und die entsprechenden Ausgaben).
H kann Ihr neuartiges Design (bevorzugt) oder ein bekannter Algorithmus sein, solange Sie es selbst implementieren. Es ist verboten, eingebaute Hash-Funktionen, Komprimierungsfunktionen, Chiffren, PRNG usw. zu verwenden.
Jedes zur Implementierung von Hashing-Funktionen (z. B. Basiskonvertierung) verwendete integrierte Element ist ein faires Spiel.
Die Ausgabe Ihres Programms oder Ihrer Funktion muss deterministisch sein.
Es sollte einen kostenlosen (wie in Beer) Compiler / Interpreter geben, der auf einer x86- oder x64-Plattform oder in einem Webbrowser ausgeführt werden kann.
Ihr Programm oder Ihre Funktion sollte einigermaßen effizient sein und muss in weniger als einer Sekunde eine Meldung in I unter 2 2 19 haben .
Für Edge-Fälle ist die auf meinem Computer (Intel Core i7-3770, 16 GiB RAM) benötigte (Wand-) Zeit entscheidend.
Angesichts der Art dieser Herausforderung ist es verboten, den Code Ihrer Antwort in irgendeiner Weise zu ändern, unabhängig davon, ob dies die Ausgabe verändert oder nicht.
Wenn Ihr Beitrag geknackt wurde (oder auch nicht), können Sie eine zusätzliche Antwort posten.
Wenn Ihre Antwort ungültig ist (z. B. nicht mit der E / A-Spezifikation übereinstimmt), löschen Sie sie bitte.
Beispiel
Python 2.7, 22 Bytes
def H(M): return M%17
Verpackung
print H(int(input()))
Räuber herausfordern
Aufgabe
Knacken jeden der Kopse Vorbringen durch die Veröffentlichung der folgenden in dem Räuber thread : zwei Nachrichten M und N in I , so dass H (M) = H (N) und M ≠ N .
Wertung
Wenn Sie jeden Cop-Beitrag knacken, erhalten Sie einen Punkt. Der Räuber mit den meisten Punkten gewinnt.
Bei einem Gleichstand gewinnt der Räuber, der die längste Einreichung geknackt hat.
Zusätzliche Regeln
Jeder Cop-Beitrag kann nur einmal geknackt werden.
Wenn sich ein Cop-Beitrag auf implementierungsdefiniertes oder undefiniertes Verhalten stützt, müssen Sie nur einen Riss finden, der (nachweislich) auf Ihrem Computer funktioniert.
Jeder Riss gehört zu einer eigenen Antwort im Räuber-Thread.
Wenn Sie einen ungültigen Cracking-Versuch veröffentlichen, können Sie diesen bestimmten Beitrag 30 Minuten lang nicht mehr knacken.
Sie können Ihre eigene Vorlage nicht knacken.
Beispiel
Python 2.7, 22 Bytes von user8675309
1
und
18
Bestenliste
Sichere Einsendungen
Nicht geknackte Einsendungen
Mit diesem Stapel-Snippet können Sie eine Liste der noch nicht geknackten Antworten abrufen.
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>
Antworten:
CJam, 21 Bytes
Nimmt eine Folge von Bytes als Eingabe.
Im Pseudocode:
Beispiel-Hashes:
"" (leere Zeichenfolge) -> 1
"Test" -> 2607833638733409808360080023081587841
"Test" -> 363640467424586895504738713637444713
Es mag ein bisschen einfach sein, der Ausgabebereich ist nur etwas mehr als 122 Bits, die dreifache Iterationsverstärkung ist bereits ein bisschen kaputt, da sie jedes Mal genau das Gleiche tut, also geben Sie ein, das im ersten Schritt auf 1 geht Iteration wird eine vollständige Pause sein. Aber es ist kurz und es macht keinen Spaß, zu sicher zu sein.
quelle
Python, 109 Bytes [ geknackt , und wieder ]
Ich habe versucht, Jenkins 'einzelne Funktion so zu implementieren , wie sie ist, mit dem einzigen Unterschied, dass es sich um den Startwert und die Anzahl der Bits handelt.
Lustige Tatsache: Anscheinend hat Perl irgendwann den Jenkins-Hash benutzt .
Verpackung
Beispiele
quelle
C ++, 148 Bytes
__uint128_t ist eine GCC-Erweiterung und funktioniert wie erwartet. Der Hash basiert auf der Iteration von FNV-Hash (ich habe ihre Primzahl ausgeliehen, obwohl
a
es sich um die ersten Ziffern von Pi in hex handelt) mit einer sha1-ähnlichen Rotation zu Beginn jeder Iteration. Das Kompilieren mit-O3
, das Hashing einer 10MB-Datei dauert weniger als 2 Sekunden, daher gibt es immer noch einen Spielraum, um die Iterationen in der inneren Schleife zu verbessern - aber ich fühle mich heute großzügig.Deaktiviert (geänderte Variablennamen, hinzugefügte Kommentare, Leerzeichen und ein Paar geschweifte Klammern) für Ihr knackiges Vergnügen:
Golfvorschläge sind willkommen (auch wenn ich den darauf basierenden Code nicht verbessern kann).
edit: Tippfehler im de-uglified Code behoben (Golf-Version bleibt unverändert).
quelle
o
scheint nicht initialisiert zu sein. Wooutput
ist deklariert? Oder vielleichto
dochoutput
?n
. Haben Sie den auszuführenden "de-uglified" Code tatsächlich überprüft?U i=81;i-=3
hätte noch abscheulicher sein können, ohne nennenswerte Laufzeitkosten.CJam, 44 Bytes [ geknackt ]
Die Eingabe erfolgt in Basis 10.
CJam ist langsam. Ich hoffe, es läuft in 1 Sekunde in einem Computer ...
Erklärungen
Nun, die zweidimensionalen Dinge schienen eine Schwäche zu sein ... Am Anfang sollten einige langsame Berechnungen schneller gemacht werden. Aber es kann nicht in einer Sekunde ausgeführt werden, egal was ich tue, also habe ich den langsamen Code endgültig entfernt.
Es sollte auch besser sein, wenn ich binäre Bits und höhere Basen verwendet habe.
C-Version
quelle
C ++, 182 Zeichen (+ ca. 51 Zeichen Kesselschild)
Kesselplatte:
Runnable-Programm mit Golffunktion
quelle
__uint128_t
erst herausgefunden, nachdem ich dies implementiert hatte.Pyth, 8 Gebrochen
Probieren Sie es online aus
Eine dumme Antwort, ich werde erklären, wie es funktioniert, weil die meisten Leute Pyth nicht lesen können. Dabei wird das natürliche Protokoll von eins plus der Eingabe in eine Zeichenfolge konvertiert. Diese Zeichenfolge wird umgekehrt, ausgewertet und dann in eine Ganzzahl konvertiert.
Eine Python-Übersetzung würde so aussehen:
quelle
Python 3, 216 Bytes [ geknackt ]
Aufgrund einer Inkompatibilität mit der Spezifikation kann ich mir mindestens eine leichte Sicherheitslücke vorstellen, aber ansonsten denke ich, dass dies mindestens ein Brute-Force-Beweis ist. Ich habe unter anderem die ersten 10 Millionen Hashes überprüft.
In Bezug auf Golf wäre dies in Python 2 kürzer, aber ich habe einige Bytes für die Effizienz geopfert (da es wahrscheinlich sowieso nicht gewinnen wird).
Edit: Dies war mein Versuch, den Very Smooth Hash zu implementieren , aber leider waren 128-Bit viel zu klein.
Verpackung
Beispiele
Code Erklärung
Ein Beispiel für die Polsterung für
f(6)
:quelle
C, 87 Bytes [ geknackt ]
Dies ist das vollständige Programm; Kein Wrapper erforderlich. Akzeptiert Binäreingaben über stdin und gibt einen hexadezimalen Hash an stdout aus.
Hiermit wird nur ein 64-Bit-Hash berechnet, sodass ich hier ein bisschen zocke.
Falls sich jemand wundert, die beiden Konstanten
'foo+'
und'bar/'
sind die Primzahlen 1718578987 und 1650553391.Beispiele:
Ignoriert führende Nullen:
Einzelbyte-Eingänge:
Mehrbyte-Eingänge:
quelle
foo|
(d5c9bef71d4f5d1b) undfoo\
(d5c9bef71d4f5d1b) erzeugen SEHR ähnliche Hashes.\x00
und\x00\x00
!J - 39 Bytes - geknackt
Funktion, die einen String als Eingabe nimmt und eine Ganzzahl <2 128 zurückgibt . Ich gehe davon aus, dass wir unsere Funktion benennen müssen, um gültig zu sein, also lassen Sie weitere 3 Zeichen aus der Zählung aus, wenn wir anonyme Funktionen einreichen können.
Für diejenigen unter Ihnen, die keine Hieroglyphen lesen, ist hier ein Überblick darüber, was ich tue.
a=.(2^128x)&|@^/@
Dies ist eine Unterroutine *, die ein Array von Zahlen aufnimmt und es dann als Power Tower behandelt, in dem die Potenzierung mod 2 128 genommen wird . Mit "Power Tower" meine ich, wenn Sie ihm den Input geben würden3 4 5 6
, würde er berechnen3 ^ (4 ^ (5 ^ 6))
.(".p:@+5,9:)a
Diese Funktion nimmt einen String, konvertiert ihn in die Zahl N und berechnet dann die ( n +5) -te und ( n +9) -te Primzahl und wirft dann diea
von vorher darauf. Das heißt, wir findenp(n+5) ^ p(n+9)
Mod 2 128, wop(k)
diek
-te Primzahl ist.H=:_8...\(a...)]
Führen Sie die obige Funktion für 8-stellige Unterblöcke der Eingabe und danna
alle Ergebnisse zusammen aus und rufen Sie die resultierende Hash-Funktion aufH
. Ich benutze 8 Zeichen, weil Js "k
-th prime" -Funktion fehlschlägt, wennp(k)
> 2 31 , dhk=105097564
der größte Safe istk
.Haben Sie einige Beispielausgaben. Sie können dies online unter tryj.tk ausprobieren , ich empfehle jedoch, dies zu Hause zu tun, indem Sie den Interpreter von Jsoftware herunterladen .
* Technisch gesehen ist es keine Funktion für sich, sondern hängt mit anderen Funktionen zusammen und wirkt sich auf deren Ausgabe aus. Dies ist jedoch eine semantische Frage von J, kein begrifflicher Unterschied: Der Programmablauf ist so, wie ich es oben beschrieben habe.
quelle
Python 3, 118 Bytes [ geknackt ]
Einrückung ist eine einzelne Registerkarte. Einfaches Hash, habe es noch nicht gründlich getestet.
Rufen Sie wie folgt an:
Ergebnis:
73117705077050518159191803746489514685
quelle
ord(c)
eigentlich reicht jeder String :) (mit Ausnahme von Dingen wie nul chars denke ich, dass diese Hash-Kollisionen wirklich einfach machen. Also bleiben Sie bei einem 0-9-String.)C ++, 239 Bytes
Mein allererster Code Golf! [ Bitte sei sanft ]
Ungolfed-Version:
Nicht der beste Hash und definitiv nicht der kürzeste existierende Code. Golftipps annehmen und auf Besserung hoffen!
Verpackung
Wahrscheinlich nicht die beste der Welt, aber dennoch eine Hülle
quelle
printf '33333333\x40\xF3\x32\xD6\x56\x91\xCA\x66' | ./hash7_
->a4baea17243177fd
;printf '33333333\x77\x39\xF3\x82\x93\xDE\xA7\x2F' | ./hash7_
->a4baea17243177fd
. Der Bruteforcer findet Kollisionen hier viel schneller als in anderen 64-Bit-Hashes.Java,
299291282 Bytes, geknackt.Führt einige Operationen an BigIntegers durch und übernimmt dann das Ergebnis modulo 2 128 .
quelle
public
selbst entfernen und dabei 7 Zeichen sparen?C, 128 Bytes [ geknackt ]
Dies ist mehr oder weniger derselbe Algorithmus wie bei meinem letzten Versuch (geknackt von Vi.) , Aber jetzt sind genügend Hamsterräder vorhanden, um korrekte 128-Bit-Hashes zu generieren.
Die vier Hauptkonstanten im Code lauten wie folgt:
Dies ist nach wie vor ein vollständiges Programm, für das kein Wrapper erforderlich ist. Die ganze Zahl I wird über stdin als binäre Rohdaten (Big-Endian) eingegeben, und der Hash O wird in hexadezimal bis stdout gedruckt. Führende Nullen in I werden ignoriert.
Beispiele:
quelle
C, 122 Bytes [ geknackt ]
Verschachtelte Schleifen, halb Assed LCGs und Variable Swapping. Was gibt es nicht zu lieben?
Hier ist eine ungolfspielte Version zum Herumspielen:
Dies ist ein vollständig eigenständiges Programm, das aus STDIN liest und in STDOUT druckt.
Beispiel:
In einigen einfachen Benchmarks werden ca. 3 MB / s Textdaten gehasht. Die Hash-Geschwindigkeit hängt von den Eingabedaten selbst ab, daher sollte dies wahrscheinlich berücksichtigt werden.
quelle
PHP 4.1, 66 Bytes [ geknackt ]
Ich wärme mich nur auf.
Ich hoffe, Sie finden das interessant.
Ich habe versucht, es Zahlen so groß wie 9999999999999999999999999.
Die Ausgabe schien im Bereich von 2 128 zu liegen.
PHP 4.1 wird aufgrund der
register_globals
Direktive benötigt.Dabei werden automatisch lokale Variablen aus der Sitzung, POST, GET, REQUEST und Cookies erstellt.
Es benutzt den Schlüssel
a
. (ZB: Zugang überhttp://localhost/file.php?a=<number>
).Wenn Sie es mit PHP 4.2 und neuer testen möchten, versuchen Sie Folgendes:
Diese Version funktioniert nur mit POST und GET.
Beispielausgabe:
(Ich versichere Ihnen, dass es Zahlen gibt, die denselben Hash erzeugen).
quelle
C, 134 Bytes, gerissen
Dies ist das vollständige C-Programm.
Was es tut: Die Idee ist, die Eingabe als Byte-Array zu nehmen und am Ende pseudozufällige (aber deterministische) Bytes anzuhängen, um die Länge auf ungefähr 2 2 30 (etwas mehr) zu bringen. Die Implementierung liest die eingegebenen Daten byteweise und beginnt mit der Verwendung von Pseudozufallsdaten, wenn sie das erste Zeichen findet, das keine Ziffer ist.
Da eingebautes PRNG nicht erlaubt ist, habe ich es selbst implementiert.
Es gibt ein undefiniertes / implementierungsdefiniertes Verhalten, das den Code kürzer macht (der endgültige Wert sollte vorzeichenlos sein und ich sollte verschiedene Typen für verschiedene Werte verwenden). Und ich konnte 128-Bit-Werte in C nicht verwenden. Weniger verschleierte Version:
quelle
Python 2.X - 139 Bytes [[ Gebrochen ]]
Dies ist allen anderen Hashes (LOOP, XOR, SHIFT, ADD) sehr ähnlich. Komm hol deine Räuberpunkte;) Ich mache eine schwierige Frage, nachdem diese gelöst ist.
Wrapper (erwartet ein Argument in base-16, auch als hexadezimal bezeichnet):
quelle
H(2**(2**10))
dauerte es ungefähr 8 oder 9 Sekunden, während esH(2**(2**12))
ungefähr 29 Sekunden undH(2**(2**14))
mehr als zwei Minuten dauerte.Python 2.7 - 161 Bytes [[ Gebrochen ]]
Nun, da ich es geschafft habe, meine erste Hash-Funktion vor dem Posten in eine nutzlose Version zu verwandeln, denke ich, dass ich eine andere Version einer ähnlichen Struktur posten werde. Diesmal habe ich es gegen triviale Kollisionen getestet und die meisten möglichen Eingabegrößen auf Geschwindigkeit getestet.
Wrapper (nicht im Bytecount enthalten)
Beispiel ausführen (Eingabe ist immer eine Hexadezimalzahl):
quelle
Ruby, 90 Bytes
Ein sehr zufälliger Hash-Algorithmus, den ich erfunden habe, ohne mir echte Hashes anzusehen ... keine Ahnung, ob er gut ist. Als Eingabe wird eine Zeichenfolge verwendet.
Verpackung:
quelle
comparison of String with 255 failed (ArgumentError)
.gets.to_i
in der Verpackung.Mathematica, 89 Bytes, geknackt
Nicht die kürzeste.
quelle
PHP, 79 Bytes (geknackt. Mit einem Kommentar):
Dies macht eine Menge furchterregender Dinge durch Typkonvertierungen in PHP, was es schwierig macht, dies vorherzusagen;) (oder zumindest hoffe ich es). Dies ist jedoch nicht die kürzeste oder unleserlichste Antwort.
Um es auszuführen, können Sie PHP4 verwenden und Globals registrieren (mit? I = 123) oder die folgende Befehlszeile verwenden:
quelle
C # - 393 Bytes geknackt
Ungolfed:
Ich habe noch nie Kryptografie oder Hashing in meinem Leben angefasst, also sei vorsichtig :)
Es ist eine einfache Implementierung eines FNV-1a- Hashes mit einem Array, das am Eingang schwenkt. Ich bin mir sicher, dass es einen besseren Weg gibt, aber das ist das Beste, was ich tun kann.
Bei langen Eingaben wird möglicherweise etwas Speicher benötigt.
quelle
Python 2, 115 Bytes [Bereits geknackt!]
OK, hier ist meine letzte Anstrengung. Nur 115 Bytes, da die letzte Zeile nicht benötigt wird.
Dies ist ein vollständiges Programm, das eine Dezimalzahl in stdin eingibt und einen Dezimal-Hashwert in stdout ausgibt. Zusätzliche führende Nullen führen zu unterschiedlichen Hash-Werten, daher gehe ich einfach davon aus, dass die Eingabe keine hat.
Dies funktioniert, indem 197-stellige Teile der eingegebenen Nummer durch eine modulare Exponentiation gefüllt werden. Im Gegensatz zu einigen Sprachen ist die
int()
Funktion immer standardmäßig auf Basis 10 eingestelltint('077')
77 und nicht 63.Beispielausgaben:
quelle