Скрытые Инверсии (Нить Грабителей)

16

Это головоломка для , ее можно найти здесь.

Ваша задача будет найти анаграмму предоставленных программ в потоке полицейских, который выполняет обратное слева.

После того, как вы ответите на вопрос, опубликуйте решение как ответ ниже и сообщите об этом оригинальному ответчику.

Вы будете оцениваться по количеству программ, которые вы взломали первыми.

Пост Рок Гарф Хантер
источник

Ответы:

21

Python 3, 46 байт, Линн

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.8xlarge по умолчанию равен 4, но мне удалось увеличить его до 10 в прошлом году. Пришлось настраивать конфигурацию FAAS с 16 подчиненных до 6, хотя (+3 mpi, 1 master). Полиселект 20m, 12h просеивание 50m, 2h 25 миллионов фунтов, 30 миллионов квадратных метров. Общая стоимость ~ 70 долларов. По крайней мере, @orlp был достаточно хорош, чтобы выбрать решаемый размер, но я не буду делать это снова! Спасибо @IlmariKaronen за последний шаг, и да, я шучу о отгадывая: P)

Sp3000
источник
Я ... что ... Теперь я чувствую себя плохо из-за того, что стою вам денег :( Я специально выбрал размер, который все равно был бы достаточно маленьким, но слишком дорогим для атаки. На самом деле я не думал, что кто-то потратит деньги на это.
orlp
1
@orlp Стоит того, чтобы это было одноразовым опытом для меня. Я надеюсь, что люди узнают кое-что о 512-битной безопасности RSA в дикой природе из этого :)
Sp3000
Это настоящее посвящение игре в гольф, тратить не только время, но и деньги! Интересно отметить, что злоумышленник может потенциально бесплатно взломать 512-битный RSA с помощью пробных сервисов облачных вычислений.
миль
@ Мили Я должен отметить, что AWS имеет кредит для студентов, если кто-то хочет попробовать, и я не удивлюсь, если другие службы сделали то же самое. Следовательно, вы, вероятно, не за горами с этой идеей испытаний, по крайней мере, в первый раз. (Если кто-то захочет попробовать - убедитесь, что вы удалите все тома, AMI и т. Д., Как только закончите, потому что в противном случае с вас будет взиматься плата за хранение)
Sp3000
11

Python 2, 83 байта, orlp

Оригинал:

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

Crack:

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

Попробуйте онлайн!

Взлом RSA сделан Wolfram Alpha . ;)

Илмари Каронен
источник
Я только что понял, ~p*~qчто прямо короче -~p*-~q, ой.
orlp
Как ты реинжиниринг (p*q-2*(p+q))/4части хотя? :)
orlp
Это была самая сложная часть, не так ли? В основном, знание функции Кармайкла и тот факт, что p/2и q/2были странными простыми числами, и куча проб и ошибок, чтобы найти что-то, что будет работать с использованием доступных символов.
Ильмари
Я намеренно выбрал pи q(настоящие, те, что в коде, p-1и q-1для целей игры в гольф) так, чтобы они были (p-1)/2первостепенными φ(φ(pq)) = ((p-1)/2-1)((q-1)/2-1). Это позволяет нам вычислять модульную инверсию 65537мода φ(pq)(что нам нужно для RSA), используя идентичность Эйлера, делая ответ намного короче, потому что нам не нужно реализовывать модульную обратную логику или жестко кодировать другую большую константу. Помимо -~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, и любое кратное из этого, минус один, подойдет для показателя степени. :)
Ильмари
7

Питон 3, 80 байт, Вольфрам

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

Это было действительно трудно взломать! Я использую библиотеку bisect , которая включена в дистрибутив Python 3. bisectФункция принимает отсортированный список и элемент, и возвращает крайний правый индекс , где элемент может быть вставлен для поддержания порядка. Мы просто даем ему qсписок длин квадратов, начиная с 1элемента q.

Zgarb
источник
1
Я собирался предложить изменить (h+1)на -~h. Тогда я понял, что не в этом суть проблемы: P
ETHproductions
@ETHproductions Это было бы неправильно в любом случае из-за приоритета оператора.
Sp3000
@ Sp3000 Да, я понятия не имел, что **имеет более высокий приоритет, чем ~в Python. Я полагаю, что это лучше, чем в JS, где -~2**2выдается синтаксическая ошибка («не заключенное в скобки унарное выражение не может появляться в левой части« ** »»).
ETHproductions
@ETHproductions Они действительно сделали это, чтобы избежать двусмысленности, что, как я мог бы добавить, очень нехарактерно для большинства JS-дизайна.
Esolanging Fruit
@ Challenger5 На самом деле, я бы не согласился с вами: в последние годы TC39 очень тщательно следил за тем, чтобы любые добавленные новые функции были максимально свободны от двусмысленностей (включая **оператора, добавленного в ES2017)
ETHproductions
6

Javascript, 21 байт, Арно

оригинал

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

трещина

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

Возвращает корень куба.

Emigna
источник
Вот и вы! ;)
Arnauld
@Arnauld: я нахожу немного странным, что JS позволяет вам вызывать функции с большим количеством аргументов, чем они определены. Интересно, что за этим стоит мысль.
Emigna
6
Вы правы, JS позволяет это по замыслу. Однако дополнительные аргументы не теряются полностью, так как они хранятся в объекте аргументов, к которому функция может обращаться вручную.
Арно
5

7, 9 байт, ais523

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

Потому что грубая сила всегда побеждает и 9! только 362880

гигабайт
источник
4

Processing.js, 59 байт, Kritixi Lithos

Оригинал:

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

Ну, это было достаточно просто. Самым сложным было выяснить, куда вставлять лишние запятые и звездочки. К счастью, кажется, что Processing допускает дополнительные неиспользуемые параметры функции, а также запятые в стиле C.

Илмари Каронен
источник
1
Видимо, переводчик, которого я связал, был не прав. Фактически, большинство (или даже все) онлайн-интерпретаторы, вероятно, будут неправы, поскольку Processing-java предварительно скомпилирован в Processing.js. Прямо сейчас, я думаю, что лучшим способом было бы для меня и вас изменить наши ответы на «Processing.js» вместо «Processing», потому что тогда ваш ответ будет действительным (Processing-java выдает множество ошибок). Я опубликую отдельный ответ с тем же кодом, что и Processing-java, но для этого гнездовой интерпретатор должен установить его с processing.org. Хорошо сделано в любом случае!
Критиси Литос
4

JavaScript (ES6), 63 байта, SLuck49

Оригинал:

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Crack:

x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)

Код base64 выше декодирует в:



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

где ...обозначает кучу случайного мусора, который игнорируется интерпретатором JS, поскольку он находится в комментарии.

Я нашел это решение методом проб и ошибок. В конце концов, только на самом деле сложная часть были две новых строк в начале кода, нужно сделать остальное линии правильно и получить Mв Mathк base64-кодированию в то , что было доступно в исходном наборе символов. Сначала я пробовал пробелы, но " M"base64-кодирует в, "ICBN"и мне нужно было единственное доступное Bдля кодирования ".po"позже в коде. "0+M", "1*M", "1?M"Или любые другие подобные не-оп префиксы я мог думать не получились, но переводы строки сделали.

Я подозреваю, что это может быть не совсем намеченным решением, но как бы то ни было - оно работает. :)

Демо-версия:

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

Илмари Каронен
источник
Хорошая работа, найти что-то, что сработало, я надеялся, что добавление дополнительных символов в начале сделает это немного сложнее
SLuck49
Впечатляет :) Я выбрал точно такой же подход, но не думал пробовать новую строку. Я пытался потерять C в другом месте, но ничего не получалось.
Крис М,
3

J, 8 байт, миль

[:]-:[+:

Простая замена +:для -:(двойной на половину).

Конор О'Брайен
источник
Также вы можете поменять местами левые и правые глаголы: [:[+:]-:.
Рандомра
3

Python 2, 47 байт, мастер пшеницы

lambda x:sorted(a**2for a in range(x)).index(x)
nmjcman101
источник
Молодец! Вы нашли точное решение, которое я имел в виду
Post Rock
3

JavaScript (ES6), 46 байт, SLuck49

Оригинал (рассчитывает ln (x + 1))

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

трещина

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

Я бы никогда не взломал это, если бы не понял, что обратное - это Mathвстроенное . (lg=19979699+55686).toString(9+25)это просто запутанный способ возвращения "expm1".

ETHproductions
источник
Красиво сделано! Да, я просматривал функции в Math, чтобы решить, что использовать, увидел expm1и сказал: «Подождите, это что-то?»
SLuck49
2

J, 10 байт, миль

1%:@*~>:[<

Я должен написать что-то здесь, потому что ответ слишком короткий.

гигабайт
источник
2

J, 29 байт, Zgarb

оригинал

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

трещина

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

Попробуйте онлайн!

Еще один трещинный эквивалент

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

объяснение

[:(](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
миль
источник
Да, это работает! Это немного отличается от моего решения, но есть много возможностей. Основная логика все та же, хотя.
Згарб