Versteckte Inversionen (Räuberfaden)

16

Dies ist ein Rätsel. Den Thread der Cops finden Sie hier.

Ihre Aufgabe wird es sein, ein Anagramm der bereitgestellten Programme in dem Thread der Polizei zu finden, der seine linke Umkehrung ausführt.

Sobald Sie eine Antwort geknackt haben, posten Sie die Lösung als Antwort unten und benachrichtigen Sie den ursprünglichen Antwortenden.

Sie werden nach der Anzahl der Programme gewertet, die Sie als Erste knacken.

Weizen-Assistent
quelle

Antworten:

21

Python 3, 46 Bytes, Lynn

lambda x0223334566789:(x0223334566789*89)//178
GB
quelle
Wie "benachrichtige ich den ursprünglichen Antwortenden"?
GB
Hat einen Kommentar hinterlassen, der Ihre Antwort auf das Original verlinkt
Sefa
Sie sollten das f=am Anfang Ihres Codes löschen, da es nicht benötigt wird und nicht Teil der ursprünglichen Funktion ist
0 '
Fertig, ich habe es einfach zu schnell kopiert.
GB
16
Hier bin ich tatsächlich brachial, eine Lösung zu erzwingen (und sogar anzunehmen, dass es eine gibt), und du gehst einfach dem gesamten Problem aus dem Weg! +1
orlp
14

Python 2, 225 Bytes, orlp

p=90930641353124136621573325641513715557077985927835294018496194596645372722158;q=101979812089012306249375934082966806799688507587087308196267706260111970225882#--223444799
lambda n:pow(n,pow(65537,(p*q-2*(p+q))/4,p*q),~p*~q)

Ich schätze, ich hatte Glück, nachdem ich den ganzen Tag zufällige Primteiler erraten hatte ...

(Die Standardeinstellung für c4.8xlarge spot limit ist 4, aber ich habe es letztes Jahr geschafft, 10 zu erreichen. Ich musste die FAAS-Konfiguration von 16 Slaves auf 6 anpassen (+3 MPI, 1 Master). 20m Polyselect, 12h 50m Sieben, 2h 25m linalg, 30m sqrt. Gesamtkosten ~ 70 $. Zumindest @orlp war nett genug, um eine lösbare Größe auszuwählen, aber ich mache das nicht noch einmal! Danke an @IlmariKaronen für den letzten Schritt, und ja, ich mache Witze über die Vermutung: P)

Sp3000
quelle
Ich ... was ... Jetzt fühle ich mich schlecht, weil ich dir Geld gekostet habe :( Ich habe absichtlich eine Größe gewählt, die noch einigermaßen klein, aber zu teuer ist, um anzugreifen. Ich hätte eigentlich nicht gedacht, dass jemand Geld dafür ausgeben würde.
Orlp
1
@orlp Total lohnt sich als einmalige Erfahrung für mich. Ich hoffe, dass die Leute etwas über 512-Bit-RSA-Sicherheit in freier Wildbahn lernen :)
Sp3000
Dies ist ein echtes Engagement für das Golfen, das nicht nur Zeit, sondern auch Geld kostet! Interessant ist, dass ein Angreifer möglicherweise 512-Bit-RSA kostenlos über Cloud-Computing-Testversionen unterbrechen kann.
Meilen
@miles Ich sollte erwähnen, dass AWS Credits für Studenten hat, wenn jemand es versuchen möchte, und ich wäre nicht überrascht, wenn andere Dienste dasselbe tun würden. Daher sind Sie zumindest zum ersten Mal nicht weit von dieser Testidee entfernt. (Wenn jemand es dennoch versuchen möchte - stellen Sie sicher, dass Sie alle Volumes, AMIs usw. löschen, wenn Sie fertig sind, da sonst Speicherplatz in Rechnung gestellt wird.)
Sp3000
11

Python 2, 83 Bytes, orlp

Original:

#((()))****+,,---/2289;==oppppppqqqqqw~~
lambda n:pow(n,65537,10998167423251438693)

Riss:

p=3207399658;q=3428998126#--11
lambda n:pow(n,pow(65537,(p*q-2*(p+q))/4,p*q),~p*~q)

Probieren Sie es online!

RSA-Cracking von Wolfram Alpha . ;)

Ilmari Karonen
quelle
Mir ~p*~qist gerade -~p*-~qaufgefallen , dass es kürzer ist als , oops.
Orlp
Wie haben Sie das (p*q-2*(p+q))/4Teil jedoch zurückentwickelt? :)
Orlp
Das war der schwierigste Teil, nicht wahr? Grundsätzlich sollten Sie die Carmichael-Funktion und die Tatsache kennen, dass p/2und q/2beides ungerade Primzahlen waren, und eine Reihe von Versuchen und Irrtümern, um etwas zu finden, das mit den verfügbaren Zeichen funktionieren würde.
Ilmari Karonen
Ich habe absichtlich pund q(die wirklichen, die im Code sind p-1und q-1für Golfzwecke) so gewählt, dass (p-1)/2es das Beste ist, was wir haben φ(φ(pq)) = ((p-1)/2-1)((q-1)/2-1). Dies ermöglicht es uns, die modulare Inverse von 65537mod φ(pq)(was wir für RSA benötigen) unter Verwendung der Euler-Identität zu berechnen , was die Antwort sehr viel kürzer macht, da wir keine modulare inverse Logik oder einen Hardcode für eine andere große Konstante implementieren müssen. Abgesehen von -~q*-~p-> ~q*~phast du genau meine Funktion gefunden :)
orlp
1
Eigentlich, um eine kleine Niete zu wählen, glaube ich φ(φ(pq)) = 2((p-1)/2-1)((q-1)/2-1)für sichere Primzahlen pund q, weil φ(4) = 2. Ist λ(φ(pq)) = lcm(2, (p-1)/2-1, (q-1)/2-1)aber höchstens ((p-1)/2-1)((q-1)/2-1)/2, und ein Vielfaches davon, minus eins, ist für den Exponenten ausreichend. :)
Ilmari Karonen
7

Python 3, 80 Bytes, Wolfram

from bisect import*
q=int(input())
print(bisect([(h+1)**2 for h in range(q)],q))

Das war wirklich schwer zu knacken! Ich verwende die Halbierungsbibliothek , die in der Python 3-Distribution enthalten ist. Die bisectFunktion verwendet eine sortierte Liste und ein Element und gibt den Index ganz rechts zurück, in den das Element eingefügt werden kann, um die Reihenfolge beizubehalten. Wir geben ihm nur die Längenliste qder Quadrate ab 1und das Element q.

Zgarb
quelle
1
Ich wollte zu ändern vorschlagen (h+1)zu -~h. Dann wurde mir klar, dass das nicht der
Grund
@ETHproductions Das wäre ohnehin falsch, da der Operator Vorrang hat.
Sp3000
@ Sp3000 Huh, ich hatte keine Ahnung, dass Python **eine höhere Priorität hat als ~in. Ich nehme an, das ist besser als in JS, wo -~2**2ein Syntaxfehler auftritt ("unparenthesierter unärer Ausdruck kann nicht auf der linken Seite von '**' stehen").
ETHproductions
@ETHproductions Sie haben das tatsächlich getan, um Mehrdeutigkeiten zu vermeiden, die, wie ich hinzufügen möchte, für die meisten JS-Designs sehr untypisch sind.
Esolanging Fruit
@ Challenger5 Eigentlich müsste ich Ihnen da nicht zustimmen: TC39 hat in den letzten Jahren sehr sorgfältig darauf geachtet, dass alle neu hinzugefügten Funktionen so **eindeutig wie möglich sind (einschließlich des in ES2017 hinzugefügten Operators)
ETHproductions
6

Javascript, 21 Bytes, Arnauld

Original

b=>Math.pow(b,torc=3)

Riss

o=>Math.cbrt(o,pbw=3)

Gibt die Kubikwurzel zurück.

Emigna
quelle
Es geht los! ;)
Arnauld
@ Arnauld: Ich finde es etwas seltsam, dass Sie mit JS Funktionen mit mehr Argumenten aufrufen können, als sie definiert sind. Ich frage mich, was der Gedanke dahinter ist.
Emigna
6
Sie haben recht, JS erlaubt das von Grund auf. Zusätzliche Argumente gehen jedoch nicht vollständig verloren, da sie im arguments-Objekt gespeichert sind, auf das die Funktion manuell zugreifen kann.
Arnauld
5

7, 9 Bytes, ais523

00000000: 0173 dc25 7e13 dcb6 1f                   .s.%~....

Weil rohe Gewalt immer gewinnt und 9! ist nur 362880

GB
quelle
4

Processing.js, 59 Bytes, Kritixi Lithos

Original:

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Riss:

int loabewuteg(float p,i){return (i+0**+0,(p/17/(-4*-3)));}

Das war einfach genug. Das Schwierigste war, herauszufinden, wo die zusätzlichen Kommas und Sternchen angebracht werden sollten. Glücklicherweise scheint die Verarbeitung zusätzliche unbenutzte Funktionsparameter sowie C-Komma-Ausdrücke zuzulassen.

Ilmari Karonen
quelle
1
Anscheinend war der von mir verknüpfte Dolmetscher falsch. Tatsächlich werden die meisten (oder sogar alle) Online-Dolmetscher wahrscheinlich falsch liegen, da Processing-java in Processing.js vorkompiliert wird. Momentan denke ich, dass die beste Vorgehensweise für mich und Sie darin besteht, unsere Antworten auf "Processing.js" anstatt auf "Processing" zu ändern, da Ihre Antwort dann gültig ist (Processing-Java gibt Unmengen von Fehlern aus). Ich werde eine separate Antwort mit demselben Code wie Processing-java posten, aber der Nest-Interpreter würde dies von processing.org installieren. Trotzdem gut gemacht!
Kritixi Lithos
4

JavaScript (ES6), 63 Byte, SLuck49

Original:

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Riss:

x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)

Der obige base64-Code dekodiert:



Math.pow(x-1,0.5) //...

bei dem die ... steht das für eine Menge zufälligen Mülls, der vom JS-Interpreter ignoriert wird, da er in einem Kommentar steht.

Ich habe diese Lösung durch Ausprobieren gefunden. Am Ende waren die beiden Zeilenumbrüche am Anfang des Codes der einzige wirklich knifflige Teil, der benötigt wurde, um den Rest korrekt auszurichten und die Base64-Kodierung in etwas umzuwandeln, das Mim Mathursprünglichen Zeichensatz verfügbar war. Ich habe zuerst Leerzeichen ausprobiert, aber " M"base64-encodes into "ICBN"und ich brauchte das einzig verfügbare B, um ".po"später im Code zu encodieren . "0+M", "1*M", "1?M"Oder andere ähnliche no-op - Präfixe ich habe auch nicht denken konnte arbeiten, aber Zeilenumbrüche tat.

Ich vermute, das ist vielleicht nicht genau die beabsichtigte Lösung, aber was auch immer - es funktioniert. :)

Demo:

var f = x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)
var g = x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)
for (var i = -0; i <= 10; i++) console.log(i, '->', f(i), '->', g(f(i)))

Ilmari Karonen
quelle
Ich hatte gehofft, dass es etwas schwieriger wird, die zusätzlichen Charaktere an den Start zu bringen
SLuck49,
Beeindruckend :) Ich bin genau so vorgegangen, habe aber nicht daran gedacht, Newline auszuprobieren. Ich habe versucht, ein C anderswo zu verlieren, kam aber nicht weiter.
Chris M
3

Brain-Flak, 26 Bytes, Weizen-Zauberer

Original (fügt 13 hinzu)

((((()()())){}[()]){}{}{})

Riss (subtrahiert 13)

([(((()())()){}){}{}](){})
0 '
quelle
3

J, 8 Bytes, Meilen

[:]-:[+:

Einfaches Austauschen von +:for -:(double für halfve).

Conor O'Brien
quelle
Also you can swap the left and right verbs: [:[+:]-:.
randomra
3

Python 2, 47 bytes, Wheat Wizard

lambda x:sorted(a**2for a in range(x)).index(x)
nmjcman101
quelle
Good job! You found the exact solution I had in mind
Wheat Wizard
3

JavaScript (ES6), 46 bytes, SLuck49

Original (calculates ln(x+1))

x=>Math.log(x+(+String(t=985921996597669)[5]))

Crack

x=>Math[(lg=19979699+55686).toString(9+25)](x)

I never would have cracked this if I hadn't realized that the inverse is a Math built-in. (lg=19979699+55686).toString(9+25) is just a convoluted way of returning "expm1".

ETHproductions
quelle
Nicely done! Yeah I was looking through the functions on Math to decide what to use, saw expm1, and said "Wait, that's a thing?"
SLuck49
2

J, 10 bytes, miles

1%:@*~>:[<

I have to write something here because the answer is too short.

G B
quelle
2

J, 29 bytes, Zgarb

Original

5#.[:,(3 5&#:(-$]-)7)#.inv"0]

Crack

[:(](07-5)"3 #.-:&#$,)5#.inv]

Try it online!

Another crack equivalent is

[:((3 ]7-5)#.-:&#$,)5#.inv"0]

Explanation

[:(](07-5)"3 #.-:&#$,)5#.inv]  Input: integer n
                            ]  Get n
                      5        The constant 5
                       #.inv   Get the digits of n in base 5
[:(                  )         Operate on those digits D
                    ,            Flatten D (does nothing since it is already a list)
                  #              Get the length of D
               -:&               Halve it
                   $             Reshape D to half its length (only the base 2 digits)
    (07-5)"3                     The constant 2 with rank 3
             #.                  Convert the front-half of D to a decimal from base 2
   ]                             Return the right result
miles
quelle
Yep, that works! It's a bit different from my solution, but there's a lot of leeway. The basic logic is the same though.
Zgarb