Два-много выходов

17

Соревнование

Я представляю вам еще один вызов шпион против шпиона, противопоставляя обфускаторы против крекеров. В этом случае, однако, защищаемая база данных является не входом, а выходом .

Правила вызова просты. Напишите процедуру со следующими характеристиками:

  1. Процедура может быть написана на любом языке, но не может превышать 320 байт.
  2. Процедура должна принимать три 32-битных целых числа со знаком в качестве входных данных. Он может принимать форму функции, которая принимает 3 аргумента, функции, которая принимает один массив из 3 элементов, или полной программы, которая читает 3 целых числа из любого стандартного ввода.
  3. Подпрограмма должна вывести одно 32-разрядное целое число со знаком.
  4. Для всех возможных входов подпрограмма должна выводить от 2 до 1000 (включительно) уникальных значений. Число уникальных значений, которые может выдать подпрограмма, называется ее ключом .

Как пример, программа на C

int foo( int i1, int i2, int i3 ) {
    return 20 + (i1^i2^i3) %5;
}

имеет ключ 9, так как он (надеюсь) может выводить только девять значений 16, 17, 18, 19, 20, 21, 22, 23, и 24.

Некоторые дополнительные ограничения заключаются в следующем:

  1. Процедура должна быть полностью детерминированной и не зависящей от времени, возвращая идентичные выходные данные для идентичных входных данных. Подпрограмма не должна вызывать генераторы псевдослучайных чисел.
  2. Процедура может не полагаться на «скрытые переменные», такие как данные в файлах, системные переменные или функции эзотерического языка. Например, процедуры обычно не должны ссылаться на константы, если только константы не определены четко в самом коде. Подпрограммы, которые основаны на причудах компилятора, выходах из математически неопределенных операций, арифметических ошибках и т. Д., Также настоятельно не рекомендуется. Если есть сомнения, пожалуйста, спросите.
  3. Вы (кодер) должны точно знать, сколько уникальных выходов может произвести подпрограмма, и должны быть в состоянии предоставить хотя бы одну входную последовательность, которая производит каждый выход. (Поскольку потенциально могут быть сотни уникальных выходных данных, этот набор будет запрашиваться только в том случае, если ваш ключ оспорен.)

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

Чем креативнее, тем лучше.

Скоринг

Самые короткие не взломанные данные на счетчик байтов будут объявлены победителями.

Если есть путаница, пожалуйста, не стесняйтесь спрашивать или комментировать.

Встречный вызов

Всем читателям, включая тех, кто представил свои собственные процедуры, предлагается «взломать» материалы. Отправка взламывается, когда ее ключ публикуется в соответствующем разделе комментариев. Если представление сохраняется в течение 72 часов без изменения или взлома, оно считается «безопасным» и любой последующий успех в взломе будет проигнорирован ради контеста.

Допускается только одна попытка взлома на каждое представление на читателя. Например, если я отправляю пользователю X: «ваш ключ - 20», и я ошибаюсь, пользователь X откажется от моей догадки как от неправильной, и я больше не смогу отправлять дополнительные предположения для этой отправки.

Взломанные материалы исключаются из спора (при условии, что они не «безопасны»). Они не должны редактироваться. Если читатель хочет представить новую рутину, он должен сделать это в отдельном ответе.

Оценка взломщика - это количество представлений (соответствующих или нет), которые он взламывает. Для взломщиков с одинаковыми подсчетами ранжирование определяется по общему количеству байтов во всех взломанных отправках (чем выше, тем лучше).

Взломщик (-и) с наибольшим количеством баллов будут объявлены победителями вместе с разработчиками процедур-победителей.

Пожалуйста, не взламывайте ваши собственные представления.

Удачи. :)

Leaderboard

Последнее обновление 2 сентября, 10:45 EST

Неподвижные барьеры (не взломанные материалы):

  1. CJam, 105 [Денис]

Непреодолимые силы (взломщики):

  1. Деннис [ Ява, 269 ; С 58 ; Mathematica, 29 ]
  2. Мартин Бюттнер [ Ява, 245 ]
COTO
источник
11
Могу ли я предложить [полицейских и грабителей] в качестве тега для этих задач? Я думаю, что это довольно устоявшееся название для таких игр в области безопасности, и оно, вероятно, вызовет больший интерес, чем [состязательный].
Мартин Эндер
Конечно. Я изменю это сейчас.
COTO
Какой вид продукции приемлем? STDOUT, returnи т.д ...
Ипныпн
2
Ваш пример неверен; его подпись - 9.% 5 может вернуть что-нибудь от -4 до 4 включительно.
Кит Рэндалл
1
@ Денис, я буду в порядке, если ты попробуешь снова. Это была моя вина, что все испортилось.
Стрейч Маньяк

Ответы:

7

CJam, 105 байт

1q~]4G#b2A#md"M-k^XM-WHM-n^GM-0%M-uwM-gM-^XeM-kM-^VO^Ph,M-^MM-^PM-qM-!M-8M-AM-OM-~tM-^FM-cM-h^AM-0M-0M-lM-@M-^[MF=M-^Z^SM-1M-KM-T2M-9M-UmSM-N
M-8M-^^M-n$4M-^M^SM-x M-OM-^@^?"256b@D#Y256#%2+md!A3#*)%)%

Выше используются символы каретки и M, поскольку они содержат непечатаемый символ. После преобразования потока байтов в целое число ( 256b) выполняется следующий код:

1q~]4G#b2A#md
12313030820310059479144347891900383683119627474072658988524821209446180284434934346766561958060381533656780340359503554566598728599799248566073353154035839
@D#Y256#%2+md!A3#*)%)%

Вы можете попробовать эту версию онлайн в интерпретаторе CJam .

Как это устроено

Это представление использует теорию чисел вместо запутывания. Программа вернет 0 почти для всех входов. Из нескольких входных данных, которые приводят к ненулевому выходному сигналу, получается секретный модуль, который применяется к 10 младшим значащим битам третьего целого числа.

Наиболее эффективным способом решения этой задачи (о котором я могу думать) было бы разложение 512-битного целого числа, которое, я надеюсь, не будет достигнуто через 72 часа.

" Prepend 1 to the numbers read from STDIN and convert the resulting array into an integer
  (“N”) by considering them digits of a base 2**32 number.                                 ";

1q~]4G#

" Compute “N / 1024” and “N % 1024”.                                                       ";

2A#md

" Push a carefully selected 512 bit semi-prime (“S”).                                      ";

12313030820310059479144347891900383683119627474072658988524821209446180284434934346766561958060381533656780340359503554566598728599799248566073353154035839

" Compute P = (N / 1024) ** 13 % 2 ** 256 + 2.                                             ";

@D#Y256#%2+

" Compute “S / P” and “S % P”.                                                             ";

md

" Compute “M = (S / P) % (1000 * !(S % P) + 1) + 1”.

  “M” is the key if P is a divisor of S; otherwise, “M == 1”.                              ";

!A3#*)%)

" Compute the final output: “N % 1024 % M”.                                                ";

%

Пример запуска

$ base64 -d > outputs.cjam <<< MXF+XTRHI2IyQSNtZCLrGNdI7gewJfV355hl65ZPEGgsjZDxobjBz/50huPoAbCw7MCbTUY9mhOxy9QyudVtU84KuJ7uJDSNE/ggz4B/IjI1NmJARCNZMjU2IyUyK21kIUEzIyopJSkl
$ wc -c outputs.cjam
105 outputs.cjam
$ LANG=en_US cjam outputs.cjam < outputs.secret; echo
1
$ LANG=en_US cjam outputs.cjam <<< '1 2 3'; echo
0
Деннис
источник
Вы слишком чертовски хороши с шифрованием. ;)
COTO
11
«Это представление использует теорию чисел вместо запутывания». Смотрит на код "Хмм, верно".
ɐɔıʇǝɥʇuʎs
4

Ява - 269

Спасибо всем за терпение, теперь это нужно исправить.

укорочен:

int a(int a,int b,int c){double d=180-360.0/(int)(Math.abs(Math.sin(a*60))*50+2),e=180-360.0/(int)(Math.abs(Math.cos(b*60))*50+2),f=180-360.0/(int)(Math.atan2(c*60, a*60)*51+2);if(Math.abs(d+e+f-360)<.1)return Integer.valueOf((int)d+""+(int)e+""+(int)f);else return 1;}

Не сокращено:

int a(int a, int b, int c) {
    double d = 180 - 360.0 / (int) (Math.abs(Math.sin(a * 60)) * 50 + 2);
    double e = 180 - 360.0 / (int) (Math.abs(Math.cos(b * 60)) * 50 + 2);
    double f = 180 - 360.0 / (int) (Math.atan2(c * 60, a * 60) * 51 + 2);
    if (Math.abs(d + e + f - 360) < .1)
        return Integer.valueOf((int) d + "" + (int) e + "" + (int) f);
    else
        return 1;
}
Стрейч маньяк
источник
Вы можете сохранить четыре символа, изменив double e,f,d=...;e=...;f=...;наdouble d=...,e=...,f=...;
Ypnypn
@Ypnypn Спасибо! добавлено в гольф версию.
Стрейч Маньяк
1
Вторая попытка ( с явного разрешения ): 122
Деннис
1
@ Денис хорошая работа! (Вот и все)
Stretch Maniac
1
@Dennis В этом случае вы забываете, 1и ваш ответ также является неправильным;) (123 правильные ... кто-то пришел и взял потрясающий счет ...). И я думаю, что Stretch Maniac не учел, sin == 1.0когда он сказал, что 122 - это правильно.
Мартин Эндер
2

Пробоотборник

Конечно, это не официальная запись, и количество персонажей слишком велико, но я полагаю, что если кому-то захочется сойти с ума, он может попытаться определить, сколько уникальных выходов производит следующая функция (с учетом трех входов, как описано в ОП). :

function z(y,_,$){M=[];N=[];O=[];C=1792814437;P=72;r=t=0;(f=function(a,k,L){if(k<a.length){for(L=a[k],a[k]=0;a[k]<L;a[k]++)f(a,k+1)}else
if(!t){f([P-1,P-1],0,++t);N=M;while(t<2*P){s=!(t&1);f([P,P,P,P],0,++t);r=r||(s?0:t);t&1&&(N=O);O=[]}}else
((t<2)&&(((d=P*a[0]+(P+1)*a[1]+P)<(P<<6))&&(M[d]=(((y^~_)>>a[0])+((_^~$)>>(a[0]-32)))&1),((a[1]<P-a[0])&&
(M[a[1]+(P+1)*a[0]]=(($^C)>>a[0]+16-a[1])&1))||1))||((t&1)&&((O[P*a[2]+a[3]]|=M[a[1]+P*a[2]]&N[P*a[0]+a[3]]&&
!(a[0]-a[1]))||1))||(s|=N[(a[0]+1)*a[1]+a[3]]);})([],0,0);return r;}

На самом деле, я настолько уверен, что его невозможно сломать, я награду каждого, кто взломает его, «Высшую награду за непреодолимую силу природы».

Потому что на самом деле они этого заслуживают.

COTO
источник
1
Вы должны назначить награду за это!
Orby
1
@Orby Это было бы неплохо, но трудно дать награду за комментарий.
Geobits
@COTO эта проблема еще?
Сохам Чоудхури
@SohamChowdhury: Абсолютно. Если вы поймете это, я изложу вашу победу в ОП. Если нет, дайте мне знать, и я опубликую решение.
COTO
2

C, 58 байт (треснувший)

Простой:

f(a,b,c){return(long long)a*b*c-0x1d21344f8479d61dLL?0:a;}
Orby
источник
2
7 ( -15485867, -1299721, -104287, 0, 104287, 1299721, 15485867).
Деннис
Это было быстро :)
Orby
2

Ява - 245

Взломанный Мартином Бюттнером

int a(int[]_$){return $($($_(_$[0],0)))+$_(_$[1],1)*11+$($($_(_$[1+1],0)))*(1+1);}int $_(int $,int $_){int OO=0,o=1,O=1;for($=$<0?-$:$;++O*O<=$;OO+=$%O<1?O:0,o+=$%O<1?1:0,$/=$%O<1?O--:1);return $_>0?o:OO+$;}int $(int $){return(int)Math.sqrt($);}

Подайте входные данные как массив int: a(new int[]{1,2,3}) . Я не ожидаю, что это пройдет 72 часа, но получайте от этого удовольствие.

Вот это с переносами строк, чтобы сделать его немного более читабельным:

int a(int[]_$){return $($($_(_$[0],0)))+$_(_$[1],
1)*11+$($($_(_$[1+1],0)))*(1+1);}int $_(int $,int
$_){int OO=0,o=1,O=1;for($=$<0?-$:$;++O*O<=$;OO+=
$%O<1?O:0,o+=$%O<1?1:0,$/=$%O<1?O--:1);return $_>
0?o:OO+$;}int $(int $){return(int)Math.sqrt($);}
Geobits
источник
Просто от брутфорса ... 90?
Векторизовано
@bitpwner Нет, прости.
Geobits
1
Я немного деобфусцировал это: pastebin.com/8pvvfFYB (надеюсь, я не допустил ошибок при замене имен переменных.)
Martin Ender
4
Хорошо, вот моя попытка: 965?
Мартин Эндер
1
@ MartinBüttner Правильно. Спасибо за запутанную версию: D
Geobits
1

Mathematica, 29 байт, ключ: 715, взломан Деннисом

Это просто исправленная версия моего первоначального ответа, которая не работала для неположительных входных данных.

f=Plus@@Mod[NextPrime@#,240]&

Принимает список целых чисел, таких как

f[{1,2,3}]
Мартин Эндер
источник
Я нашел 349уникальные выводы. Диапазон был от 3до 717.
PhiNotPi
@PhiNotPi Неправильно. (Я дважды проверил)
Мартин Эндер
Ну, я нашел свою ошибку и правильный ответ. Слишком поздно, хотя.
PhiNotPi
1
Если материал, который я собрал из документации Mathematica и WolframAlpha, правильный, то ключ 715 ( 3 ... 717).
Деннис
2
Mathematica выглядит как хороший язык, но он слишком дорогой, или я чертовски дешевый ...
Деннис
0

207 символов, в C / C ++, еще не запутано:

int x(int a, int b, int c) {
    int d, e, f;
    for (int i=0; i!=1<<31; ++i) {
        d=10*(b-a);
        e=a*(28-c)-b;
        f=a*b-2.7*c;
        a += d;
        b += e;
        c += f;
    }
    return ((a%5+5)*10+(b%5+5))*10+c%5+5;
}
ldgabbay
источник
Просто пытаюсь испытать удачу ... 729.
Векторизация
@bitpwner Черт, я просто хотел сказать это. : D ... Если это не так, то это верхняя граница.
Мартин Эндер
2
Это неверное представление. Все присваивания внутри цикла могут привести к переполнению целых чисел со знаком , которое имеет неопределенное поведение.
Деннис