İki-Çok Çıkış


17

Meydan okuma

Size krakerlere karşı gizleme çukurlarına karşı başka bir casus ve casus mücadelesi sunuyoruz. Ancak bu durumda, korunacak olan veriler bir girdi değil çıktıdır .

Meydan okuma kuralları basit. Aşağıdaki özelliklere sahip bir rutin yazın:

  1. Rutin herhangi bir dilde yazılabilir, ancak 320 baytı aşamaz.
  2. Rutin, giriş olarak üç adet 32 ​​bit işaretli tam sayıyı kabul etmelidir. 3 bağımsız değişkeni kabul eden bir işlev, tek bir 3 öğeli diziyi kabul eden bir işlev veya herhangi bir standart girdiden 3 tamsayı okuyan tam bir program biçiminde olabilir.
  3. Rutin bir imzalı 32 bit tamsayı çıkarmalıdır.
  4. Tüm olası girişlerde, rutin 2 ile 1000 (dahil) benzersiz değer arasında çıkış yapmalıdır. Bir rutinin verebileceği benzersiz değerlerin sayısına anahtarı denir .

Örnek olarak, C programı

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

9, bir anahtar vardır çünkü (umutla) geçmesi ancak çıkış Dokuz değer 16, 17, 18, 19, 20, 21, 22, 23, ve 24.

Bazı ek sınırlamalar aşağıdaki gibidir:

  1. Rutin tam olarak deterministik ve zamanla değişmez olmalı, aynı girişler için aynı çıkışları döndürmelidir. Rutin, sahte sayı üreticilerine çağrı yapmamalıdır.
  2. Rutin, dosyalardaki veriler, sistem değişkenleri veya ezoterik dil özellikleri gibi "gizli değişkenlere" güvenemeyebilir. Örneğin, sabitler kodun kendisinde açıkça tanımlanmadığı sürece, rutinler genellikle sabitlere başvurmamalıdır. Derleyici tuhaflıklarına, matematiksel olarak tanımlanmamış işlemlerden elde edilen çıktılara, aritmetik hatalara vb. Dayanan rutinler de kesinlikle önerilmez. Şüphe duyduğunuzda lütfen sorun.
  3. Siz (kodlayıcı), rutinin kaç tane benzersiz çıktı üretebileceğini tam olarak bilmeli ve her çıktıyı üreten en az bir girdi dizisi sağlayabilmelisiniz. (Potansiyel olarak yüzlerce benzersiz çıktı olabileceğinden, bu set yalnızca anahtarınıza itiraz edilmesi durumunda talep edilebilir.)

Bu sorun, klasik şifrelemeye öncekinden çok daha az benzerlik gösterdiğinden, daha geniş bir kitleye erişebileceğini umuyorum.

Daha yaratıcı, daha iyi.

Puanlama

Bayt sayısı başına en kısa çatlaksız gönderim kazanan (lar) olarak ilan edilecektir.

Herhangi bir karışıklık varsa, lütfen sormaya veya yorum yapmaya çekinmeyin.

Karşı Mücadele

Kendi rutinlerini sunanlar da dahil olmak üzere tüm okuyucular başvuruları "kırmaya" teşvik edilmektedir. Bir anahtar, ilgili yorumlar bölümünde yayınlandığında gönderimi bozulur. Eğer bir başvuru değiştirilmeden veya çatlatılmadan 72 saat devam ederse, "güvenli" kabul edilir ve daha sonra çatlama başarısı yarışma uğruna göz ardı edilir.

Okuyucu başına gönderim başına yalnızca bir çatlama girişimine izin verilir. Örneğin, X kullanıcısına gönderirsem: "anahtarınız 20" ve yanılıyorsam, X kullanıcısı tahminimi yanlış olarak reddeder ve artık bu gönderim için ek tahmin gönderemeyeceğim.

Çatlamış başvurular çekişmeden kaldırılır ("güvenli" olmaları koşuluyla). Onlar düzenlenmemelidir. Bir okuyucu yeni bir rutin göndermek istiyorsa, bunu ayrı bir cevapta yapmalıdır.

Bir krakerin puanı, kırdığı başvuruların sayısıdır (uyumlu olsun ya da olmasın). Aynı sayılara sahip krakerler için, sıralama tüm çatlak başvurulardaki toplam bayt sayısına göre belirlenir (daha yüksek, daha iyi).

En yüksek puana sahip kraker (ler) kazanan kazanan rutinleri geliştirenlerle birlikte kazanan olarak ilan edilecektir.

Lütfen kendi gönderiminizi kırmayın.

İyi şanslar. :)

Liderler Sıralaması

Son Güncelleme 2 Eyl. 10:45 EST

Taşınmaz Engelleri (çatlamayan başvurular):

  1. CJam, 105 [Dennis]

Durdurulamaz Kuvvetler (kraker):

  1. Dennis [ Java, 269 ; C, 58 ; Mathematica, 29 ]
  2. Martin Büttner [ Java, 245 ]

11
Bu güçlüklerin etiketi olarak [polisler ve soyguncular] önerebilir miyim? Bence bu tür güvenlik oyunları için oldukça yerleşik bir isim ve muhtemelen [rakip] 'den daha fazla ilgi uyandıracak.
Martin Ender

Elbette. Şimdi değiştireceğim.
COTO

Ne tür çıktılar kabul edilebilir? STDOUT,, returnetc ...
Ypnypn

2
Örneğiniz yanlış; imzası 9'dur.% 5, -4'ten 4'e kadar her şeyi döndürebilir.
Keith Randall

1
@Dennis tekrar denemek seninle iyi olur. Bu benim hatam berbat oldu.
Stretch Maniac

Yanıtlar:


7

CJam, 105 bayt

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#*)%)%

Yukarıda yazdırılamayan karakter içerdiğinden, düzeltme ve M gösterimi kullanılır. Bayt akışını bir tamsayıya ( 256b) dönüştürdükten sonra aşağıdaki kod yürütülür:

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

Bu sürümü çevrimiçi olarak CJam yorumlayıcısında deneyebilirsiniz .

Nasıl çalışır

Bu sunum gizleme yerine sayı teorisini kullanır. Program hemen hemen tüm girişler için 0 döndürecektir. Sıfır olmayan bir çıktı ile sonuçlanan az sayıdaki girişten, üçüncü tam sayının en az önemli 10 bitine uygulanan bir gizli modül elde edilir.

Bu zorluğu çözmenin en etkili yolu (düşünebileceğim), 72 saat içinde ulaşılamayacağını umduğum 512 bit tamsayıyı çarpanlarına ayırmak olacaktır.

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

%

Örnek çalışma

$ 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

Şifreleme işlerinde çok iyisin. ;)
COTO

11
Diyerek şöyle devam etti: "Bu sunum gizleme yerine sayı teorisini kullanıyor." "Hmm, doğru" koduna bakar .
Sepıʇǝɥʇuʎs

4

Java - 269

Herkesin sabrı için teşekkürler, bu şimdi düzeltilmelidir.

kısaltılmış:

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

Kısaltılmamış:

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

Sen değiştirerek dört karakter kaydedebilirsiniz double e,f,d=...;e=...;f=...;içindouble d=...,e=...,f=...;
Ypnypn

@Ypnypn Teşekkürler! golf versiyonuna eklendi.
Stretch Maniac

1
İkinci girişim ( açık izinle ): 122
Dennis

1
@Dennis güzel iş! (İşte bu)
Stretch Maniac

1
@Dennis Bu durumda, unutuyorsunuz 1ve cevabınız da yanlış;) (123 doğrudur ... birisi gelir ve çatlama puanını alır ...). Ve sanırım Stretch Maniac sin == 1.0122'nin doğru olduğunu söylediğinde hesaba katılmadı .
Martin Ender

2

Örnekleyici

Elbette resmi bir giriş değil ve karakter sayısı çok yüksek, ama eğer bir kişi zihin uyuşturan bir meydan okuma istiyorsa, aşağıdaki fonksiyonun kaç benzersiz çıkış ürettiğini belirlemeye çalışabilirler (OP'de açıklandığı gibi üç giriş verilir) :

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

Aslına bakarsanız, bunun kırılamaz olduğundan çok eminim, onu çatlatan herkese "Yüksek Durdurulamaz Doğa Gücü Ödülü" vereceğim.

Çünkü gerçekten hak ediyorlar.


1
Bunun için bir ödül koymalısın!
Orby

1
@Orby Bu iyi olurdu, ama bir yoruma ödül vermek zor.
Geobits


@COTO bu meydan okuma hala devam ediyor mu?
Soham Chowdhury

@SohamChowdhury: Kesinlikle. Eğer çözerseniz, OP'deki zaferinizi açıklayacağım. Değilse, bana bildirin, çözümü göndereceğim.
COTO


2

Java - 245

Martin Büttner tarafından kırıldı

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

Bir int dizi olarak giriş besleme: a(new int[]{1,2,3}). 72 saat beklemiyorum ama onunla eğleniyorum.

İşte biraz daha okunabilir hale getirmek için satır sonları ile:

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

Sadece kaba kuvvetten mi ... 90?
Vectörize

@bitpwner Hayır, üzgünüm.
Geobits

1
Biraz deobfuscated: pastebin.com/8pvvfFYB (Umarım değişken adlarını değiştirirken herhangi bir hata yapmadım.)
Martin Ender

4
Tamam, işte girişimim: 965?
Martin Ender

1
@ MartinBüttner Doğru.
Gizli

1

Mathematica, 29 bayt, Anahtar: 715, Kırık Dennis

Bu, ilk cevabımın, pozitif olmayan girdiler için çalışmayan sabit bir sürümüdür.

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

Gibi tamsayıların bir listesini alır

f[{1,2,3}]

349Benzersiz çıktılar buldum . Aralığı olduğu 3için 717.
PhiNotPi

@PhiNotPi Yanlış. (Ben iki kez kontrol ettim)
Martin Ender

Hatamı ve doğru cevabı buldum. Yine de çok geç.
PhiNotPi

1
Mathematica belgelerinden ve WolframAlpha'dan bir araya getirdiğim şeyler doğruysa, anahtar 715'tir ( 3 ... 717).
Dennis

2
Mathematica güzel bir dile benziyor, ama çok pahalı ya da çok ucuzum ...
Dennis

0

C / C ++ 'da 207 karakter henüz gizlenmemiştir:

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

Sadece şansımı deniyorum ... 729.
Vectorized

@bitpwner Lanet olsun, sadece söyleyecektim. : D ... Eðer yanlýþsa, bu üst sýnýr.
Martin Ender

2
Bu geçerli bir gönderim değil. Döngü içindeki tüm atamalar , tanımlanmamış davranışa sahip işaretli tamsayı taşmasına neden olabilir .
Dennis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.