Hidden Inversions (เธรดโจร)


16

นี่คือปริศนา , ด้ายตำรวจสามารถพบได้ที่นี่

งานของคุณคือค้นหาแอนนาแกรมของโปรแกรมที่ให้ไว้ในเธรดของตำรวจที่ดำเนินการผกผันด้านซ้าย

เมื่อคุณถอดรหัสคำตอบโพสต์วิธีการแก้ปัญหาเป็นคำตอบด้านล่างและแจ้งให้ผู้ตอบเดิม

คุณจะได้คะแนนตามจำนวนของโปรแกรมที่คุณเป็นคนแรกที่ถอดรหัส

คำตอบ:


21

Python 3, 46 ไบต์, Lynn

lambda x0223334566789:(x0223334566789*89)//178

ฉันจะ "แจ้งผู้ตอบเดิม" ได้อย่างไร?
GB

ทิ้งความคิดเห็นที่เชื่อมโยงคำตอบของคุณไว้กับต้นฉบับ
Sefa

คุณควรวางf=รหัสเริ่มต้นไว้เนื่องจากไม่จำเป็นและไม่ได้เป็นส่วนหนึ่งของฟังก์ชั่นดั้งเดิม
0 '

เสร็จแล้วฉันเพิ่งคัดลอกมาเร็วเกินไป
GB

16
ที่นี่ฉันกำลังเดรัจฉานบังคับให้แก้ปัญหา (และแม้กระทั่งสมมติว่ามีอยู่) และคุณเพียงก้าวเท้าเลี่ยงปัญหาทั้งหมด! +1
orlp

14

Python 2, 225 ไบต์, orlp

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

เดาว่าฉันโชคดีหลังจากทายผลตัวหารหลักสุ่มตลอดทั้งวัน ...

(ค่าเริ่มต้น c4.8x large spot limit คือ 4 แต่ฉันจัดการเพื่อชนที่ 10 ปีที่แล้วต้องปรับแต่ง FAAS จาก 16 ทาสเป็น 6 แม้ว่า (+3 mpi, 1 หลัก) 20m polyselect, 12h 50m sieving, 2h 25m linalg, 30 m sqrt. ราคารวม ~ $ 70. อย่างน้อย @ orlp ก็ดีพอที่จะเลือกขนาดที่แก้ไขได้ แต่ฉันไม่ได้ทำมันอีกแล้วขอบคุณ @IlmariKaronen สำหรับขั้นตอนสุดท้ายและใช่ฉันพูดเล่นเรื่อง คาดเดา: P)


ฉัน .. อะไร ... ตอนนี้ฉันรู้สึกไม่ดีที่คิดเงินคุณ :( ฉันเลือกขนาดที่จะยังคงมีเหตุผลพอสมควร แต่มีค่าใช้จ่ายในการโจมตีสูงเกินไปฉันไม่คิดว่าใครจะใช้จ่ายเงินกับเรื่องนี้
orlp

1
@ orlp คุ้มค่าโดยสิ้นเชิงว่ามันเป็นประสบการณ์ครั้งเดียวสำหรับฉัน ฉันหวังว่าผู้คนเรียนรู้บางสิ่งบางอย่างเกี่ยวกับความปลอดภัยของ RSA 512 บิตในป่าจากนี้ :)
SP3000

นี่คือความมุ่งมั่นที่แท้จริงในการเล่นกอล์ฟใช้เวลาไม่เพียง แต่เงิน! น่าสนใจที่จะทราบว่าผู้โจมตีอาจทำลาย RSA 512 บิตได้ฟรีผ่านการทดลองใช้บริการคำนวณบนคลาวด์
ไมล์

@ ไฟล์ฉันควรระบุว่า AWS มีเครดิตสำหรับนักเรียนหากใครต้องการลองและฉันจะไม่แปลกใจถ้าบริการอื่น ๆ ทำแบบเดียวกัน ดังนั้นคุณอาจอยู่ไม่ไกลจากแนวคิดการทดลองอย่างน้อยเป็นครั้งแรก (ถ้าใครอยากลอง - ให้แน่ใจว่าคุณลบโวลุ่มทั้งหมด AMIs ฯลฯ เมื่อคุณทำเสร็จแล้วมิฉะนั้นคุณจะถูกเรียกเก็บเงินสำหรับการจัดเก็บ)
Sp3000

11

Python 2, 83 ไบต์, orlp

เดิม:

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

แตก:

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

ลองออนไลน์!

อาร์เอสแตกร้าวทำโดยWolfram Alpha ;)


ฉันเพิ่งรู้ว่า~p*~qตรงขึ้นสั้นกว่า-~p*-~qอ๊ะ
orlp

คุณคิดอย่างไรกับวิศวกรใน(p*q-2*(p+q))/4ส่วนนี้? :)
orlp

นั่นคือส่วนที่ยากที่สุดใช่ไหม? โดยพื้นฐานแล้วความรู้เกี่ยวกับฟังก์ชั่น Carmichaelและความจริงที่ว่าp/2และq/2ทั้งสองช่วงเวลาที่แปลกและกลุ่มของการทดลองและข้อผิดพลาดที่จะหาสิ่งที่จะทำงานโดยใช้ตัวละครที่มีอยู่
Ilmari Karonen

ผมจงใจเลือกpและq(คนจริงหนึ่งในรหัสที่มีp-1และq-1สำหรับการเล่นกอล์ฟวัตถุประสงค์) ดังกล่าวว่าเป็นไปอย่างที่สำคัญที่เรามี(p-1)/2 φ(φ(pq)) = ((p-1)/2-1)((q-1)/2-1)นี้ช่วยให้เราสามารถคำนวณผกผันแบบแยกส่วนของ65537mod φ(pq)(สิ่งที่เราต้องการสำหรับอาร์เอส) โดยใช้เอกลักษณ์ของออยเลอร์ทำให้คำตอบสั้นมากเพราะเราไม่จำเป็นต้องใช้ตรรกะผกผันแบบแยกส่วนหรือ hardcode อีกอย่างต่อเนื่องขนาดใหญ่ นอกเหนือจาก-~q*-~p-> ~q*~pคุณพบว่าการทำงานของฉันแน่นอน :)
orlp

1
ที่จริงแล้วการที่จะเลือกนิดเล็ก ๆ น้อย ๆ ผมเชื่อว่าφ(φ(pq)) = 2((p-1)/2-1)((q-1)/2-1)สำหรับช่วงเวลาที่มีความปลอดภัยpและเพราะq φ(4) = 2แต่อย่างλ(φ(pq)) = lcm(2, (p-1)/2-1, (q-1)/2-1)มาก((p-1)/2-1)((q-1)/2-1)/2และหลาย ๆ อย่างนั้นลบหนึ่งจะทำแทนเลขชี้กำลัง :)
Ilmari Karonen

7

Python 3, 80 ไบต์, วุลแฟรม

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

นี่เป็นเรื่องยากที่จะถอดรหัส! ฉันใช้ไลบรารี bisectซึ่งรวมอยู่ในการแจกจ่าย Python 3 bisectฟังก์ชั่นใช้เวลารายการที่เรียงลำดับและองค์ประกอบและผลตอบแทนดัชนีขวาสุดที่องค์ประกอบอาจจะแทรกเพื่อรักษาความสงบเรียบร้อย เราเพียงแค่ให้มัน length- qรายการของช่องสี่เหลี่ยมที่เริ่มต้นจากและองค์ประกอบ1q


1
ผมจะขอแนะนำให้เปลี่ยนไป(h+1) -~hจากนั้นฉันก็รู้ว่านั่นไม่ใช่ประเด็นของความท้าทายนี้: P
ETHproductions

@ETHproductions ที่อาจไม่ถูกต้องเนื่องจากมีความสำคัญมากกว่า
Sp3000

@ Sp3000 หืมมมฉันไม่ทราบว่า**มีลำดับความสำคัญสูงกว่า~ใน Python ฉันคิดว่ามันดีกว่าใน JS ที่-~2**2เกิดข้อผิดพลาดทางไวยากรณ์ ("การแสดงออกของ unaryhesized unary expression ไม่สามารถปรากฏที่ด้านซ้ายมือของ '**'")
ETHproductions

@ETHproductions จริงๆแล้วพวกเขาไม่ว่าจะหลีกเลี่ยงความคลุมเครือซึ่งเป็นฉันอาจเพิ่มเป็นมากวิสัยของการออกแบบ JS มากที่สุด
แยกผลไม้

@Challenger5 Actually, I'd have to disagree with you there: in recent years TC39 has been extremely careful to make sure any new features added are as completely free of ambiguities as possible (which includes the ** operator, added in ES2017)
ETHproductions

6

Javascript, 21 bytes, Arnauld

Original

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

Crack

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

Returns the cube root.


There you go! ;)
Arnauld

@Arnauld: I find it a bit weird that JS allows you to call functions with more arguments than they're defined for. I wonder what the thought behind that is.
Emigna

6
You're right, JS allows that by design. Extra arguments are not completely lost, though, since they're stored in the arguments object which may be manually accessed by the function.
Arnauld


4

Processing.js, 59 bytes, Kritixi Lithos

Original:

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

Crack:

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

Well, that was easy enough. The hardest part was figuring out where to stick the extra commas and asterisks. Fortunately, it seems that Processing allows extra unused function parameters as well as C-style comma expressions.


1
Apparently, the interpreter I linked was wrong. In fact, most (or even all) online interpreters are probably going to be wrong since Processing-java gets pre-compiled to Processing.js. Right now, I think the best course of action would be for me and you to change our answers to "Processing.js" instead of Processing because then your answer would be valid (Processing-java gives tons of errors). I will post a separate answer with the same code as Processing-java, but for this the nest interpreter would be to install it from processing.org. Well done anyways!
Kritixi Lithos

4

JavaScript (ES6), 63 bytes, SLuck49

Original:

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Crack:

x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)

The base64 code above decodes to:



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

where the ... stands for a bunch of random garbage that is ignored by the JS interpreter, since it's in a comment.

I found this solution by trial and error. In the end, the only really tricky part were the two newlines at the beginning of the code, needed to make the rest line up properly and to get the M in Math to base64-encode into something that was available in the original character set. I first tried spaces, but " M" base64-encodes into "ICBN" and I needed the only available B to encode ".po" later in the code. "0+M", "1*M", "1?M" or any other similar no-op prefixes I could think of didn't work either, but newlines did.

I suspect this may not be exactly the intended solution, but whatever — it works. :)

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)))


Good job finding something that worked, I had hoped putting the extra characters at the start would make this a little harder
SLuck49

Impressive :) I took the exact same approach but didn't think to try newline. I was trying to lose a C elsewhere but was getting nowhere.
Chris M





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".


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, 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

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.