Inversions cachées (Thread 'Thread)

16

Ceci est un puzzle de , le fil des flics peut être trouvé ici.

Votre tâche sera de trouver une anagramme des programmes fournis dans le fil des flics qui effectue son inverse gauche.

Une fois que vous avez craqué une réponse, publiez la solution comme réponse ci-dessous et informez le répondeur d'origine.

Vous serez noté sur le nombre de programmes que vous êtes le premier à cracker.

Post Rock Garf Hunter
la source

Réponses:

21

Python 3, 46 octets, Lynn

lambda x0223334566789:(x0223334566789*89)//178
GB
la source
Comment "informer le répondeur d'origine"?
GB
A laissé un commentaire reliant votre réponse à l'original
Sefa
Vous devez supprimer le f=au début de votre code car il n'est pas nécessaire et ne fait pas partie de la fonction d'origine
0 '16
Terminé, je viens de le copier-coller trop rapidement.
GB
16
Ici, je suis en train de forcer une solution (et même en supposant qu'une existe) et vous évitez tout le problème! +1
orlp
14

Python 2, 225 octets, orlp

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

Je suppose que j'ai eu de la chance après avoir deviné des diviseurs premiers aléatoires toute la journée ...

(La limite de spot par défaut c4.8xlarge est de 4, mais j'ai réussi à la ramener à 10 l'année dernière. J'ai dû modifier la configuration FAAS de 16 esclaves à 6 (+3 mpi, 1 maître). 20m polyselect, 12h 50m tamisage, 2h 25m linalg, 30m sqrt. Coût total ~ 70 $. Au moins @orlp était assez sympa pour choisir une taille soluble, mais je ne recommence pas! Merci à @IlmariKaronen pour la dernière étape, et oui je plaisante sur le deviner: P)

Sp3000
la source
Je .. quoi ... Maintenant, je me sens mal de vous avoir coûté de l'argent :( J'ai intentionnellement choisi une taille qui serait encore raisonnablement petite mais trop coûteuse à attaquer. Je ne pensais pas vraiment que quelqu'un dépenserait de l'argent pour cela.
orlp
1
@orlp Ça vaut vraiment le coup comme une expérience unique pour moi. J'espère que les gens en apprendront quelque chose sur la sécurité RSA 512 bits dans la nature :)
Sp3000
C'est un vrai dévouement au golf, dépensant non seulement du temps mais de l'argent! Il est intéressant de noter qu'un attaquant pourrait potentiellement casser gratuitement RSA 512 bits via des essais de service de calcul cloud.
miles
@miles Je dois mentionner qu'AWS a du crédit pour les étudiants si quelqu'un veut essayer, et je ne serais pas surpris si d'autres services faisaient de même. Par conséquent, vous n'êtes probablement pas loin de cette idée d'essais, du moins pour la première fois. (Si quelqu'un veut essayer - assurez-vous de supprimer tous les volumes, AMI, etc. une fois que vous avez terminé, sinon vous serez facturé pour le stockage)
Sp3000
11

Python 2, 83 octets, orlp

Original:

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

Fissure:

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

Essayez-le en ligne!

Craquage RSA effectué par Wolfram Alpha . ;)

Ilmari Karonen
la source
Je viens de réaliser que ~p*~qc'est plus court que -~p*-~q, oups.
orlp
Comment avez-vous procédé au reverse engineering de la (p*q-2*(p+q))/4pièce? :)
orlp
C'était la partie la plus délicate, n'est-ce pas? Fondamentalement, la connaissance de la fonction Carmichael et le fait que p/2et q/2étaient tous les deux des nombres impairs, et un tas d'essais et d'erreurs pour trouver quelque chose qui fonctionnerait en utilisant les caractères disponibles.
Ilmari Karonen
J'ai intentionnellement choisi pet q(les vrais, celui dans le code sont p-1et q-1à des fins de golf) tel qui (p-1)/2est primordial pour nous φ(φ(pq)) = ((p-1)/2-1)((q-1)/2-1). Cela nous permet de calculer l'inverse modulaire de 65537mod φ(pq)(ce dont nous avons besoin pour RSA) en utilisant l'identité d'Euler, ce qui rend la réponse beaucoup plus courte car nous n'avons pas besoin d'implémenter une logique inverse modulaire ou de coder en dur une autre grande constante. Hormis le -~q*-~p-> ~q*~p, vous avez trouvé exactement ma fonction :)
orlp
1
En fait, pour choisir un nit mineur, je crois φ(φ(pq)) = 2((p-1)/2-1)((q-1)/2-1)pour des nombres premiers sûrs pet q, parce que φ(4) = 2. Mais λ(φ(pq)) = lcm(2, (p-1)/2-1, (q-1)/2-1)est tout au plus ((p-1)/2-1)((q-1)/2-1)/2, et tout multiple de cela, moins un, fera l'affaire pour l'exposant. :)
Ilmari Karonen
7

Python 3, 80 octets, Wolfram

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

C'était vraiment difficile à casser! J'utilise la bibliothèque bisect , qui est incluse dans la distribution Python 3. La bisectfonction prend une liste triée et un élément, et retourne l'index le plus à droite où l'élément pourrait être inséré pour maintenir l'ordre. Nous lui donnons simplement la qliste des carrés à partir de 1et l'élément q.

Zgarb
la source
1
J'allais suggérer de changer (h+1)pour -~h. Ensuite, j'ai réalisé que ce n'était pas le but de ce défi: P
ETHproductions
@ETHproductions Ce serait de toute façon incorrect en raison de la priorité de l'opérateur.
Sp3000
@ Sp3000 Huh, je n'avais aucune idée qui **a une priorité plus élevée qu'en ~Python. Je suppose que c'est mieux que dans JS, où -~2**2jette une erreur de syntaxe ("l'expression unaire non parenthèse ne peut pas apparaître sur le côté gauche de '**'").
ETHproductions
@ETHproductions Ils l'ont fait pour éviter les ambiguïtés, ce qui, comme je pourrais ajouter, n'est pas très caractéristique de la plupart des conceptions JS.
Esolanging Fruit
@ Challenger5 En fait, je serais en désaccord avec vous là-bas: ces dernières années, TC39 a été extrêmement prudent pour s'assurer que toutes les nouvelles fonctionnalités ajoutées sont aussi totalement exemptes d'ambiguïtés que possible (ce qui inclut l' **opérateur, ajouté dans ES2017)
ETHproductions
6

Javascript, 21 octets, Arnauld

Original

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

Fissure

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

Renvoie la racine du cube.

Emigna
la source
Voilà! ;)
Arnauld
@Arnauld: Je trouve un peu bizarre que JS vous permette d'appeler des fonctions avec plus d'arguments que ce pour quoi elles sont définies. Je me demande quelle est la pensée derrière cela.
Emigna
6
Vous avez raison, JS le permet par conception. Cependant, les arguments supplémentaires ne sont pas complètement perdus, car ils sont stockés dans l' objet arguments auquel la fonction peut accéder manuellement.
Arnauld
5

7, 9 octets, ais523

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

Parce que la force brute gagne toujours, et 9! est seulement 362880

GB
la source
4

Processing.js, 59 octets, Kritixi Lithos

Original:

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

Fissure:

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

Eh bien, c'était assez facile. La partie la plus difficile a été de savoir où coller les virgules et les astérisques supplémentaires. Heureusement, il semble que Processing autorise des paramètres de fonction supplémentaires non utilisés ainsi que des expressions de virgule de style C.

Ilmari Karonen
la source
1
Apparemment, l'interprète que j'ai lié avait tort. En fait, la plupart (ou même tous) les interprètes en ligne vont probablement se tromper puisque Processing-java est précompilé dans Processing.js. En ce moment, je pense que la meilleure solution serait pour moi et vous de changer nos réponses en "Processing.js" au lieu de Processing car alors votre réponse serait valide (Processing-java donne des tonnes d'erreurs). Je posterai une réponse séparée avec le même code que Processing-java, mais pour cela, l'interpréteur de nid serait de l'installer à partir de processing.org. Bravo quand même!
Kritixi Lithos
4

JavaScript (ES6), 63 octets, SLuck49

Original:

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Fissure:

x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)

Le code base64 ci-dessus décode pour:



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

où le ... représente un tas d'ordures aléatoires qui est ignoré par l'interpréteur JS, car il est dans un commentaire.

J'ai trouvé cette solution par essais et erreurs. En fin de compte , la seule partie vraiment difficile étaient les deux nouvelles lignes au début du code, nécessaires pour rendre la ligne de repos correctement et pour obtenir le Mdans Mathde base64 encode en quelque chose qui était disponible dans le jeu de caractères d' origine. J'ai d'abord essayé les espaces, mais " M"base64-encode dans "ICBN"et j'avais besoin du seul disponible Bpour encoder ".po"plus tard dans le code. "0+M", "1*M", "1?M"Ou tout autre préfixes sans op semblables que je pouvais penser ne fonctionnait pas non plus , mais les nouvelles lignes ont fait.

Je soupçonne que ce n'est peut-être pas exactement la solution prévue, mais peu importe - cela fonctionne. :)

Démo:

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
la source
Bon travail pour trouver quelque chose qui fonctionnait, j'avais espéré que mettre les caractères supplémentaires au début rendrait cela un peu plus difficile
SLuck49
Impressionnant :) J'ai pris exactement la même approche mais je n'ai pas pensé à essayer la nouvelle ligne. J'essayais de perdre un C ailleurs mais je n'arrivais à rien.
Chris M
3

Brain-Flak, 26 octets, Assistant de blé

Original (ajoute 13)

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

Crack (soustrait 13)

([(((()())()){}){}{}](){})
0 '
la source
3

J, 8 octets, miles

[:]-:[+:

Échange simple de +:for -:(double for half).

Conor O'Brien
la source
Vous pouvez également échanger les verbes à gauche et à droite: [:[+:]-:.
randomra
3

Python 2, 47 octets, Assistant de blé

lambda x:sorted(a**2for a in range(x)).index(x)
nmjcman101
la source
Bon travail! Vous avez trouvé la solution exacte que j'avais en tête
Post Rock Garf Hunter
3

JavaScript (ES6), 46 octets, SLuck49

Original (calcule ln (x + 1))

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

Fissure

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

Je n'aurais jamais craqué cela si je n'avais pas réalisé que l'inverse est Mathintégré . (lg=19979699+55686).toString(9+25)est juste une façon compliquée de revenir "expm1".

ETHproductions
la source
Bien fait! Oui, je regardais les fonctions de Math pour décider quoi utiliser, j'ai vu expm1et j'ai dit "Attendez, c'est une chose?"
SLuck49
2

J, 10 octets, miles

1%:@*~>:[<

Je dois écrire quelque chose ici parce que la réponse est trop courte.

GB
la source
2

J, 29 octets, Zgarb

Original

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

Fissure

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

Essayez-le en ligne!

Un autre équivalent de crack est

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

Explication

[:(](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
la source
Oui, ça marche! C'est un peu différent de ma solution, mais il y a beaucoup de latitude. La logique de base est cependant la même.
Zgarb