2種類の出力


17

チャレンジ

私はあなたに別のスパイ対スパイチャレンジピッチング難読化ツール対クラッカーを紹介します。ただし、この場合、保護されるデータムは入力ではなく出力です。

チャレンジのルールは簡単です。次の仕様でルーチンを作成します。

  1. ルーチンは任意の言語で作成できますが、320バイトを超えることはできません。
  2. ルーチンは、入力として3つの32ビット符号付き整数を受け入れなければなりません。3つの引数を受け入れる関数、単一の3要素配列を受け入れる関数、または標準入力から3つの整数を読み取る完全なプログラムの形式をとることができます。
  3. ルーチンは、1つの符号付き32ビット整数を出力する必要があります。
  4. 可能なすべての入力に対して、ルーチンは2〜1000(両端を含む)の一意の値を出力する必要があります。ルーチンが出力できる一意の値の数は、そのキーと呼ばれます

例として、Cプログラム

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

それは(たぶん)のみ出力9つの値ことができるので、9のキーを有し1617181920212223、および24

追加の制限事項は次のとおりです。

  1. ルーチンは完全に決定的で時不変でなければならず、同一の入力に対して同一の出力を返します。ルーチンは、疑似乱数ジェネレーターを呼び出さないでください。
  2. ルーチンは、ファイル内のデータ、システム変数、または難解な言語機能などの「隠された変数」に依存しない場合があります。たとえば、コード自体で定数が明確に定義されていない限り、ルーチンは通常定数を参照しないでください。コンパイラーの癖、数学的に未定義の演算からの出力、算術エラーなどに依存するルーチンもお勧めできません。疑問がある場合は、お問い合わせください。
  3. ユーザー(コーダー)は、ルーチンが生成できる一意の出力の数を正確に知っている必要があり、各出力を生成する少なくとも1つの入力シーケンスを提供できる必要があります。(潜在的に数百の一意の出力が存在する可能性があるため、このセットはキーが競合する場合にのみ要求されます。)

この問題は、以前の暗号化に比べて従来の暗号化との類似点がはるかに少ないため、より多くのユーザーがアクセスできるようになると期待しています。

創造的であればあるほど良い。

スコアリング

バイトカウントごとの最短の非クラック送信が勝者として宣言されます。

混乱がある場合は、お気軽に質問またはコメントしてください。

カウンターチャレンジ

独自のルーチンを送信した人を含むすべての読者は、送信を「クラック」することをお勧めします。キーが関連するコメントセクションに投稿されると、提出物がクラックされます。提出物が変更またはクラックされることなく72時間持続する場合、「安全」と見なされ、その後のクラックの成功はコンテストのために無視されます。

読者ごとに提出ごとに1回のクラッキング試行のみが許可されます。たとえば、ユーザーXに「あなたのキーは20」と送信したが間違っている場合、ユーザーXは私の推測を間違っているとして放棄し、その送信に対して追加の推測を送信できなくなります。

クラックされたサブミッションは競合から排除されます(「安全」でない場合)。編集しないでください。読者が新しいルーチンを提出したい場合は、別の回答で提出する必要があります。

クラッカーのスコアは、(準拠しているかどうかにかかわらず)提出された数です。同一のカウントを持つクラッカーの場合、ランク付けは、クラックされたすべての提出物の合計バイト数によって決定されます(高いほど良い)。

最高スコアのクラッカーが、勝者ルーチンの開発者とともに勝者として宣言されます。

自分の提出物をクラックしないでください。

幸運を祈ります。:)

リーダーボード

最終更新:9月2日午前10時45分(EST)

不動の障壁(亀裂のない提出物):

  1. CJam、105 [デニス]

止められない力(クラッカー):

  1. デニス[ Java、269 ; C、58 ; Mathematica、29 ]
  2. マーティン・ブットナー[ Java、245 ]

11
これらの課題のタグとして[警官と強盗]を提案できますか?このようなセキュリティのゲームにはかなり確立された名前であり、おそらく[敵]よりも多くの関心を呼び起こすと思います。
マーティンエンダー14

承知しました。今すぐ変更します。
COTO 14

どのような出力が許容されますか?STDOUTなどreturn
Ypnypn 14

2
あなたの例は間違っています。その署名は9です。%5は、-4から4までのすべてを返すことができます。
キースランドール14

1
@デニス私はあなたがもう一度試して大丈夫だろう。それが台無しにされたのは私のせいだった。
ストレッチマニアック14

回答:


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を返します。ゼロ以外の出力になるいくつかの入力から、3番目の整数の最下位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 14

11
「この提出では、難読化の代わりに数論を使用しています。」「うーん、正しい」というコードを見てください。
ɐɔıʇǝɥʇuʎs

4

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

あなたは、変更することで、4つの文字を保存することができますdouble e,f,d=...;e=...;f=...;double d=...,e=...,f=...;
Ypnypn

@Ypnypnありがとう!ゴルフバージョンに追加されました。
ストレッチマニアック14

1
2回目の試行(明示的な許可を得て):122
デニス14

1
@Dennisすてきな仕事!(それだけです)
ストレッチマニアック14

1
@Dennisその場合、あなたは忘れていて1、あなたの答えも間違っています;)(123が正しい...誰かがやって来て、クラッキングスコアをつかむ...)。そして、Stretch Maniacはsin == 1.0122が正しいと言ったときに説明しなかったと思います。
マーティンエンダー14

2

サンプラー

もちろん公式のエントリーではなく、文字数が多すぎますが、気が遠くなるような挑戦が必要な場合は、次の関数が生成するユニークな出力の数を決定しようとすることができます(OPで説明されているように3つの入力が与えられます) :

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

実際、私はそれが割れないことを確信しているので、割れた人には誰でも「Supreme Unstoppable Force of Nature Award」を授与します。

本当に、彼らはそれに値するからです。


1
あなたはそれのために賞金を立てるべきです!
Orby

1
@Orbyそれはいいでしょうが、コメントに賞金を与えるのは難しいです。
ジオビット14


@COTOは、この課題にまだ取り組んでいますか?
ソハムチョードリー14

@SohamChowdhury:もちろんです。あなたがそれを理解した場合、私はあなたの勝利をOPで説明します。そうでない場合はお知らせください。解決策を投稿します。
COTO 14

2

C、58バイト(クラック)

簡単なもの:

f(a,b,c){return(long long)a*b*c-0x1d21344f8479d61dLL?0:a;}

2
7(-15485867, -1299721, -104287, 0, 104287, 1299721, 15485867)。
デニス14

それは速かったです:)
Orby 14

2

Java-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($);}

ブルートフォーシングから... 90?
ベクトル化された2014

@bitpwnerいいえ、ごめんなさい。
ジオビット14

1
私はそれを少しdeobfuscated:pastebin.com/8pvvfFYB(私は変数名を交換しながら、私はどんなミスをしなかった願っています。)
マーティン・エンダー

4
さて、ここに私の試みがあります:965?
マーティンエンダー14

1
@MartinBüttner正しい。難読化されたバージョンをありがとう:D
Geobits 14

1

Mathematica、29バイト、キー:715、Crazed by Dennis

これは、最初の回答の単なる修正バージョンであり、非肯定的な入力では機能しませんでした。

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

整数のリストを取得します

f[{1,2,3}]

349ユニークな出力が見つかりました。範囲は3717でした。
PhiNotPi 14

@PhiNotPi間違っています。(再確認)
マーティンエンダー14

まあ、私は自分の間違いと正しい答えを見つけました。遅すぎる。
PhiNotPi 14

1
MathematicaのドキュメントとWolframAlphaからまとめたものが正しい場合、キーは715(3 ... 717)です。
デニス14

2
... Mathematicaは素敵な言語のように見えますが、それはどちらかあまりにもくそ高価だか、私は安いあまりにもくそだ
デニス・

0

C / C ++の207文字、まだ難読化されていない:

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

ちょうど私の運を試してみてください...729。-
ベクトル化

@bitpwnerくそー、私はそれを言うつもりだった。:D ...それが間違っている場合、それは上限です。
マーティンエンダー14

2
これは有効な提出ではありません。ループ内のすべての割り当ては、符号付き整数オーバーフローを引き起こす可能性があり、未定義の動作があります。
デニス14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.