Dolaplara Karşı Krakerler: Beş Element Dizisi


31

Meydan okuma

Basit bir "casus versus casus" mücadelesi.

Aşağıdaki özelliklere sahip bir program yazın:

  1. Program herhangi bir dilde yazılabilir, ancak 512 karakteri geçmemelidir (bu sitedeki kod bloğunda gösterildiği gibi).
  2. Program, giriş olarak 5 imzalı 32 bit tam sayı kabul etmelidir. 5 argümanı kabul eden bir işlev, tek bir 5 elemanlı diziyi kabul eden bir işlev veya herhangi bir standart girişten 5 tam sayı okuyan tam bir program biçimini alabilir.
  3. Program, imzalanmış bir 32 bit tamsayı çıkarmalıdır.
  4. Program, yalnızca bir dizi olarak yorumlanan beş giriş, programcının seçtiği “anahtar” olarak adlandırılan belirli bir aritmetik sekansla eşleşiyorsa ve 1 değerini döndürmelidir. Diğer tüm girişler için işlev 0 döndürmelidir.

Bir aritmetik dizilim, dizinin ardışık her bir elemanının kendinden önceki artı bir miktar sabit sabite eşit olması özelliğine sahiptir a.

Örneğin, 25 30 35 40 45dizinin her elemanı kendinden önceki artı 5'e eşit 17 10 3 -4 -11olduğu için bir aritmetik dizidir.

Diziler 1 2 4 8 16ve 3 9 15 6 12aritmetik diziler değildir.

Bir anahtar, seçtiğiniz, herhangi bir aritmetik dizi olabilir; tek tamsayı taşması içeren dizilere izin verilmez. Kendisine, sekans gerekir katı azalan katı artan olabilir veya tüm elemanlar eşit olması.

Örnek olarak, anahtarı seçtiğinizi varsayalım 98021 93880 89739 85598 81457. Girişler (sıra ile) bu beş sayı ile eşleşiyorsa, programınız 1 döndürmelidir.

Lütfen anahtarı koruma araçlarının kendi tasarımınız olması gerektiğini unutmayın. Ayrıca, sıfır pozitif olasılığı olan yanlış pozitifleri döndürebilecek olasılıksal çözümlere izin verilmez. Özellikle, standart şifreleme karma değerleri için kütüphane fonksiyonları da dahil olmak üzere herhangi bir standart şifreleme karma kullanmayın.

Puanlama

Her karakter sayısında kırılmayan en kısa gönderim (ler) kazanan ilan edilecektir.

Herhangi bir karışıklık varsa, sormak veya yorum yapmaktan çekinmeyin.

Karşı Mücadelesi

Kendi programlarını sunanlar da dahil olmak üzere tüm okuyucular başvuruları "kırmaya" teşvik edilir. Bir anahtar, ilgili yorumlar bölümünde anahtarının gönderildiği durumda kırılır. Bir başvuru, değiştirilmeden veya çatlatılmadan 72 saat boyunca devam ederse, "güvenli" olarak kabul edilir ve çatlamadaki bir sonraki başarı, yarışma uğruna göz ardı edilir.

Güncellenen çatlama puanı politikasına ilişkin detaylar için aşağıdaki "Feragatname" bölümüne bakın.

Çatlaklar çekişmeler çekişmeden elimine edilir (“güvenli” olmadığı sürece). Düzenlenmemeliler. Bir okuyucu yeni bir program sunmak isterse, bunu ayrı bir cevapta yapmalıdır.

En yüksek puanı alan kraker (ler), kazanan programların geliştiricileri ile birlikte kazananlar olarak ilan edilecektir.

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

İyi şanslar. :)

Liderler Sıralaması

Son derece puan durumu (Dennis'in CJam 49 teslimi için bekleyen güvenliği).

Güvenli Dolaplar

  1. CJam 49, Dennis
  2. CJam 62, Dennis güvenli
  3. CJam 91, Dennis güvenli
  4. Python 156, Maarten Baert güvenli
  5. Perl 256, chilemagic güvenli
  6. Java 468, Geobits güvenli

Durdurulamaz Krakerler

  1. Peter Taylor [Ruby 130, Java 342, Mathematica 146 *, Mathematica 72 *, CJam 37]
  2. Dennis [Pyth 13, Python 86 *, Lua 105 *, GolfScript 116, C 239 *]
  3. Martin Büttner [Javascript 125, Python 128 *, Ruby 175 *, Ruby 249 *]
  4. Tyilo [C 459, Javascript 958 *]
  5. freddieknets [Mathematica 67 *]
  6. Ilmari Karonen [Python27 182 *]
  7. azotlu [C 212 *]

* uyumlu olmayan gönderim

Feragatname (23:15 EST güncellendi, 26 Ağu)

Puanlama problemleri nihayet kritik kütleye ulaştığında (şimdiye kadar kırılan başvuruların üçte ikisi verilene kadar uyuşmuyor), üstteki kırıcıları kırılan başvuru sayısı (birincil) ve uyumlu kırılan başvurulardaki toplam karakter sayısı açısından sıraladım (ikincil).

Daha önce olduğu gibi, kesin bildiriler kırıldı, başvuruların uzunluğu ve uygun / uyumlu olmayan durumlarının tümü işaretlendi, böylece yeni resmi sıralamaların haksız olduğuna inanırlarsa okuyucuların kendi sıralamalarını çıkarmaları mümkün olacak.

Oyunun bu saatinde kuralları değiştirdiğim için özür dilerim.


6
Programların 4. noktaya ulaştığını nasıl doğrulayacaksınız? İnsanlardan bir kanıt eklemek için güvenli yanıtlarını düzenlemelerini bekliyor musunuz? Karma işlevlerin ideal olduğunu ve 48-bitlik bir başka element ile çarpışma şansının (yukarıdaki tahmininize göre) boşluğun kabul edilebilir olduğu varsayımıyla olasılıklı başvurulara izin veriliyor mu?
Peter Taylor

2
Puanlama sistemi, krakerleri en kısa kilitleri görmezden gelmeye teşvik ediyor gibi görünmektedir, çünkü iki küçük kilitten iki küçük kilidi kırarak daha iyi puan almaktadırlar.
Peter Taylor

3
@ COTO Bence sorun sadece 2 tane çatlama puanı alabilmeniz ve sadece en kısa süre alabilmenizdir. Öyleyse neden beklemeyin, umut etmeyin ve daha uzun boylu biri geliyor? Örneğin, Martin artık sahip hiçbir o zaten iki kısa olanlar çatlamış beri, benim (uzun) kilidi kırmak için teşvik. Madeni kıranlar, bir kez daha yapmak zorunda kalmadan onu yenecekler.
Geobits

1
Bence daha iyi bir skorlama sistemi, soru ile çatlak arasındaki toplam zamanların toplamı olabilir. Bu şekilde, bir grup kolay olanı kırmak yenilebilir ve asıl ödül gerçekten zor olanları kırmaktan gelir.
isaacg

1
Golf oynamak için yeniyim, bu yüzden aptalca bir soru, bunun için üzgünüm. Kod uzunluğu neden bayt cinsinden değil karakter cinsinden ölçülür? Sonuncusu kelimenin tam anlamıyla bir programın kapladığı hafıza alanıdır, bu yüzden benim için daha mantıklı görünüyor. Örneğin. CJam cevabı karakterdeki en kısa cevaptır, fakat büyüklüğüne bakıldığında (unicode yüzünden 326) ilk 5'de bile yok
freddieknets

Yanıtlar:


3

CJam, 62 karakter

"ḡꬼ쏉壥떨ሤ뭦㪐ꍡ㡩折量ⶌ팭뭲䯬ꀫ郯⛅彨ꄇ벍起ឣ莨ຉᆞ涁呢鲒찜⋙韪鰴ꟓ䘦쥆疭ⶊ凃揭"2G#b129b:c~

Stack Exchange, yazdırılamayan karakterleri silmeye yatkındır, ancak kodu bu yapıştırmadan kopyalayıp CJam yorumlayıcısına yapıştırmak benim için iyi sonuç verir .

Nasıl çalışır

Unicode dizesini bir ASCII dizesiyle değiştirdikten sonra aşağıdaki kod çalıştırılır:

" Push 85, read the integers from STDIN and collect everything in an array.               ";

85l~]

" Convert the array of base 4**17 digits into and array of base 2 digits.                 ";

4H#b2b

" Split into chunks of length 93 and 84.                                                  ";

93/~

" Do the following 611 times:

    * Rotate array A (93 elements) and B one element to the left.
    * B[83] ^= B[14]
    * T = B[83]
    * B[83] ^= B[0] & B[1] ^ A[23]
    * A[92] ^= A[26]
    * Rotate T ^ A[92] below the arrays.
    * A[92] ^= A[0] & A[1] ^ B[5].                                                        ";

{(X$E=^:T1$2<:&^2$24=^+\(1$26=^_T^@@1$2<:&^3$5=^+@}611*

" Discard the arrays and collects the last 177 generated bits into an array.              ";

;;]434>

" Convert the into an integer and check if the result is 922 ... 593.                     ";

2b9229084211442676863661078230267436345695618217593=

Bu yaklaşım , akış şifresi Trivium'un zayıflamış bir versiyonu olan Bivium-B'yi (bkz . Trivium benzeri şifrelerin cebirsel analizi) kullanır .

Program, tam sayı dizisini ilk durum olarak kullanır, durumu 434 kez günceller (354 mermi tam difüzyona ulaşır) ve doğru dizilim ile karşılaştırılan 177 bitlik çıktı üretir.

Devletin büyüklüğü tam olarak 177 bit olduğundan, bu , ilk durumu benzersiz bir şekilde tanımlamak için yeterli olmalıdır .

Örnek çalışma

$ echo $LANG
en_US.UTF-8
$ base64 -d > block.cjam <<< IgThuKHqrLzsj4nlo6XrlqjhiKTrrabjqpDqjaHjoanmipjvpb7itozuoIDtjK3rrbLul7bkr6zqgKvvjafpg6/im4XlvajqhIfrso3uprrotbfvmL/hnqPojqjguonhhp7mtoHujLPuipzlkaLpspLssJzii5npn6rpsLTqn5PkmKbspYbnlq3itorlh4Pmj60iMkcjYjEyOWI6Y34=
$ wc -m block.cjam
62 block.cjam
$ cjam block.cjam < block.secret; echo
1
$ cjam block.cjam <<< "1 2 3 4 5"; echo
0

6

CJam, 91 karakter

q~]KK#bD#"᫖࿼듋ޔ唱୦廽⻎킋뎢凌Ḏ끮冕옷뿹毳슟夫΢眘藸躦䪕齃噳卤"65533:Bb%"萗縤ᤞ雑燠Ꮖ㈢ꭙ㈶タ敫䙿娲훔쓭벓脿翠❶셭剮쬭玓ୂ쁬䈆﹌⫌稟"Bb=

Stack Exchange, yazdırılamayan karakterleri silmeye yatkındır, ancak kodu bu yapıştırmadan kopyalayıp CJam yorumlayıcısına yapıştırmak benim için iyi sonuç verir .

Nasıl çalışır

Unicode dizgesini tamsayılarla değiştirdikten sonra (temel 65533 sayı karakterlerinin rakamlarını dikkate alarak), aşağıdaki kod çalıştırılır:

" Read the integers from STDIN and collect them in an array.                               ";

q~]

" Convert it into an integer by considering its elements digits of a base 20**20 number.   ";

KK#b

" Elevate it to the 13th power modulus 252 ... 701.                                        ";

D#
25211471039348320335042771975511542429923787152099395215402073753353303876955720415705947365696970054141596580623913538507854517012317194585728620266050701%

" Check if the result is 202 ... 866.                                                      ";

20296578126505831855363602947513398780162083699878357763732452715119575942704948999334568239084302792717120612636331880722869443591786121631020625810496866=

13, modülün göndericisine eşlik ettiği için (müşteri sırrı gizlidir, bu yüzden sadece bana güvenmeniz gerekir), farklı tabanlar farklı sonuçlar üretecektir, yani çözüm benzersizdir.

Birisi küçük üsten (13) yararlanamazsa, bu kilidi kırmanın en etkili yolu modülü katıştırmaktır (bkz. RSA problemi ). Modül için 5 saatlik bir tamsayı seçtim, bu da 72 saatlik faktoring girişimlerine dayanmalı.

Örnek çalışma

$ echo $LANG
en_US.UTF-8
$ base64 -d > lock.cjam <<< cX5dS0sjYkQjIgHuiJHhq5bgv7zrk4velOWUse6zjuCtpuW7veK7ju2Ci+uOouWHjOG4ju+Rh+uBruWGleyYt+u/ueavs+6boOyKn+Wkq86i55yY6Je46Lqm5KqV6b2D5Zmz75Wp5Y2kIjY1NTMzOkJiJSIB6JCX57ik4aSe74aS6ZuR54eg4Y+G44ii6q2Z44i244K/5pWr5Jm/5aiy7ZuU7JOt67KT7rO26IS/57+g4p2275+K7IWt5Ymu7Kyt546T4K2C7IGs5IiG77mM4quM56ifIkJiPQ==
$ wc -m lock.cjam
91 lock.cjam
$ cjam lock.cjam < lock.secret; echo
1
$ cjam lock.cjam <<< "1 2 3 4 5"; echo
0

İlk olandan gereksiz bir karakteri çıkarmayı unuttuğumdan beri yeni bir sürüm yayınladım. Gizli dizisi hala aynı, bu yüzden ikisinden birini kırmayı deneyebilirsiniz.
Dennis,

Bilginize, faktoring girişimi iptal ediyorum. msieve 276 saatlik bir zaman sınırı koydu, ancak bu sadece faktör tabanını oluşturmak içindi. O zaman o found 1740001 rational and 1739328 algebraic entries; O zamandan beri onları işlemek için neredeyse 100 saat vardı ve raporlar sieving in progress b = 46583, 0 complete / 0 batched relations (need 44970493).
Peter Taylor

@PeterTaylor: Görünüşe göre 512 bit overkill. Tam sayıyı diğer cevabımda mı yoksa bu cevapta mı?
Dennis

Ah, aman Evet, diğeri.
Peter Taylor

4

Python - 128

Bunu deneyelim:

i=input()
k=1050809377681880902769L
print'01'[all((i>1,i[0]<i[4],k%i[0]<1,k%i[4]<1,i[4]-i[3]==i[3]-i[2]==i[2]-i[1]==i[1]-i[0]))]

(Kullanıcının örneğin virgülle ayrılmış 5 sayı girmesini bekler 1,2,3,4,5.)


3
32416190039,32416190047,32416190055,32416190063,32416190071
Martin Ender

Vay, bu hızlı oldu! Haklısın! Ve ben dışarıdayım.
Falko

3
BTW, bu aslında geçerli değil çünkü beş tamsayıcınız 32 bit tam sayıya uymuyor.
Martin Ender

4

Java: 468

Giriş olarak verilir k(int[5]). Eşit aralıklı değilse erken kefalet. Aksi takdirde, her on karmaşanın doğru olup olmadığını anlamak biraz zaman alır. Büyük sayılar için "biraz" on saniye veya daha fazla anlamına gelebilir, bu nedenle krakerleri kirletebilir.

//golfed
int k(int[]q){int b=q[1]-q[0],i,x,y,j,h[]=new int[]{280256579,123883276,1771253254,1977914749,449635393,998860524,888446062,1833324980,1391496617,2075731831};for(i=0;i<4;)if(q[i+1]-q[i++]!=b||b<1)return 0;for(i=1;i<6;b=m(b,b/(i++*100),(1<<31)-1));for(i=0;i<5;i++){for(j=1,x=b,y=b/2;j<6;x=m(x,q[i]%100000000,(1<<31)-1),y=m(y,q[i]/(j++*1000),(1<<31)-1));if(x!=h[i*2]||y!=h[i*2+1])return 0;}return 1;}int m(int a,int b,int c){long d=1;for(;b-->0;d=(d*a)%c);return (int)d;}

// line breaks
int k(int[]q){
    int b=q[1]-q[0],i,x,y,j,
    h[]=new int[]{280256579,123883276,1771253254,1977914749,449635393,
                  998860524,888446062,1833324980,1391496617,2075731831};
    for(i=0;i<4;)
        if(q[i+1]-q[i++]!=b||b<1)
            return 0;
    for(i=1;i<6;b=m(b,b/(i++*100),(1<<31)-1));
    for(i=0;i<5;i++){
        for(j=1,x=b,y=b/2;j<6;x=m(x,q[i]%100000000,(1<<31)-1),y=m(y,q[i]/(j++*1000),(1<<31)-1));
        if(x!=h[i*2]||y!=h[i*2+1])
            return 0;
    }
    return 1;
}
int m(int a,int b,int c){
    long d=1;for(;b-->0;d=(d*a)%c);
    return (int)d;
}

1
Giriş aritmetik dizisi azalansa kodunuz kilitlenir. Ya da en azından, çok uzun zaman alıyor. Bu da beni gizli kodun yükseldiğini düşündürüyor ...
Keith Randall

3
@KeithRandall Oops. Azalan sekansların alışılmadık derecede kısa bir süre alması ve inancınızı daha da güçlendirmesi için dört bayt ekleyelim .
Geobits

4

Java: 342

int l(int[]a){String s=""+(a[1]-a[0]);for(int b:a)s+=b;char[]c=new char[11];for(char x:s.toCharArray())c[x<48?10:x-48]++;for(int i=0;i<11;c[i]+=48,c[i]=c[i]>57?57:c[i],i++,s="");for(int b:a)s+=new Long(new String(c))/(double)b;return s.equals("-3083.7767567702776-8563.34366442527211022.4345579010483353.1736981951231977.3560837512646")?1:0;}

Burada hem giriş karakter sayısına hem de belirli girişe bağlı bir dizge tabanlı kilitleyici var. Dizisi olabilir karanlık açılır kültür referansları dayanmalıdır. İyi eğlenceler!

Biraz ağladı:

int lock(int[]a){
    String s=""+(a[1]-a[0]);
    for(int b:a)
        s+=b;
    char[]c=new char[11];
    for(char x:s.toCharArray())
        c[x<48?10:x-48]++;
    for(int i=0;i<11;c[i]+=48,
                     c[i]=c[i]>57?57:c[i],
                     i++,
                     s="");
    for(int b:a)
        s+=new Long(new String(c))/(double)b;
    return s.equals("-3083.7767567702776-8563.34366442527211022.4345579010483353.1736981951231977.3560837512646")?1:0;
}

2
8675309? 90210?
Malaçi

1
@Malachi İki önemli referans, hiç şüphesiz, ancak bu alıştırmada uygulanabilirliklerini onaylayamam veya reddedemem.
Geobits

lol, bu zorluğun nasıl çalıştığını henüz tam olarak çözemedim, daha sonra evdeyken bir şans verebilirim.
Malaçi

1
İlk terim -8675309, delta'dır 5551212.
Peter Taylor

@PeterTaylor Güzel bitti :)
Geobits

4

Python, 147

Düzenleme: Dennis'in yorumuna dayanan daha kısa versiyon. Herhangi bir bilgiyi sızdırmamak için diziyi de güncelledim.

def a(b):
    c=1
    for d in b:
        c=(c<<32)+d
    return pow(7,c,0xf494eca63dcab7b47ac21158799ffcabca8f2c6b3)==0xa3742a4abcb812e0c3664551dd3d6d2207aecb9be

Parçalanamaz logaritma problemine dayanarak, kırılmaz olduğuna inanılıyor, ancak kullandığım asıl güvenli olmak için muhtemelen çok küçük (ve başka sorunları olabilir, bilmiyorum). Ve tabii ki kaba kuvvet uygulayabilirsiniz, çünkü bilinmeyenler yalnızca 32 bit tam sayıdır.


Kesikli logaritmalar düşündüğümden daha zor. Krakerim 26 saattir bu işte. Pes ediyorum.
Dennis,

İşaret problemini , sabiti uygun şekilde başlatarak c=1, hesaplayarak c=(c<<32)+dve değiştirerek çözebilirsiniz .
Dennis,

3

Javascript 125

Bu oldukça çabuk kırılmalı. Daha güçlü bir şeyle takip edeceğim.

function unlock(a, b, c, d, e)
{
    return (e << a == 15652) && (c >> a == 7826) && (e - b == d) && (d - c - a == b) ? 1 : 0;
}

6
0, 3913, 7826, 11739, 15652
Martin Ender

yep sen var :)
rdans

3

Ruby, 175

a=gets.scan(/\d+/).map(&:to_i)
a.each_cons(2).map{|x,y|x-y}.uniq[1]&&p(0)&&exit
p a[2]*(a[1]^a[2]+3)**7==0x213a81f4518a907c85e9f1b39258723bc70f07388eec6f3274293fa03e4091e1?1:0

Kriptografik bir karma kullanımdan farklı olarak veya srandbu kesin olarak benzersizdir (ki bu hafif bir ipucu). STDIN üzerinden, rakamsız, yeni olmayan bir karakter veya karakterlerle sınırlandırılmış beş numara alır. STDOUT çıkışları.


Evet, imzaladıklarını unuttum.
histocrat

2
622238809,1397646693,2173054577,2948462461,3723870345(önceki tahminim bir hata yaptı, ancak bu test edildi). Bunun geçerli olduğunu sanmıyorum, çünkü son rakam imzalı bir 32 bit tamsayıya uymuyor.
Martin Ender

3

GolfScript (116 karakter)

Girdiyi boşlukla ayrılmış tam sayılar olarak alır.

~]{2.5??:^(&}%^base 2733?5121107535380437850547394675965451197140470531483%5207278525522834743713290685466222557399=

2
-51469355 -37912886 -24356417 -10799948 2756521
Dennis,

İyi iş. Küçük üsten faydalandın mı?
Peter Taylor

2
Hayır, modülü katıştırdım. Primo'nun Çoklu Polinom Kuadratik Elek ve PyPy'i kullanarak sadece 13 saniye sürdü.
Dennis,

Bu durumda, şu anki durumumdan, kompakt olarak ifade edilmiş bir modül kullanarak golf oynamaktan vazgeçmeliyim. Eğer sonuç faktoringden korunmak için 1024 bit gibi bir şey olmalıysa, o zaman bir baz-256 gösterimi kullanılsa bile çok uzun sürecektir.
Peter Taylor

Umarım değildir. Cevabım seninkiyle aynı fikri kullanıyor, ancak 512 bitlik bir modül ve daha küçük bir üs ile (13). 72 saatlik zaman sınırı göz önüne alındığında, bu yeterli olabilir ...
Dennis

3

C 459 bayt

Tyilo tarafından çözüldü - AŞAĞIDAKİ EDİT

int c (int* a){
int d[4] = {a[1] - a[0], a[2] - a[1], a[3] - a[2], a[4] - a[3]};
if (d[0] != d[1] || d[0] != d[2] || d[0] != d[3]) return 0;
int b[5] = {a[0], a[1], a[2], a[3], a[4]};
int i, j, k;
for (i = 0; i < 5; i++) { 
for (j = 0, k = 2 * i; j < 5; j++, k++) {
k %= i + 1;
b[j] += a[k];
}
}
if (b[0] == 0xC0942 - b[1] && 
b[1] == 0x9785A - b[2] && 
b[2] == 0x6E772 - b[3] && 
b[3] == 0xC0942 - b[4] && 
b[4] == 0xB6508 - b[0]) return 1;
else return 0;
}

C çözümü yazacak birine ihtiyacımız var, değil mi? Boyu kimseyi etkilemiyorum, golfçü değilim. Umarım, bu ilginç bir meydan okumadır!

Bunu kırmanın bariz bir yolu olduğunu sanmıyorum ve tüm girişimleri hevesle bekliyorum! Bu çözümün benzersiz olduğunu biliyorum. Çoğunlukla uzunluk gereksinimlerini karşılamak için çok az şaşırtma. Bu basitçe test edilebilir:

int main(){
    a[5] = {0, 0, 0, 0, 0} /* your guess */
    printf("%d\n", c(a));
    return 0;
}

PS için bir önemi var a[0] Kendi başına bir sayı olarak ve birinin yorumlarda işaret ettiğini görmek istiyorum!

DÜZENLE:

Çözüm: 6174, 48216, 90258, 132300, 174342

Çatlama hakkında bir not:

Kullanılan yöntem bu olmasa da (yorumları görün), çok kolay bir kabadayı ile kendi şifremi kırdım. Şimdi anlıyorum ki sayıları büyük yapmak çok önemli. Aşağıdaki kod, upper_boundbilinen bir üst sınırın olduğu herhangi bir şifreyi kırabilir a[0] + a[1] + a[2] + a[3] + a[4]. Yukarıdaki şifredeki üst sınır , algoritmanın 457464denklem sisteminden b[]ve bazı çalışma yöntemlerinden türetilebilir . Bu gösterilebilir b[4] = a[0] + a[1] + a[2] + a[3] + a[4].

int a[5];
for (a[0] = 0; a[0] <= upper_bound / 5; a[0]++) {
    for (a[1] = a[0] + 1; 10 * (a[1] - a[0]) + a[0] <= upper_bound; a[1]++) {
        a[2] = a[1] + (a[1] - a[0]);
        a[3] = a[2] + (a[1] - a[0]);
        a[4] = a[3] + (a[1] - a[0]);
        if (c(a)) {
            printf("PASSED FOR {%d, %d, %d, %d, %d}\n", a[0], a[1], a[2], a[3], a[4]);
        }
    }
    printf("a[0] = %d Checked\n", a[0]);
}

Bununla birlikte a[0] = 6174, bu döngü bir dakikadan biraz daha az bir sürede çalışmamı bozdu.


6
Çözüm: 6174, 48216, 90258, 132300, 174342.
Tyilo

Vay bu hızlıydı. Güzel bir. Bruteforced veya özlediğim zekice bir şey mi buldun?
BrainSteel

Ben şöyle Mathematica sembolik değerlendirmeyi kullandı: ghostbin.com/paste/jkjpf ekran görüntüsü: i.imgur.com/2JRo7LE.png
Tyilo

Düzenleme: Ben temelde aynı şeyi yaptım, ancak 500k de üst fudged. Cevap aldım ve Tyilo'nun çoktan yayınladığını görmüştüm :(
Geobits

@Geobits Bu şaşırtıcı derecede doğru bir tahmin. Bu sayıların sonuna biraz daha 0 eklemeliydim.
BrainSteel

3

Mathematica 80 67

f=Boole[(p=NextPrime/@#)-#=={18,31,6,9,2}&&BitXor@@#~Join~p==1000]&

Koşu:

f[{1,2,3,4,5}] (* => 0 *)

Muhtemelen kırılması oldukça kolay, ayrıca birden fazla çözümü olabilir.

Güncelleme: Martin Büttner’in önerdiği şeyi yaparak golfün iyileştirilmesi. Fonksiyonun ve tuşun işlevselliği değişmedi.


@ MartinBüttner Onları kırdığınızda daha yüksek puan almak için cevapların iyileştirilmesi. Smart; P
Tyilo

Huh, kontra karşılaşma için gol atma paragrafını atladım. Ben sadece hiç eğlenmeden sadece eğlence için olduğunu düşündüm. Bunun benim için anlamlı olacağını düşünmeme rağmen çözümleri kısaltmak istiyorum çünkü bu puanımı düşürecektir.
Martin Ender

4
{58871,5592,-47687,-100966,-154245}
freddieknets

@ freddieknets Oluştururken kullandığım çözüm değil. Bunun NextPrimenegatif değerler getirebileceğini bilmiyordum . Nasıl buldun?
Tyilo

O zaman anahtarınız benzersiz değil: s. Sadece birkaç test yaptım - gerçekten NextPrime [#] - # 'in 31 olduğu bir sayı yok, bu yüzden bunu kırmanın kolay bir yolu.
freddieknets

2

Python27, 283 182

Tamam, dolabımda kendime güveniyorum, ancak girişleri hesaplamak için 'tersine çevirme zoru' eklediğim için, tersine çevirmeyi zorlaştırmak için oldukça uzun.

import sys
p=1
for m in map(int,sys.argv[1:6]):m*=3**len(str(m));p*=m<<sum([int(str(m).zfill(9)[-i])for i in[1,3,5,7]])
print'01'[p==0x4cc695e00484947a2cb7133049bfb18c21*3**45<<101]

düzenleme: daha fazla golf için colevk teşekkürler. Düzenleme sırasında algoritmamdaki bir hatanın yanı sıra bir hata olduğunu farkettim, belki bir dahaki sefere daha fazla şansım olur.


5
Bu, argümanların yeniden sıralanması altında değişmez, bu yüzden geçerli bir dolap değil.
Peter Taylor

Ayrıca, kodun yayınlandığı şekliyle şüpheli olduğundan şüpheliyim: anahtar 121174841 121174871 121174901 121174931 121174961çalışıyor, ancak [1,3,5,7]satır 7'deki listeyle değiştirilirse [1,3,5,7,11].
Ilmari Karonen

Kahretsin, evet sadece yazım hatası düzeltiyordum, bu sırada algoritmamda çok önemli bir hata yaptım, kırılması çok kolay oldu: |
stokastic

Aslında, hatayı bulmak ve düzeltmek zordu; Algoritmanız verilmişse, sabiti hesaba katmak denemek için bariz bir şeydi.
Ilmari Karonen

2

Mathematica 142 146

EDIT : anahtar benzersiz değildi, 4 karakter eklendi, şimdi oldu.

n=NextPrime;
f=Boole[
    FromDigits /@ (
        PartitionsQ[n@(237/Plus@##) {1, ##} + 1] & @@@ 
            IntegerDigits@n@{Plus@##-37*Log[#3],(#1-#5)#4}
    ) == {1913001154,729783244}
]&

(Okunabilirlik için boşluklar ve yeni satırlar eklendi, sayılmadı ve gerekli değil).

Kullanımı:

f[1,2,3,4,5]   (* => 0 *)

1
İlk terim 256208, delta -5.
Peter Taylor

Dang, o zaman hala benzersiz değil, çünkü bu benim orijinal anahtarım değil. Bruteforce yaptın mı?
freddieknets

Test et, bir hata yapmış olabilirim çünkü test etmek için Mathematica'ya erişimim yok. Her aşamada kaba kuvvet kullanılıyor, ancak bu bilgisayar zamanı değil. Yaklaşım ilk çıktı IntegerDigitsve delta için aday almak için çıktısını geriye ve sonra faktör etmektir.
Peter Taylor

Ancak bu yaklaşımın yine de benzersiz olması mümkün değil. Beş girdiden ikincisi, yalnızca iletilen toplamda kullanılır NextPrime; eğer artı veya eksi ile değiştirirsek, bunlardan en az biri bir sonraki aynı primi verecektir.
Peter Taylor

evet ama aritmetik bir sekans için -as gerekli girdi- benzersiz olması gerekiyordu.
freddieknets

1

2 saat içinde @Dennis tarafından çatladı


İşleri başlatmak için sadece basit bir şey - bunun çabucak kırılmasını bekliyorum.

Pyth , 13

h_^ZqU5m-CGdQ

STDIN'de virgülle ayrılmış girişi alır.

Bu şekilde çalıştırın (-c, programı komut satırı argümanı olarak alır):

$ echo '1,2,3,4,5' | python3 pyth.py -c h_^ZqU5m-CGdQ
0

Program düzeltildi - Spesifikasyonu anlamadım.

Bu dil bu yarışma için çok ezoterik olabilir - OP öyle düşünüyorsa, onu kaldıracağım.


7
Az 1,2,3,4,5önce anahtarı verdin mi?
Peter Taylor

1
Denediğim her giriş 1 döndürdü, 1 ve 0'yı çıkış olarak mı değiştirdiniz?
Tyilo

Üzgünüz, Çıktı ile Geri dönüş arasındaki farkı anlamadım - program şimdi çalışmalı. Aynı temel algoritma.
isaacg

3
97,96,95,94,93(Sadece çatlama puanımı öldürdüm.)
Dennis

@Dennis Aferin. Çatlama skor sisteminin değiştirilmesi gerekiyor - bu gerçekten garip teşvikler yaratıyor.
isaacg

1

Lua 105

Kırılmadan çok uzun sürmeyeceğinden şüpheliyim, ama işte başlıyoruz:

function f(a,b,c,d,e)
   t1=a%b-(e-2*(d-b))
   t2=(a+b+c+d+e)%e
   t3=(d+e)/2
   print(t1==0 and t2==t3 and"1"or"0")
end

(netlik için boşluk eklendi ancak sayının bir parçası değil)


3, 7, 11, 15, 19veya6, 14, 22, 30, 38
Dennis,

@Dennis: ne yazık ki ikisi de değil. Eşsizliği sağlamak için biraz sonra çalışmak zorunda kalacağım.
Kyle Kanos

t1==0Ne Szaman artıyor. Ayrıca, her iki koşul da homojendir; Eğer Sbir çözüm, so kS.
Dennis,

1

Perl - 256

sub t{($z,$j,$x,$g,$h)=@_;$t="3"x$z;@n=(7,0,split(//,$g),split(//,$h),4);@r=((2)x6,1,1,(2)x9,4,2,2,2);$u=($j+1)/2;for$n(0..$#r+1){eval{substr($t,$j,1)=$n[$n]};if($@){print 0; return}$j+=$r[$n]*$u}for(1..$x){$t=pack'H*',$t;}eval$t;if($@||$t!~/\D/){print 0}}

Çok fazla hata işleme mantığı koymak zorunda kaldım ve bu kesinlikle çok daha fazla golf oynayabilir. Bu bir yazdırılır 1Haklısınız beş numarayı olsun. Umarım0 başka her şey için bir baskı yapacak (hatalar veya hiçbir şey olabilir, bilmiyorum). Birisi kodu geliştirmek veya daha fazla golf oynamak için yardım etmek isterse, yardım etmekten çekinmeyin!


İle ara:

t(1,2,3,4,5);

1

Yakut - 130

Doğrusal Geribildirim Kaydırma Kaydına Dayalı. Komut satırı argümanlarına göre girdiler.
LFSR'lerin niteliğine göre benzersiz olmalıdır. İpucu: artan ve hepsi olumlu.

Yakında kimse çözmezse daha fazla ipucu verir.

x=($*.map{|i|i.to_i+2**35}*'').to_i
(9**8).times{x=((x/4&1^x&1)<<182)+x/2}
p x.to_s(36)=="qnsjzo1qn9o83oaw0a4av9xgnutn28x17dx"?1:0

3
Initial value 781783, increment 17982811
Peter Taylor

@PeterTaylor Argh... =)
Vectorized

1

Ruby, 249

a=gets.scan(/\d+/).map(&:to_i)
a.each_cons(2).map{|x,y|x-y}.uniq[1]&&p(0)&&exit
r=(a[0]*a[1]).to_s(5).tr'234','(+)'
v=a[0]<a[1]&&!r[20]&&(0..3).select{|i|/^#{r}$/=~'%b'%[0xaa74f54ea7aa753a9d534ea7,'101'*32,'010'*32,'100'*32][i]}==[0]?1:0rescue 0
p v

Should be fun. Who needs math?


2
309, 77347, 154385, 231423, 308461 but I don't think it's unique.
Martin Ender

Yeah, it's not. For the same regex (i.e. product of the first two numbers), I also find 103, 232041, 463979, 695917, 927855 and 3, 7966741, 15933479, 23900217, 31866955. And I'm pretty sure there are other valid regexes by using additional +s.
Martin Ender

Sorry, I guess I messed up the test string. There was supposed to be only one regexp with a unique factorization.
histocrat

If you want to try to fix it, make sure to take possessive quantifiers into account. I can also create a larger, equivalent regex by inserting () or similar.
Martin Ender

1

CJam, 49 characters

"腕옡裃䃬꯳널֚樂律ࡆᓅ㥄뇮┎䔤嬣ꑙ䘿휺ᥰ籃僾쎧諯떆Ἣ餾腎틯"2G#b[1q~]8H#b%!

Try it online.

How it works

" Push a string representing a base 65536 number and convert it to an integer.            ";

"腕옡裃䃬꯳널֚樂律ࡆᓅ㥄뇮┎䔤嬣ꑙ䘿휺ᥰ籃僾쎧諯떆Ἣ餾腎틯"2G#b

" Prepend 1 to the integers read from STDIN and collect them into an array.               ";

[1q~]

" Convert that array into an integer by considering it a base 2**51 number.               ";

8H#b

" Push the logical NOT of the modulus of both computed integers.                          ";

%!

The result will be 1 if and only if the second integer is a factor of the first, which is a product of two primes: the one corresponding to the secret sequence and another that doesn't correspond to any valid sequence. Therefore, the solution is unique.

Factorizing a 512 bit integer isn't that difficult, but I hope nobody will be able to in 72 hours. My previous version using a 320 bit integer has been broken.

Example run

$ echo $LANG
en_US.UTF-8
$ base64 -d > flock512.cjam <<< IuiFleyYoeijg+SDrOqvs+uEkNaa76a/5b6L4KGG4ZOF76Gi46WE64eu4pSO5JSk5ayj6pGZ5Ji/7Zy64aWw57GD5YO+7I6n6Kuv65aG7qK04byr6aS+6IWO7rSn7YuvIjJHI2JbMXF+XThII2IlIQ==
$ wc -m flock512.cjam
49 flock512.cjam
$ cjam flock512.cjam < flock512.secret; echo
1
$ cjam flock512.cjam <<< "1 2 3 4 5"; echo
0

I've had msieve running on it for over 24 hours, but since its self-imposed time limit is 276.51 CPU-hours and I've only given it one CPU I'm not optimistic.
Peter Taylor

0

Javascript 958

Converts the inputs to a number of data types and performs some manipulations relevant to each data type along the way. Should be fairly easily reversed for anyone that takes the time.

function encrypt(num)
{
    var dateval = new Date(num ^ (1024-1) << 10);

    dateval.setDate(dateval.getDate() + 365);

    var dateString = (dateval.toUTCString() + dateval.getUTCMilliseconds()).split('').reverse().join('');

    var result = "";

    for(var i = 0; i < dateString.length; i++)
        result += dateString.charCodeAt(i);

    return result;
}

function unlock(int1, int2, int3, int4, int5)
{
    return encrypt(int1) == "5549508477713255485850495848483249555749321109774324948324410511470" && encrypt(int2) == "5756568477713252485848495848483249555749321109774324948324410511470" && encrypt(int3) == "5149538477713248485856485848483249555749321109774324948324410511470" && encrypt(int4) == "5356498477713256535853485848483249555749321109774324948324410511470" && encrypt(int5) == "5748568477713251535851485848483249555749321109774324948324410511470" ? 1 : 0;
}

5
Brute forced: 320689, 444121, 567553, 690985, 814417
Tyilo

@Tyilo If you stop now, I think no cracker can beat your score. ;)
Martin Ender

2
@MartinBüttner Unless this can be golfed to under 512 per the OP, I don't think it counts.
Geobits

0

C, 239 (Cracked by Dennis)

Go here for my updated submission.

Could probably be golfed a little more thoroughly. Admittedly, I haven't taken the time to prove the key is unique (it probably isn't) but its definitely on the order of a hash collision. If you crack it, please share your method :)

p(long long int x){long long int i;x=abs(x);
for (i=2;i<x;i++) {if ((x/i)*i==x) return 0;}return 1;}
f(a,b,c,d,e){char k[99];long long int m;sprintf(k,"%d%d%d%d%d",e,d,c,b,a);
sscanf(k,"%lld",&m);return p(a)&&p(b)&&p(c)&&p(d)&&p(e)&&p(m);}

1
So, 0 0 0 0 0?
Dennis

Sigh that was a bug, but yes that works.
Orby

I've updated with a corrected version that should be a little more interesting ;)
Orby

See the corrected version here.
Orby

0

C, 212 by Orby -- Cracked

https://codegolf.stackexchange.com/a/36810/31064 by Orby has at least two keys:

13 103 193 283 373
113 173 233 293 353

Orby asked for the method I used to crack it. Function p checks whether x is prime by checking x%i==0 for all i between 2 and x (though using (x/i)*i==x instead of x%i==0), and returns true if x is a prime number. Function f checks that all of a, b, c, d and e are prime. It also checks whether the number m, a concatenation of the decimal representations of e, d, c, b and a (in that order), is prime. The key is such that a,b,c,d,e and m are all prime.

Green and Tao (2004) show that there exist infinitely many arithmetic sequences of primes for any length k, so we just need to look for these sequences that also satisfy m being prime. By taking long long as being bounded by -9.223372037e+18 and 9.223372037e+18, we know that for the concatenated string to fit into long long, the numbers have an upper bound of 9999. So by using a python script to generate all arithmetic sequences within all primes < 10000 and then checking whether their reverse concatenation is a prime, we can find many possible solutions.

For some reason I came up with false positives, but the two above are valid according to the program. In addition there may be solutions where e is negative and the rest are positive (p uses the modulus of x), but I didn't look for those.

The keys I gave are all arithmetic sequences but Orby's script doesn't appear to actually require the inputs to be an arithmetic sequence, so there may be invalid keys too.


0

MATLAB: Apparently invalid

Very simple, you just have to generate the right random number.

function ans=t(a,b,c,d,e)
rng(a)
r=@(x)rng(rand*x)
r(b)
r(c)
r(d)
r(e)
rand==0.435996843156676

It can still error out, but that shouldn't be a problem.


1
This approach is prohibited in the comments. If it's not mentioned in the question, propose an edit. Sorry.
Peter Taylor

@PeterTaylor I guess I am out then, I will just leave it here without score as I am curious whether someone can find a weakness.
Dennis Jaheruddin

0

MATLAB (with Symbolic Toolbox), 173 characters

This isn't an official entry and won't count towards anyone's cracking score, but it will net you mad bragging rights. ;)

function b=L(S),c=sprintf('%d8%d',S(1),S(2)-S(1));b=numel(unique(diff(S)))==1&&numel(c)==18&&all(c([8,9])==c([18,17]))&&isequal(c,char(sym(sort(c,'descend'))-sym(sort(c))));

The symbolic toolbox is only required to handle subtraction of big integers.

Brute forcing it should be a dog, but if you're familiar with the series it involves, the solution is trivial.


0

Python 2 (91)

Edit: This isn't allowed because the argument for uniqueness is probabilistic. I give up.


s=3
for n in input():s+=pow(n,s,7**58)
print s==0x8b5ca8d0cea606d2b32726a79f01adf56f12aeb6e

Takes lists of integers as input, like [1,2,3,4,5].

The loop is meant to operate on the inputs in an annoying way, leaving a tower of sums and exponents. The idea is like discrete log, but with messy complication instead of mathematical simplicity. Maybe the compositeness of the of the modulus is a vulnerability, in which case I could make it something like 7**58+8.

I don't really know how I'd prove that my key is the only one, but the range of outputs is at least 10 times bigger than the range of inputs, so probably? Though maybe only a small fraction of potential outputs are achievable. I could always increase the number of digits at the cost of characters. I'll leave it up to you to decide what's fair.

Happy cracking!


0

Mathematica - 72

Version 2 of my script, with the same key as the one intended for my version 1.

This basically removes negative prime numbers for NextPrime.

f=Boole[(p=Abs[NextPrime/@#])-#=={18,31,6,9,2}&&BitXor@@#~Join~p==1000]&

Running:

f[{1,2,3,4,5}] (* => 0 *)

Assuming that I've correctly understood what your code does, I get several solutions of which the smallest is initial term 9244115, delta 25.
Peter Taylor

@PeterTaylor I can confirm that that one is valid.
Martin Ender

@PeterTaylor correct, another key is 1073743739, 1073886396, 1074029053, 1074171710, 1074314367
Tyilo

0

Python, 86 characters

a,b,c,d,e=input()
print 1if(a*c^b*e)*d==0xd5867e26a96897a2f80 and b^d==48891746 else 0

Enter the numbers like 1,2,3,4,5.

> python 36768.py <<< "1,2,3,4,5"
0
> python 36768.py <<< "[REDACTED]"
1

This isn't a valid submission; it accepts the input 1,0,1,63021563418517255630720,0.
Dennis

@Dennis Fixed. I hope it's valid now.
Snack

1
19960211, 31167202, 42374193, 53581184, 64788175
Dennis

@Dennis Correct and awesome. I think I'm very poor at math.
Snack

2
@Dennis, 63021563418517255630720 isn't a 32-bit number.
Peter Taylor


0

CJam, 37 characters (broken)

"煷➻捬渓类ⶥ땙ዶ꾫㞟姲̷ᐂ㵈禙鰳쥛忩蔃"2G#b[1q~]4G#b%!

Try it online.

How it works

See my new answer.

Example run

$ echo $LANG
en_US.UTF-8
$ base64 -d > flock.cjam <<< IueFt+Keu+aNrOa4k+exu+K2peuVmeGLtuq+q+Oen+Wnsu6AhMy34ZCC47WI56aZ6bCz7KWb5b+p6JSDIjJHI2JbMXF+XTRHI2IlIQ==
$ wc -m flock.cjam
37 flock.cjam
$ cjam flock.cjam < flock.secret; echo
1
$ cjam flock.cjam <<< "1 2 3 4 5"; echo
0

1
737262825 208413108 3974530688 3445680972 2916831257 works but isn't an arithmetic progression. Factored in 3 hours 20 minutes. 512-bit numbers were apparently doable in 72 hours for $75 on EC2 two years ago, so I think that would have been safe.
Peter Taylor

@PeterTaylor: That returns 1, but the last three integers are greater than MAX_INT, so it's not a valid key. That being said, 3 h 20 m is pretty impressive. The algorithm I was using took 16 hours for a 256-bit semiprime...
Dennis

I thought there must be some negative numbers in there somewhere because the deltas were almost right but not quite. I'll get on to it.
Peter Taylor

1
737262825 208413109 -320436607 -849286323 -1378136039
Peter Taylor

@PeterTaylor: That's the one. I hope the 512 bit version lasts longer.
Dennis

-2

C, 212 (Cracked)

This is the same idea as my previous submission, golfed more thoroughly, with a bug corrected that passed 0,0,0,0,0 (Thanks to Dennis for pointing out the bug). Compile with -std=c99.

#define L long long
p(L x){x=abs(x);for(L i=2;i<x;i++){if((x/i)*i==x)return 0;}return(x>1);}
f(a,b,c,d,e){char k[99];L m;sprintf(k,"%d%d%d%d%d",e,d,c,b,a);sscanf(k,"%lld",&m);
return p(a)&p(b)&p(c)&p(d)&p(e)&p(m);}

Any sequence (arithmetic or not) of negative primes will work. Two examples: -7 -37 -67 -97 -127, -157 -127 -97 -67 -37
Dennis

Yeah, my code is just riddled with bugs. The answer nitrous gave is along the lines of what I was looking for. But nice job pointing out the more obvious answers.
Orby
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.