Sahte ve gerçekten rastgele sayılar nasıl farklıdır ve neden önemlidir?


665

Bunu hiç anlamadım. Diyelim ki herhangi bir dilde küçük bir program yazdığınızı söyleyin, biraz zar atın (sadece örnek olarak zar kullanın). 600.000 rulodan sonra, her bir sayı 100.000 kez haddelenmiş olacaktı, ki umduğum gibi.

Neden 'gerçek rastgeleliğe' adanmış web siteleri var? Şüphesiz, yukarıdaki gözlem göz önüne alındığında, herhangi bir sayıyı alma şansı, aralarından seçim yapabilecek sayıların neredeyse 1'i kadardır.

Python'da denedim : İşte 60 milyon rulonun sonucu. En yüksek varyasyon 0.15 gibidir. Bu alacağı kadar rastgele değil mi?

1 - 9997653 2347.0
2 - 9997789 2211.0
3 - 9996853 3147.0
4 - 10006533 -6533.0
5 - 10002774 -2774.0
6 - 9998398 1602.0

1
Üzerinde wikipedia makaleye göz atın donanım oluşturulan rasgele sayı - Ayrıca, bu bkz stats.stackexchange.com/questions/32794/...
steadyfish

21
Ne demek "biraz zar atmak"? Bir robot kolu ve kamera takılı mı?
starblue

3
tonunuzun genel özeti ile aynı fikirdeyim, buna sık sık çok fazla endişe duyuyoruz, ancak gerçek hayatta sömürüldü: en.wikipedia.org/wiki/Ronald_Dale_Harris
Grady Oyuncu

3
Neden önemli olduğuna dair gerçek rastgele bir eksiklik gösteren çevrimiçi bir poker oyunuyla ilgili bu makaleye bakın .
Varaquilex

1
Sadece bir 0-5 sayacı tutarsanız ve buna göre bir zar atarsanız, 666 gorilyon kez, aynı şekilde eşit bir dağılım elde edersiniz.
jcora

Yanıtlar:


1384

Biraz bilgisayar pokeri oynayalım, sadece sen, ben ve ikimize de güvendiğimiz bir sunucu. Sunucu, biz çalmadan hemen önce bir 32-bit tohum ile başlatılan bir sahte rasgele sayı üreteci kullanır. Yani yaklaşık dört milyar olası desteleri var.

Elimde beş kart alıyorum - görünüşe göre Texas Hold'em oynamıyoruz. Kartların birer birer, birer birer birer birer birer birer birer dağıtıldığını varsayalım. Bu yüzden destedeki ilk, üçüncü, beşinci, yedinci ve dokuzuncu kartlara sahibim.

Daha önce sözde rasgele sayı üretecini, her tohumda bir kez dört milyar kez çalıştırdım ve her biri için üretilen ilk kartı bir veritabanına yazdım. Diyelim ki ilk kartım maça kraliçesi. Bu sadece bu olası desteğin her 52'sinden birinde ilk kart olarak bir kart gösterdiği için, olası desteği dört milyardan yaklaşık 80 milyona düşürdük.

Diyelim ki ikinci kartım kalplerin üçü. Şimdi ilk maça maça kraliçesi üreten 80 milyon tohum kullanarak RNG'mi 80 milyon kez daha çalıştırıyorum. Bu bana birkaç saniye sürer. Elimdeki ikinci kart olan üçüncü kalbi üç olan kalpleri üreten tüm desteleri yazıyorum. Bu yine güvertelerin sadece% 2'si, yani şimdi 2 milyon desteğe düştük.

Diyelim ki elimdeki üçüncü kart, kulüplerin 7'si. İki kartımı dağıtan 2 milyon tohumluk bir veri tabanım var; RNG'mi 2 milyon kez daha çalıştırdım ve bu kulüplerin 7'sini üçüncü kart olarak üreten bu destelerin% 2'sini buldum ve sadece 40 bin desteğe düştük.

Bunun nasıl gittiğini görüyorsunuz. RNG 40000'ü dördüncü kartımı üreten tüm tohumları bulmak için daha fazla kez çalıştırdım, ve bu bizi 800 destelere indirdi ve ardından beşinci kartımı üreten ~ 20 tohum almak için 800 kez daha çalıştırdım ve şimdi de sadece bu yirmi kart destesini üretin ve elimde yirmi elden birine sahip olduğunuzu biliyorum. Dahası, bir sonraki çizeceğim şey hakkında çok iyi bir fikrim var.

Şimdi gerçek rastgeleliğin neden önemli olduğunu anlıyor musunuz? Tanımladığınız şekilde, dağıtımın önemli olduğunu düşünüyorsunuz , ancak dağıtım bir süreci rastgele kılan şey değildir. Tahmin edilemezlik , bir süreci rastgele yapan şeydir.

GÜNCELLEME

(Yapıcı olmayan doğası nedeniyle silinmiş) yorumlarına dayanarak, bunu okuyanların en az% 0.3'ü benim açımdan kafam karışmış durumda. İnsanlar noktalarında yaptığım, ya da daha kötüsü değil karşı çıkıyorlar zaman iddia için ben noktaları etmedi ben onları yapmadığını varsayımına yapmak, o zaman ben daha net ve özenle açıklamak gerektiğini biliyoruz.

Kelimesi etrafında belirli karışıklık var gibi görünüyor dağıtım dikkatle kullanımlarını aramak istiyorum böylece.

Eldeki sorular:

  • Sahte rasgele sayılar ve gerçekten rastgele sayılar nasıl farklıdır?
  • Fark neden önemlidir?
  • Farklılıkların PRNG'nin çıktısının dağılımı ile bir ilgisi var mı?

Poker oynamak için rastgele bir iskambil destesi oluşturmanın mükemmel yolunu düşünerek başlayalım . Ardından, güverte oluşturma için diğer tekniklerin nasıl farklı olduğunu ve bu farklılıktan yararlanmanın mümkün olup olmadığını göreceğiz.

Etiketli bir sihirli kutumuz olduğunu varsayarak başlayalım TRNG. Girdileri olarak, ona bir değerden büyük veya eşit bir n tamsayısı veririz ve çıktısı olarak bize bir ile n arasında kapsayıcı bir rastgele sayı verir. Kutunun çıktısı tamamen tahmin edilemez (biri dışında bir sayı verildiğinde) ve biri ile n arasındaki herhangi bir sayı diğerininki kadar muhtemeldir; yani dağılımın tek tip olduğu söylenebilir . (Yapabileceğimiz daha gelişmiş istatistiksel rastgele kontroller var; benim tartışmamla uyuşmadığı için bu noktayı görmezden geliyorum. TRNG, varsayımla istatistiksel olarak tamamen rasgele.)

Karışık bir kağıt destesi ile başlıyoruz. Kutuya bir ile 52 arasında bir sayı istiyoruz - yani TRNG(52),. Ne kadar geri verirse verilsin, kart destemizdeki o kadar kartı sayar ve o kartı çıkarırız. Karışık destedeki ilk kart olur. Sonra TRNG(51)ikinci kartı seçmek için aynısını isteriz ve yaparız.

Bakmanın başka bir yolu: 52! = 52 x 51 x 50 ... x 2 x 1 kabaca 2 226 olan olası desteler . Bunlardan birini gerçekten rastgele seçtik.

Şimdi kartları biz dağıtıyoruz. Kartlarıma baktığımda hangi kartlara sahip olduğunuzu bilmiyorum . (Sahip olduğum kartlardan hiçbirine sahip olmadığınız açıkça görülüyorsa.) Eşit olasılıkla herhangi bir kart olabilir.

Öyleyse bunu açıkça anladığımdan emin olalım. Biz tekdüze dağılım her bir çıktının TRNG(n); her biri olasılık 1 / n olan 1 ile n arasında bir sayı seçer. Ayrıca, bu sürecin sonucu 52 kişiden birini seçmemizdir! 1/52 bir olasılık !, yüzden dağılımı ile mümkün deste mümkün deste kümesi üzerinden olduğu da üniforma.

Tamam.

Şimdi diyelim ki etiketli daha az sihirli bir kutumuz var PRNG. Kullanmadan önce, gereken seribaşı 32 bit işaretsiz sayı ile.

ASİTE: Neden 32 ? 64- veya 256- veya 10000-bit bir sayı ile tohumlanamaz mıydı? Elbette. Fakat (1) pratikte çoğu kullanıma hazır PRNG'ler 32 bitlik bir sayıya ekilir ve (2) tohum yapmak için 10000 bit rastgele rastlantısallık varsa o zaman neden PRNG kullanıyorsunuz? Zaten 10000 bit rastgele kaynağınız var!

Neyse, PRNG'nin nasıl çalıştığına geri dönün: ekildikten sonra, aynı şekilde kullanabilirsiniz TRNG. Yani, n'yi bir sayıdan geçirirsiniz ve n size 1 ile n arasında bir sayı verir. Dahası, bu çıkışın dağılımı az ya da çok aynıdır . Yani, PRNG1 ile 6 arasında bir sayı istediğimizde, tohum ne olursa olsun, her biri kabaca altıda birinin 1, 2, 3, 4, 5 veya 6'sını alırız.

Bu noktayı birkaç kez vurgulamak istiyorum çünkü bazı yorumcuların kafasını karıştıran gibi görünüyor. PRNG'nin dağılımı, en az iki şekilde üniformdur. İlk önce, herhangi bir belirli tohumu seçtiğimizi varsayalım. PRNG(6), PRNG(6), PRNG(6)...Bir milyon kez dizinin 1 ile 6 arasında eşit bir sayı dağılımı üretmesini beklerdik. İkincisi, bir milyon farklı tohum seçip her tohum için bir PRNG(6) kez çağrılırsak , yine 1'den 1'e eşit bir sayı dağılımı bekleriz. 6. PRNG'nin bu işlemlerin herhangi biri arasındaki tek tipliği, tarif ettiğim saldırı ile ilgili değil .

Bu işlemin sözde rastgele olduğu söyleniyor, çünkü kutunun davranışı gerçekte tamamen belirleyici; tohum temelli 32 davranıştan birini seçer . Yani, bir kez tohumlandıktan sonra, eşit dağılımlı bir sayılar dizisiPRNG(6), PRNG(6), PRNG(6), ... üretir , ancak bu dizi tamamen tohum tarafından belirlenir. Belirli bir çağrı dizisi için, örneğin, PRNG (52), PRNG (51) ... ve benzerleri için sadece 2 32 olası dizi vardır. Tohum esas olarak hangisini alacağımızı seçer.

Bir güverte oluşturmak için sunucu şimdi bir tohum üretir. (Biz geri o noktaya geliriz nasıl?.) Sonra diyoruz PRNG(52), PRNG(51)daha önce benzer güverte oluşturmak için böyle devam eder.

Bu sistem tarif ettiğim saldırıya açık. Sunucuya saldırmak için önce, vaktimizden önce, kutunun kendi kopyasını 0 ile tohumlayın ve isteyin PRNG(52)ve yazın. Sonra 1 ile yeniden tohumlayacağız, PRNG(52)2 32 -1'e kadar isteyip yazacağız .

Şimdi, PRNG'yi güverte oluşturmak için kullanan poker sunucusu bir şekilde tohum üretmek zorunda. Nasıl yaptıkları önemli değil. TRNG(2^32)Gerçekten rastgele bir tohum almaya çağırabilirler . Veya şimdiki zamanı, neredeyse hiç rastlanmayan bir tohum olarak alabilir; Senin saatin ne kadar olduğunu biliyorum. Saldırımın amacı önemli değil çünkü veritabanım var . İlk kartımı gördüğümde olası tohumların% 98'ini elimden alabilirim. İkinci kartımı gördüğümde,% 98 daha fazla elemeyi kaldırabilirim, ve sonunda, sonunda elimde ne kadar tohum bulunduğuna kadar inebilirim ve elinizde olanı yüksek bir olasılıkla bilirim.

Şimdi, yine, burada varsayım olduğunu vurgulamak istiyoruz biz denilen eğer PRNG(6)bir milyon kere biz zaman kabaca altıda biri, her numara alacağı . Bu dağılım (az ya da çok) tekdüze ve bu dağılımın tek biçimliliği tek umursadığınızsa sorun değil. Sorunun amacı , dağıtımının PRNG(6)umursadığımız başka şeyler var mıydı? ve cevap evet . Tahmin edilemezliği de önemsiyoruz .

Soruna bakmanın başka bir yolu da, bir milyon çağrı dağılımının PRNG(6)iyi olabileceği halde , PRNG'nin sadece 2 32 olası davranış arasından seçim yapması nedeniyle, her olası güverteyi oluşturamayacağıdır. 2 226 olası desenin sadece 2 32'sini oluşturabilir ; küçük bir kesir. Bu yüzden bütün güvertelerdeki dağılım çok kötü. Fakat yine de, buradaki temel saldırı , geçmiş ve gelecekteki davranışını çıktılarının küçük bir örneğinden başarıyla tahmin edebilmemize dayanıyor . PRNG

Bunun battığından emin olmak için üçüncü ya da dört kez söyleyeyim. Burada üç dağıtım var. İlk olarak, rastgele 32-bit tohum üreten sürecin dağılımı. Bu tamamen rasgele, öngörülemeyen ve tek tip olabilir ve saldırı hala işe yarayacaktır . İkincisi, bir milyonun dağıtımı için çağrı yapar PRNG(6). Bu tamamen tek tip olabilir ve saldırı hala işe yarayacak. Üçüncüsü, sözde rastgele işlem tarafından seçilen destelerin dağılımını tanımladım. Bu dağılım son derece zayıf; IRL'nin olası destelerinin sadece küçük bir kısmı seçilebilir. Saldırı , PRNG'nin davranışının öngörülebilirliğine dayanarak çıktısının kısmi bilgisine dayanır .

ASIDE: Bu saldırı, saldırganın PRNG tarafından kullanılan algoritmanın ne olduğunu tam olarak bilmesini veya tahmin etmesini gerektirir. Bunun gerçekçi olup olmadığı açık bir sorudur. Bununla birlikte, bir güvenlik sistemi tasarlarken, saldırgan programdaki tüm algoritmaları bilse bile, saldırılara karşı güvenli olacak şekilde tasarlamanız gerekir . Başka bir deyişle: Güvenlik sisteminin güvenli olması için gizli kalması gereken kısmına "anahtar" denir. Sisteminiz sır olarak kullandığınız algoritmaların güvenliğine bağlıysa , anahtarınız bu algoritmaları içerir . Bu olması çok zayıf bir pozisyon!

Hareketli.

Şimdi, etiketli üçüncü bir sihirli kutumuz olduğunu varsayalım CPRNG. Bu bir kripto gücü versiyonudur PRNG. 32 bitlik bir tohum yerine 256 bitlik bir tohum alır. PRNGTohumun olası 256 davranıştan birini seçmesi özelliği ile paylaşır . Diğer makinelerimiz gibi, CPRNG(n)1 ile n arasında eşit bir sonuç dağılımı sağlamak için çok sayıda çağrı yapma özelliği vardır : her biri 1 / n olur. Saldırıya karşı koyabilir miyiz?

Asıl saldırımız , tohumdan tohumlamaya 2 32 harita saklamamızı gerektiriyor PRNG(52). Ancak 2 256 çok daha büyük bir sayıdır; Bunu CPRNG(52)defalarca çalıştırmak ve sonuçları saklamak tamamen mümkün değildir .

Fakat bunun tohumdan bir değer almanın başka bir yolu olduğunu varsayalım. CPRNG(52)Şimdiye kadar epeyce aptaldık, olası tüm kombinasyonları zorla zorluyoruz. Sihirli kutunun içine bakabilir, nasıl çalıştığını bulabilir ve çıktıya dayalı tohum hakkındaki gerçekleri çıkarabilir miyiz?

Hayır ayrıntıları açıklamak çok karmaşık, ama anlamak için olanaksız olacak şekilde CPRNGs akıllıca tasarlanmış herhangi ilk çıkışından tohum hakkında yararlı gerçeği CPRNG(52)ya gelen herhangi çıktı, alt grubunda ne kadar büyük olursa olsun .

Tamam, şimdi sunucunun CPRNGgüverte oluşturmak için kullandığını varsayalım . 256 bitlik bir tohumya ihtiyacı var. Bu tohumu nasıl seçer? Saldırganın tahmin edebileceği herhangi bir değeri seçerse, o zaman aniden saldırı tekrar uygulanabilir hale gelir . Olası 256 tohumdan birini seçebilirsek , bunların sadece dört milyarının sunucu tarafından seçilmesi muhtemeldir, o zaman işe geri döndük . Bu saldırıyı tekrar kurabiliriz, ancak üretilebilecek az sayıda tohuma dikkat ederek.

Bu nedenle sunucu, 256 bit sayının eşit dağılmasını sağlamak için çalışmalıdır - yani, her bir tohumun mükellefi, 1/2 256 olasılıkla seçilir . Temel olarak sunucunun TRNG(2^256)-1tohum üretmek için çağırması gerekir CPRNG.

Hangi tohumun seçildiğini görmek için sunucuyu hackleyebilir ve içine bakabilirsem ne olur? Bu durumda, saldırgan CPRNG'nin geçmişini ve geleceğini bilir . Sunucunun yazarı bu saldırıya karşı korunmalı! (Tabii ki bu saldırıyı başarılı bir şekilde yapabilirsem, muhtemelen parayı doğrudan banka hesabıma da aktarabilirim, bu yüzden belki de o kadar ilginç değil. Nokta: tohumun tahmin edilmesi zor bir sır olmalı ve Gerçekten rastgele 256-bit sayı tahmin etmek oldukça lanetlemek zor.)

Derinlemesine savunma konusunda daha önceki noktama dönersek: 256-bitlik tohum bu güvenlik sisteminin anahtarıdır . Bir CPRNG fikri , anahtarın güvenli olduğu sürece sistemin güvenli olduğudur ; Algoritma ile ilgili diğer bütün gerçekler biliniyor olsa bile, anahtarı saklayabildiğiniz sürece, rakibin kartları önceden tahmin edilemez.

Tamam, yani tohum hem gizli hem de düzgün dağılmış olmalıdır, eğer değilse, bir saldırı düzenleyebiliriz. Çıktılarının dağılımının CPRNG(n)tekdüze olduğunu varsayıyoruz. Mümkün olan tüm güverteler kümesi üzerindeki dağılım ne olacak?

Söyleyebilirsiniz: CPRNG tarafından üretilen 2 256 olası dizi var, ancak yalnızca 2 226 olası desteleri var. Bu nedenle, güvertelerden daha olası diziler var, bu yüzden biz iyiyiz; Bu sistemde mümkün olan her IRL deck şimdi (yüksek olasılıkla) mümkün. Ve bunun dışında iyi bir argüman ...

2 226 sadece bir yaklaşım 52 !. Böl. 2 256/52 ! Muhtemelen bir tam sayı olamaz çünkü bir şey için, 52! 3 ile bölünebilir, ancak ikisinin gücü yoktur! Bu şimdi tam bir sayı olmadığından tüm güvertelerin mümkün olduğu duruma sahibiz , ancak bazı güverteler diğerlerinden daha olasıdır .

Bu açık değilse, durumu daha küçük sayılarla düşünün. Üç A, B ve C kartımız olduğunu varsayalım. 8 bitlik bir tohumla bir PRNG kullandığımızı varsayalım, bu nedenle 256 olası tohum var. PRNG(3)Tohuma bağlı olarak 256 olası çıktı vardır ; Üçte birinin A, üçte birinin B ve üçte birinin C olması için hiçbir yol yok, çünkü 256, 3 ile bölünemez. Bunlardan birine karşı küçük bir önyargı olmalı.

Benzer şekilde, 52 eşit olarak 2 256'ya bölünmez , bu nedenle seçilen ilk kart olarak bazı kartlara karşı bazı önyargılar ve diğerlerinden uzak olan bir taraf olmalıdır.

32 bit tohumlu orijinal sistemimizde muazzam bir önyargı vardı ve olası güvertelerin büyük çoğunluğu asla üretilmedi. Bu sistemde tüm güverteler üretilebilir, ancak güverte dağılımı hala kusurludur . Bazı güverteler diğerlerine göre çok daha büyük olasılıkla.

Şimdi soru şu: bu kusura dayanan bir saldırı mı var? ve cevap pratikte, muhtemelen değil . Böylece CPRNGs tasarlanmıştır tohum gerçekten rasgele ise o zaman o hesaplama açısından olanaksız olduğunu ayırt etmek CPRNGve TRNG.

Tamam, hadi özetleyelim.

Sahte rasgele sayılar ve gerçekten rastgele sayılar nasıl farklıdır?

Gösterdikleri öngörülebilirlik düzeyinde farklılık gösterirler.

  • Gerçekten rastgele sayılar tahmin edilemez.
  • Tohum belirlenebilir veya tahmin edilebilirse, tüm sahte rasgele sayılar tahmin edilebilir.

Fark neden önemlidir?

Çünkü sistemin güvenliğinin tahmin edilemezliğe dayandığı uygulamalar var .

  • Her bir kartı seçmek için bir TRNG kullanılırsa, sistem erişilemez olur.
  • Her bir kartı seçmek için bir CPRNG kullanılırsa, tohum hem öngörülemeyen hem de bilinmiyorsa sistem güvenlidir.
  • Küçük bir tohum alanına sahip sıradan bir PRNG kullanılırsa, o zaman tohumun tahmin edilememesine veya bilinmemesine bakılmaksızın sistem güvenli değildir; yeterince küçük bir tohum alanı tarif ettiğim türdeki kaba kuvvet saldırılarına karşı hassastır.

Farklılığın PRNG çıktısının dağıtımı ile bir ilgisi var mı?

Bireysel aramalar için dağılımın ya da eksikliğin tek biçimliliği RNG(n)tarif ettiğim saldırılarla ilgili değil.

Gördüğümüz gibi, hem PRNGve CPRNGtüm olası deste herhangi bir bireysel güverte seçme olasılığı zayıf dağılımlarını üretirler. PRNGÖnemli ölçüde daha kötü olmakla birlikte, her iki sorunları var.

Bir soru daha:

TRNG, PRNG'den çok daha iyi olan CPRNG'den çok daha iyiyse, neden kimse CPRNG veya PRNG kullanıyor?

İki sebep.

İlk: gider. TRNG pahalıdır . Gerçekten rastgele sayılar üretmek zordur. CPRNG'ler , tohum için sadece bir çağrı TRNG'ye yapılan bir çağrı ile keyfi olarak birçok çağrı için iyi sonuçlar verir . Aşağı tarafı elbette bu tohumu sır olarak saklaman gerekiyor .

İkincisi: bazen tahmin edilebilirlik istiyoruz ve tek umursadığımız iyi dağıtım. Bir test paketi için program girişi olarak "rasgele" veri oluşturuyorsanız ve bir hata gösteriyorsa, test paketini çalıştırmanın yine hatayı tekrar üretmesi iyi olur!

Umarım bu şimdi çok daha açıktır.

Son olarak, eğer bundan zevk aldıysanız, rastgelelik ve permütasyonlar konusunda biraz daha okumaya devam edebilirsiniz:


20
Tamam, erkekler ve kızlar. Şimdilik bu kadar yorum yeter. Bunu daha fazla tartışmak istiyorsanız, kendinize bir sohbet odası alın, kthnxbye!
Ivo Flipse,

1
@Eric Fakat tohum her yeni güvertede çekilmeden önce sıfırlanmaz, değil mi? Dolayısıyla , örneklemekte olduğumuz nispeten az sayıda yörünge olduğu doğru olsa da , şu anda yörüngede tam olarak nerede olduğunuzu ve yörüngelerin kesiştiklerini tam olarak bilmiyorsunuz.
AS


İlgili sorunların iyi (ama yoğun) bir tedavisi Knuth'un TAOCP cilt 2, bölüm 3.5 “Rastgele Sıra Nedir?” (S. 149) 'da, eşit dağılımlı, k dağılımlı ve ∞ dağılımlı sekansların aydınlatıcı tanımları ile başlar. Psödorandom dizileri 3.5.F'de tartışılmıştır (s. 170). Ayrıca bkz. Karmaşıklık teorisi ve Alman BSI'sinden sözde eşitlik kriterleri .
ShreevatsaR

160

Eric Lippert'in dediği gibi, sadece dağıtım değil. Rasgeleliği ölçmenin başka yolları da var.

İlk rastgele sayı üreticilerinden biri, en az anlamlı bitte bir diziye sahiptir - 0 ve 1'leri değiştirdi. Bu nedenle, LSB% 100 öngörülebilirdi. Ama bundan daha fazla endişelenmen gerekiyor. Her bit öngörülemez olmalıdır.

İşte problem hakkında düşünmek için iyi bir yol. Diyelim ki 64 bit rasgele üretiyorsunuz. Her sonuç için, ilk 32 bit'i (A) ve son 32 bitini (B) alın ve bir dizine x [A, B] dizini yapın. Şimdi testi milyon kez yapın ve her sonuç için diziyi bu sayıya yükseltin, yani X [A, B] ++;

Şimdi, sayı büyüdükçe pikselin o konumdaki parlaklığı olan bir 2D diyagramı çizin.

Gerçekten rastgele ise, renk tek tip bir gri olmalıdır. Ama kalıpları alabilirsin. Örneğin, Windows NT sisteminin TCP sıra numarasındaki bu "rastgelelik" şemasını alın:

Windows NT

hatta bu bile Windows 98'den:

Windows 98

Ve işte Cisco yönlendirici (IOS) uygulamasının rastgeleliği. Cisco ISO

Bu diyagramlar Michał Zalewski'nin makalesinin izniyle kullanılmıştır . Bu özel durumda, eğer bir TCP sıra numarasının bir sistemde ne olacağını tahmin edebiliyorsa, başka bir sistemle bağlantı kurarken bağlantı kurmaya, iletişimin kesilmesine vb. Bir sonraki sayının% 100'ünü tahmin edemiyoruz , kontrolümüz altında yeni bir bağlantı kurulmasına neden olabilirsek, başarı şansını artırabiliriz. Bilgisayarlar birkaç saniye içinde 100.000 bağlantı kurabiliyorsa, başarılı bir saldırının olasılığı astronomikten mümkün olana veya hatta muhtemeldir.


30
Bu o kadar parlak ki gözlerime göz yaşı getiriyor. Her işletim sistemi (mobil / masaüstü / sunucu) ve platform (JVM / Javascript / etc) için bunları oluşturan bir uygulama olmalıdır.
HDave

5
Windows rand () işlevi oldukça iyi! Belirgin bir paterni olmayan bir bulut üretir. Denemek (ve diğer algoritmaları) denemek için uygulamama bakın: github.com/Zalastax/visualize_random
Zalastax

93

Bilgisayarlar tarafından üretilen sahte numaralar, bilgisayar kullanıcılarının karşılaştığı kullanım durumlarının çoğu için kabul edilebilir olsa da, tamamen tahmin edilemeyen rasgele sayılar gerektiren senaryolar vardır .

Şifreleme gibi güvenliğe duyarlı uygulamalarda, sahte bir sayı üreteci (PRNG), görünüşte rastgele görünmesine rağmen, aslında bir saldırgan tarafından öngörülebilen değerler üretebilir. Bir şifreleme sistemi kırmaya çalışan biri, bir PRNG kullanılmışsa ve saldırganın PRNG'nin durumu hakkında bilgisi varsa, şifreleme anahtarlarını tahmin edebilir. Bu nedenle, bu tür uygulamalar için, gerçekten yönetilemez değerler üreten rastgele bir sayı üreteci gereklidir. Not Bazı PRNGs kriptografik güvenli olacak şekilde tasarlanmıştır ve bu tür güvenlik duyarlı uygulamalar için kullanılabilir.

RNG saldırıları hakkında daha fazla bilgiyi bu Wikipedia makalesinde bulabilirsiniz .


9
Kriptografik PRNG'ler mevcuttur ve yaygın olarak kullanılmaktadır. Mütevazı boyuttaki bir tohumdan pratik olarak sınırsız sayıda rastgele sayı akışı üretebilirler. Bu tür bir akımı gerçek rastgele sayılardan ayırt etmek hesaplamalı olarak mümkün değildir, bu nedenle böyle bir akımın herhangi bir bölümünden ek bilgi elde edilemez ve herhangi bir pratik amaç için sayılar gerçek rastgele sayılar kadar iyidir.
aaaaaaaaaaaa

Bunu açıklamanın en kolay yolunun rasgele sayı üreteci algoritmalarının programlanması gerektiği olduğunu düşünüyorum. Bu, takip edilen talimatların olduğu anlamına gelir. Bir dizi talimat varsa, rastgele olamaz.
Keltari

6
@Keltari Sen ... En RNG'ler (en azından kriptografik olanları) dışındaki kaynaklardan girişi (örneğin fare hareketi) toplamak ve başlangıç koşulu bir parçası olarak kullanan entropi elemanı kaçırıyoruz - böylece gelen dönüşüm Aiçin Bprogramlanmıştır ama başlangıç ​​durumu A(olmalı) değiştirilemez olmalıdır. Linux'lar /dev/randomne kadar entropinin uygun olduğu hakkında bir tahminde bulunacak ve çok düşerse sayıları vermeyi bırakacaktır.
Temel

Meraktan - lav lambaları neden "gerçekten rastgele" olarak kabul edilir? Tahmin edilemeyecek bir davranış sergilediğini anlıyorum, ancak akışkan dinamiklerini ve bu akışkanların Dünya'nın yerçekimi ortamında nasıl etkileşime girdiğini yeterince kavrayacak biri kesinlikle "tahmin edilebilir" sonuçlar üretebilir, değil mi? Tabii ki, lav lambaları tahmin edilemez, ama benim için, onlar rastgele değil, ama son derece öngörülebilir.
GreenCabbage 14

1
@GreenCabbage: Lav lambalarının karmakarışık olduğundan şüpheleniyorum. Yeterince iyi bir bilgisayar modeli ve yeterli doğruluk rakamları göz önüne alındığında, bir süre için (ilke olarak) davranışı öngörebilirsiniz. Ancak, sistem kaotik olduğu için, başlangıç ​​koşullarında en küçük değişikliklere sahip iki lav lambası davranışta hızla ayrışacaktır. (Ve bu yorum, kaotik çekicileri görmezden geliyor.)
dmm

76

Python'da denedim: İşte 60 milyon rulonun sonucu. En yüksek varyasyon 0.15 gibidir. Bu alacağı kadar rastgele değil mi?

Aslında, o kadar "iyi" ki bu kötü ... Mevcut tüm cevaplar, küçük bir ilk değerler dizisi verilen öngörülebilirliğe odaklanıyor . Başka bir konu daha gündeme getirmek istiyorum:

    senin dağılımı rasgele rulo çok daha küçük standart sapması vardır gerektiği

Gerçek rasgelelik sadece oldukça gelmiyor o kalite göstergesi olarak kullanmakta olduğunuz "neredeyse tam 1 o seçebilirsiniz nasıl hiç tane sayı üzerinde" ortalama yakınındadır.

Birden fazla zar rulosunun olasılık dağılımları hakkındaki Stack Exchange sorusuna bakarsanız, N zar rulosunun standart sapması için bir formül göreceksiniz (gerçekten rastgele sonuçlar varsayarak):

 sqrt(N * 35.0 / 12.0).

Bu formülü kullanarak, standart sapma için:

  • 1 milyon rulo 1708
  • 60 milyon rulo 13229

Sonuçlarına bakarsak:

  • 1.000.000 rulo: stddev (1.000.066, 999.666, 1.001.523, 999.452, 999.294, 999999) olan 804
  • 60 milyon rulo: stddev (9.997.653, 9.997.789, 9.996.853, 10.006.533, 10.002.774, 9.998.398) olup 3827

Sonlu bir numunenin standart sapmasının formülle tam olarak eşleşmesini bekleyemezsiniz, ancak oldukça yaklaşmalıdır. Yine de, 1 milyon ruloda, uygun stddev'in yarısından azsınız ve 60 milyona kadar üçüncü bir ayın altındasınız - daha kötüye gidiyor ve bu tesadüf değil ....

Sahte-RNG'ler, tohumdan başlayarak ve belirli bir süre için orijinal sayıyı tekrar ziyaret etmeyerek farklı sayılar dizisi boyunca hareket etme eğilimindedir. Örneğin, eski C kütüphanesi rand()işlevinin uygulamaları genellikle 2 ^ 32 dönemine sahiptir ve tohum tekrarlanmadan önce bir kez 0 ile 2 ^ 32-1 arasındaki her sayıyı ziyaret ederler. Öyleyse, eğer 2 ^ 32 zar simülasyonu yaparsanız ön modülü yuvarlar (%) sonuçlar 0 - 2 ^ 32 arasındaki her sayıyı içerir, her 1-6 sonuç için sayılar 715827883 veya 715827882 (2 ^ 32, 6'nın bir katı değildir) ve bu nedenle standart sapma sadece önemsiz olarak 0'ın üzerindedir. Yukarıdaki formül, 2 ^ 32 rulonun doğru standart sapması 111924'tür. Yine de, sözde rasgele rulonuzun sayısı artar, sizi 0 standart sapmaya yaklaştırır. Rulo sayısı, dönemin önemli bir kesimi olduğunda, sorunun önemli olması beklenebilir, ancak bazı sahte-RNG'ler diğerlerinden daha kötü problemler (veya daha az numune ile bile problemler) gösterebilir.

Dolayısıyla, kriptografik açıkları önemsemiyor olsanız bile, bazı uygulamalarda aşırı, yapay sonuçlara bile sahip olmayan dağıtımlara sahip olmakla ilgilenebilirsiniz. Bazı simülasyon türleri, bireysel olarak rastgele sonuçların büyük örnekleriyle doğal olarak oluşan düzensiz sonuçların sonuçlarını çözmeye çalışmaktadır , ancak bazı pRNG sonuçlarında yeterince temsil edilmemektedir. Büyük bir popülasyonun bir olaya nasıl tepki verdiğini benzetmeye çalışıyorsanız, bu sorun sonuçları çılgınca yanlış sonuçlara götürecek şekilde kökten değiştirebilir.


Somut bir örnek vermek gerekirse: Bir matematikçi bir poker makinesinin programcısına, 60 milyon adet benzetilmiş rulodan sonra - eğer matematikçi olmasını beklediği 10.013.229 veya daha fazla altının olması durumunda ekran etrafında yüzlerce küçük "ışığı" titretmek için kullanıldığını söyler. Ortalamadan 1 tddev uzakta, küçük bir ödeme olmalıdır. Başına 68-95-99.7 kural (Wikipedia) bu konuda gerçekleşmesi gereken % 16 zaman (standart sapma içinde ~ 68% azalma / sadece yarısı dışarıda üzerindedir). Rasgele sayı üreticinizle bu, ortalamanın yaklaşık 3,5 standart sapmasından kaynaklanmaktadır: % 0.025 şansın altında - neredeyse hiç müşteri bu avantajdan yararlanamıyor. Özellikle de belirtilmiş olan sayfadaki Yüksek Sapmalar tablosuna bakınız:

| Range    | In range   | Outside range | Approx. freq. for daily event  |
| µ ± 1σ   | 0.68268... | 1 in 3        | Twice a week                   |
| µ ± 3.5σ | 0.99953... | 1 in 2149     | Every six years                |

Burada elma ve portakalları karşılaştırıyorsunuz. İki standart sapmanın kesinlikle birbirleriyle ilgisi yok.
Jbeuh

50

Ben sadece bu rasgele sayı üretecini zar rulosu üretmek için yazdım.

def get_generator():
  next = 1
  def generator():
    next += 1
    if next > 6:
      next = 1
    return next
  return generator

Böyle kullanıyorsun

>> generator = get_generator()
>> generator()
1
>> generator()
2
>> generator()
3
>> generator()
4
>> generator()
5
>> generator()
6
>> generator()
1

vb. Bu jeneratörü bir zar oyunu yapan bir program için kullanmaktan memnun olur musunuz? Unutmayın, dağılımı tam olarak "gerçekten rastgele" bir jeneratörden bekleyeceğiniz şeydir!

Sözde rasgele sayı üreteçleri esasen aynı şeyi yapar - doğru dağılım ile öngörülebilir sayılar üretirler. Yukarıdaki basit rasgele sayı üretecinin kötü olması nedeniyle aynı nedenle kötüdürler - sadece doğru dağıtım için değil, gerçek tahmin edilemezliğe ihtiyaç duyduğunuz durumlar için uygun değildir.


2
"Sözde rasgele sayı üreteçleri ... doğru dağılımla öngörülebilir sayılar üretiyor" - Sadece bir PRNG'nin mükemmel bir dağıtım olduğunu garanti etmiyor (aslında, ticari olanların, tam olarak bu cevaplarda belirtilen sebepler). Yeterli bilgi verilen tahmin edilebilir olsalar da (kullanılan algo, başlangıç ​​tohum, çıkış değerleri, w / e), yine de varyansa sahipler.
Brian S

3
Noktasının yanında, biliyorum, ama get_generator = lambda: itertools.cycle(range(1,7)), generator = get_generator(), next(generator) # and so on:) saymıyorum sadece çok zarif
Janus Troelsen

2
@BrianS Aslında, zaman içinde dağıtım testlerini geçemeyen bir PRNG, tanım olarak tahmin edilebilir. Bu yüzden bazı büyük N'lerde, N / 2 kafalarından N madalyonundaki para basmalarında bile biraz yol alırsanız, kafalarda bahis yapmaya başlayabilir ve kaybettiğinizden daha fazla kazanabilirsiniz. Aynı şekilde, kafalar v. Kuyruklarının mükemmel bir dağılımını elde ettiyseniz, ancak kafalar her zaman çiftler halinde geldi, o zaman yine kazanmak için bir reçete olurdu. Dağıtım testleri, bir PRNG'nin ne kadar iyi olduğunu bildiğiniz gibidir.
Jon Kiparsky

1
nonlocal next:-) unuttun .
Kos,

5
Daha iyi bir örnek: Pi'nin normal olduğuna inanılıyor , yani herhangi bir tabandaki herhangi bir uzunluktaki herhangi bir rakam dizisinin, o tabandaki o uzunluktaki herhangi bir diziden daha sık görünmediği anlamına gelir. N rasgele bit için istendiğinde , bir sonraki n bit'i alan ve bunları döndüren bir algoritma ("tohum", başladığınız bit), uzun vadede mükemmel bir dağılım göstermelidir. Ancak yine de jeneratörünüz için istemezsiniz - ürettiğiniz son bit grubunu bilen biri, bu dizilimin ilk gerçekleştiği zamanı bulabilir, tohumunuzun orada olduğunu varsayabilir ve muhtemelen doğru olabilir.
yayın tarihi

26

Bilgisayarınızın gerçekleştirebileceği rasgele sayı üretimi çoğu ihtiyaç için uygundur ve gerçekten rasgele bir sayıya ihtiyaç duyacağınız bir zamana rastlama ihtimaliniz yoktur.

Gerçek rasgele sayı üretmenin de amaçları var. Bilgisayar güvenliğinde, kumar, büyük istatistiksel örnekleme vb.

Rastgele sayıların uygulamaları ile ilgileniyorsanız Wikipedia makalesine göz atın .


12
En büyük sorun, bir saldırganın güvenlik nedeniyle tahmin edemediği rasgele sayılara ihtiyacınız olduğundadır.
David Schwartz,

16
Gerçekten rastgele bir sayıya ihtiyaç duyduğunuz bir zamanla karşılaşmanız muhtemeldir. https://
Şununla

3
@JanHudec: Günlük kullanımda, herhangi bir programı açtığınız anda, bir adres çubuğuna yazmadan önce güvenli bir rasgele sayıya ihtiyacınız olacaktır: adres alanı düzenini rastgele ayarlama bölümüne bakın . Bu yüzden böyle şeyler olur.
Reid

5
@JanHudec Özellikle, çevrimiçi bir rasgele sayı üreteci kullanmanız gerekebileceği konusunda konuşuyordum. Gerçek rastgele sayılar sıklıkla kullanılır, ancak çok az sayıda insanın kendilerini üretmesi gerekir.
Alex McKenzie

2
Slot makineleri ayrıca bir TRNG değil, PRNG kullanır. Jeneratör her zaman çalışır ve döndürme düğmesine basıldığı anda bir sayı alınır. PRNG ve gerçekten rastgele düğme basma süresi toplamı bir TRNG'ye eşittir.
Roger Dahl,

26

Çoğu programlama dilinde tipik fonksiyonlar tarafından üretilen rastgele sayılar tamamen rastgele sayılar değildir. Onlar sahte rasgele sayılardır. Tamamen rastgele sayılar olmadıkları için önceden üretilmiş sayılar hakkında yeterli bilgi ile tahmin edilebilirler. Yani bu kriptografide güvenlik için bir felaket olacak .

Örneğin, aşağıdaki rasgele sayı üreteci işlevi glibc, tamamen rasgele sayı üretmez. Bunun yarattığı sözde rasgele sayı tahmin edilebilir. Güvenlik sorunları için bir yıldırım. Bunun felakete dönüşmesinin bir tarihi var. Bu kriptografide kullanılmamalıdır.

glibc random():
    r[i] ← ( r[i-3] + r[i-31] )  % (2^32)
    output  r[i] >> 1

Bu tür sahte rasgele sayı üreteci, istatistiki açıdan çok önemli olsa da güvenliğe duyarlı yerlerde asla kullanılmamalıdır.

Sözde rastgele anahtarlara yapılan ünlü saldırılardan biri 802.11b WEP'e yapılan saldırıdır . WEP, 128 bit anahtar yapmak için 24 bit IV (sayaç) ile birleştirilmiş 104 bit uzunluğa sahip bir anahtara sahiptir; bu, sırayla sahte rastgele anahtar üretmek için RC4 algoritmasına uygulanır .

( RC4( IV + Key ) ) XOR (message)

Anahtarlar birbirleriyle yakından ilişkiliydi. Burada, sadece IV her adımda 1 arttı ve diğerleri aynı kaldı. Bu tamamen rastgele olmadığı için felaketti ve kolayca bozuldu. Anahtar, dakikalar meselesi olan yaklaşık 40000 kare analiz edilerek geri kazanılabilir. WEP tamamen rastgele 24-bit IV kullandıysa, yaklaşık 2 ^ 24 (yaklaşık 16,8 milyon) kareye kadar güvenli olabilir.

Bu nedenle, mümkün olduğunda güvenliğe duyarlı konularda saf rasgele sayı üreteci kullanılmalıdır.


3
Zayıf bir şifre kullanarak WEP işini kötü tasarlanmış bir protokolde suçlardım. Modern akış şifreleri ile bir sayaç olarak IV kullanabilirsiniz.
CodesInChaos

2
WEP ile ilgili temel sorun, anahtarı 2 ^ 24 (yaklaşık 16 milyon) karede tekrarlamaktı. 40000 karede kodun kırılmasını mümkün kılan ilgili tuşlarla daha da kötüydü. Buradaki ana nokta, anahtarın rastgele olmadığıdır. Yakından ilişkilidir, bu yüzden kırılması kolaydır.
Prabhu

1
Sözde rastgelelik sadece kriptografik anahtarlar oluştururken kriptografide kötüdür . Bunun ötesinde tamamen iyi. Aslında, RC4, mesajın düz metnine XORed anahtarının 128-bit genişlemesi ile tohumlanan sahte rastgele bir sayı üretecinden biraz daha fazladır.
Matt

12

Aradaki fark, sahte rastgele üretilen sayıların, gerçek rastgele sayıların olmadığı bir süre sonra tahmin edilebilir (tekrarlanan) olmasıdır. Tekrarlaması gereken uzunluk, üretimi için kullanılan tohumun uzunluğuna bağlıdır.

İşte bu konuda güzel bir video: http://www.youtube.com/watch?v=itaMNuWLzJo


Tahmin edilebilirlik! = Tekrarlama. Mersenne Twister buna güzel bir örnek. 624 Int32'den sonraki çoğu uygulamada tüm sonraki sayıları tahmin edebilirsiniz, ancak Mersenne Twister dizisi bundan daha uzundur (2 ^ 19937 - 1).
HoLyVieR

Bu cevabın neden yığının üstüne itilmediğini anlamıyorum, çünkü bu bana en azından kısmen sorunun doğru ve özlü cevabını gösteriyor. Sahte rasgele sayılar, bazı çizimlerden sonra kolaylıkla tahmin edilebilir. Sahte rasgele algoritma "kalite" ile değişen kuraların sayısı. "İyi" bir algoritma seçmek, şu özelliklere bakar: 1. Her değer eşit frekansta (dağılım) çizilir, 2. Baştaki diziyi yeniden başlatmak ve tekrar aynı sayıları çizmeye başlamak için "uzun zaman alır" Aynı sırada.
dak

"gerçek rasgele sayılar [tahmin edilebilir] değil". Bugün için bu doğru. Şimdi, eğer Büyük Patlama teorisine inanırsak ve BB'den sonra herhangi bir zamanda Evrenin durumunu hesaplamak için çok fazla gücümüz varsa, o zaman fiziğe dayanarak ... geleceği tahmin edebiliyoruz. Bu çok kesin yorum yazıyorum. Sağ?
Dakika

Bu varsayımsal olarak doğrudur, ancak, gerçek cisimlerin fiili eylemlerine dahil olan engin entropinin derecesi göz önüne alındığında, gerekli olan hesaplama gücü gülünç derecede büyük olacaktır. Bilgisayarlarla kaplı kıtaları düşünün. Ayrıca, çünkü önceki durumuna bağlı olarak, zaman içinde her noktada evrenin her gövdenin durumu, depolanacak gerekir ki tamamen bellek aygıtı doldurulur evrenin, mevcut olandan daha fazla alanı gerektirecektir tanımla
TheEnvironmentalist

@ ÇevreBilimci - Ah! "Bilgisayarlarla kaplı kıtalar" ... "Otostopçunun Galaksi Rehberi Rehberi" değil mi? ;-)
ysap

10

Sözde rasgele bir sayının, oluşturulmadan önce herkes tarafından tahmin edilebileceğini varsayalım.

Önemsiz uygulamalar için, örnek olarak olduğu gibi, sözde rastlantısallık iyidir, bazı küçük değişkenlerle (yaklaşık 600k'lik bir zar atıp atmayacağınızı göreceksiniz), yaklaşık olarak doğru yüzdeyi (toplam sonuç kümesinin yaklaşık 1 / 6'sı) alırsınız. zamanlar);

Ancak, bilgisayar güvenliği gibi şeyler söz konusu olduğunda; Gerçek rastgelelik gereklidir.

Örneğin, RSA algoritması bilgisayarda iki rasgele sayı (P ve Q) seçerek ve ardından genel ve özel anahtarlarınız olarak bilinen özel sayıları oluşturmak için bu numaralara birkaç adım uygulayarak başlar. (Özel bir anahtarın önemli kısmı özel olmasıdır ve başka kimse bilmiyor!)

Eğer bir saldırgan bilgisayarınızın seçeceği iki 'rastgele' sayının ne olduğunu biliyorsa, özel anahtarınızı hesaplamak için aynı adımları uygulayabilirler (Başka kimsenin bilmemesi gereken!)

Özel anahtarınızla bir saldırgan gibi şeyler yapabilir a) Sizin gibi davranarak bankanızla konuşun, b) 'Güvenli' internet trafiğinizi dinleyin ve şifresini çözebilme, c) Sizin ve internetteki diğer taraflar arasında maskelenme.

Gerçek rastgeleliğin (yani tahmin edilememesi / hesaplanamaması) gerekli olduğu yer burasıdır.


10

Şimdiye kadar kullandığım ilk rastgele sayı, ardışık iki rastgele sayının herhangi birinin mükemmel bir özelliğine sahipti, ikincisi ise 0.6 olasılıkla daha büyüktü. 0.5 değil. Üçüncüsü, ikinci olasılıktan 0.6, vb. Olanlardan daha büyüktü. Bunun bir simülasyonla nasıl yıkıldığını hayal edebilirsiniz.

Bazı insanlar rastgele sayıların eşit olarak dağılmasıyla bile bunun mümkün olacağına inanmazlardı; ancak sıralamaya bakarsanız açıkça (1, 3, 5, 2, 4, 1, 3, 5, 2, 4, ...) iki sayının ikincisinin olasılık 0.6 ile daha büyük olması.

Öte yandan, simülasyonlar için rastgele sayıları yeniden üretebilmek önemli olabilir. Bir trafik simülasyonu yaptığınızı ve gerçekleştirebileceğiniz bazı işlemlerin trafiği nasıl iyileştirebileceğini öğrenmek istediğinizi varsayalım. Bu durumda, trafiği iyileştirmeye çalıştığınız farklı eylemlerle aynı trafik verilerini (bir kasabaya girmeye çalışan insanlar gibi) yeniden oluşturabilmek istersiniz.


8

Kısa cevap, genellikle insanların kötü bir sebepten dolayı "gerçek rastgelelik" gerektirmesidir, yani kriptografi anlayışına sahip olmadıklarıdır.

Akış şifreleri ve CSPRNG'ler gibi şifreleme ilkelleri , birkaç öngörülemeyen bit beslendikten sonra tahmin edilemeyen bitlerin büyük akışlarını üretmek için kullanılır.

Dikkatli bir okuyucu şimdi burada bir önyükleme sorunu olduğunu anlayacaktır: hepsini başlatmak için birkaç parça entropi toplamalıyız. O zaman onları bir CSPRNG'ye aktarabilirsiniz, ki bu da ihtiyacımız olan tüm öngörülemeyen parçaları mutlu bir şekilde sağlar. Bu nedenle , bir CSPRNG tohumlamak için bir donanım RNG'si gereklidir . Entropinin gerçekte gerekli olduğu tek durum budur.

(Bunun Güvenlik veya Kriptografi'ye gönderilmesi gerektiğini düşünüyorum.)

Düzenleme: Sonunda, öngörülen görev için yeterince iyi olan rastgele bir sayı üreticisi seçilmelidir ve rastgele sayı üretimi söz konusu olduğunda, donanım mutlaka iyi bir şekilde eşitlenmez. Tıpkı kötü PRNG'ler gibi, donanım rastgele kaynaklarının da genellikle önyargıları vardır.

Düzenleme: Buradaki bazı kişiler, bir saldırganın CSPRNG'nin iç durumunu okuyabileceği ve oradan CSPRNG'lerin güvenli bir çözüm olmadığı sonucuna vardığı bir tehdit modeli olduğunu varsaymaktadır. Bu zayıf iplik modellemeye bir örnektir. Bir saldırgan sisteminize sahipse, oyun sona erer, sade ve basittir. Bu noktada bir TRNG veya CSPRNG kullanıp kullanmamanız herhangi bir fark yaratmaz.

Düzenleme: Yani, hepsini özetlemek için ... Bir CSPRNG tohumlamak için entropi gereklidir. Bu yapıldığında, bir CSPRNG, güvenlik uygulamaları için ihtiyaç duyduğumuz tüm öngörülemeyen bitleri entropi toplayabileceğimizden (genellikle) alabileceğimizden çok daha hızlı sağlayacaktır. Simülasyonda olduğu gibi tahmin edilemezlik gerekli değilse, bir Mersenne Twister çok daha yüksek bir oranda iyi istatistiksel özelliklere sahip sayılar sağlayacaktır.

Düzenleme: Güvenli rasgele sayı üretme sorununu anlamaya istekli herkes şunu okumalıdır: http://www.cigital.com/whitepapers/dl/The_Importance_of_Reliable_Randomness.pdf


2
Bu mutlaka bir güvenlik sorusu değil. Güvenliği içermeyen rastgele sayıları kullanmanın nedenleri olduğunu düşünüyorum. Eğer rastgele sayılara dayanan bazı bilimsel araştırmalar yapıyor olsaydım ve sayıların mümkün olduğu kadar rastgele olmasının kritik bir nedeni olsaydı, kesinlikle bir donanım RNG'sinden faydalanırdım; RNG'nin tuhaflıkları.
Kef Schecter

3
@KefSchecter Duydukları donanım PRNG'leri genellikle önyargılı ve / veya ilişkili çıktıya sahiptir. Üniform bir bağımsız çıktıya dönüştürmek için bir işlem sonrası adımına ihtiyaçları var. Bu işlem sonrası adımın modern bir akış şifresinden daha güvenilir olduğuna inanmak için hiçbir neden yoktur. Ben kesinlikle akış şifresini daha fazla güvenirim. Ekstra bir bonus olarak, bilimde değerli olan, yeniden üretilebilir.
CodesInChaos

Tamam, yeterince adil. Fakat aynı şey kriptografi uygulamaları için de aynı şekilde geçerli olmaz mı? Buradaki cevap bile, CSPRNG'yi tohumlamak için bir donanım RNG'sine ihtiyacınız olduğunu söylüyor.
Kef Schecter

2
@KefSchecter Evet, kripto uygulamalarının CSPRNG'yi tohumlamak için gerçek rasgele sayılara ihtiyacı vardır. Ancak her şey için bu CSPRNG'yi kullanabiliriz.
KodlarInChaos

@KefSchecter: Şifreleme uygulamaları, akışın dünya tarafından çoğaltılamaz olmasını gerektirir. Buna karşılık, bilimsel uygulamalarda, birinin kullandığı "rastgele" sayıların, bir kişinin analizini iyi bir ışık altında göstermek için seçilmediğini gösterebilmek faydalı olacaktır. Örneğin, birinin ertesi günkü devlet piyango numaralarını kullanarak belirli bir şekilde veri üreteceği yöntemlerini açıkladıktan sonra bir kişi duyurursa, okuyucular, bir kişinin hafta içi çiziminde sadece birkaç düzine olsa bile, birinin sonuçlarını kandırmayacağından emin olabilirler. entropinin parçaları.
supercat

7

Tüm PRNG'ler tüm kullanımlar için uygun değildir. Örneğin, Java.util.SecureRandom, 160 bitlik bir çıktı büyüklüğüne sahip SHA1 karma değerini kullanır. Bu , ondan gelebilecek 2 160 olası rasgele sayı akımı olduğu anlamına gelir . Bu kadar basit. Dahili durumun 2 160 değerinden daha fazlasını alamazsınız . Böylece , tohumunuz nereden gelirse alınsın, tek bir tohumdan 2 160'tan fazla benzersiz rastgele sayı akışı elde edemezsiniz . Windows CryptGenRandom'un 40 baytlık bir durum kullandığına inanılıyor , rastgele sayıların 2 320 olası akışına sahip.

Standart 52 kart destesini karıştırmanın yollarının sayısı 52! 'Dır, bu yaklaşık 2 226'dır . Bu nedenle, tohumlamadan bağımsız olarak, bir deste kart karıştırmak için Java.util.SecureRandom kullanamazsınız. Üretemediği yaklaşık 2 66 olası karıştırma var. Elbette, hangileri olduklarını bilmiyoruz.

Bu nedenle, 256 bitlik gerçek rastgelelik kaynağına sahip olsaydım (örneğin, bir Quantis RNG kartından), bu tohumla CryptGenRandom () gibi bir PRNG çekebilir ve daha sonra bir deste karıştırmak için PRNG kullanabilirim. kartları. Her karıştırışta gerçek rastgelelikle yeniden beslenirsem, bu iyi olacak: tahmin edilemez ve istatistiksel olarak rasgele. Aynı şeyi Java.util.SecureRandom ile yapsaydım, 256 bit entropi ile tohumlanamadığından muhtemelen üretilemeyen shuffles olurdu, ve iç durumu tüm olası shuffles'ı temsil edemezdi.

Java.util.SecureRandom sonuçlarının hem öngörülemez hem de istatistiksel olarak rasgele olacağını unutmayın. Hiçbir istatistiksel test hiçbir zaman bir sorunu tanımlayamaz! Ancak, RNG'nin çıktısı, bir iskambil destesini simüle etmek için ihtiyaç duyulan tüm çıktıların tüm alanını kapsayacak kadar büyük değil.

Ve unutmayın, şakacıyı eklerseniz, 54! 2 238 olasılık gerektiren, bunu kapsamalısınız .


2
Neden bazı karışıklıkların olamayacağına önem veriyorsun? Bu kısıtlamanın gözlemlenebilir bir etkisi yoktur.
CodesInChaos

2
Ben soruyu soracağım sorta. Çok iyi düzenlenmiş oyun şirketleri için böyle bir önyargı, matematiksel olarak, kart oyununu kazanma şansınızın, bilgisayar destesinde bir kağıt destesinden daha farklı olduğunu ispatlayacaktır. Şansların daha iyi ya da daha kötü olması önemli değil. Onlar FARKLI. Bilgisayar ahlaki olarak gerçek bir desteye eşdeğer değildir. Üstelik farkı karakterize edemiyoruz. Düzenleyici para cezalarıyla karşı karşıya kalan oyun şirketi çok dikkat edecektir.
Paco Umut

1
Ancak tespit edilebilir. Bilinen bir işlemi kullanarak tespit ediyorum: kaynak kod incelemesi ve problem alanı bilgisi. Olağanüstü olan bu. Otomatik istatistiksel analiz kullanamıyorum. Java.util.Random veya Mersenne Twister kullanan biri gibi algılanabilir. İstatistiksel analiz, RNG / problem alanı uyumsuzluğu için tek geçerli tespit mekanizması değildir. Dedektörü geçen hatalar, tanım gereği başarı değildir.
Paco Hope,

1
Bu ifadeye asla katılmamıştım. Söylediğim, istatistiksel analizin, RNG / PRNG'nin doğru olduğuna dair yanılmaz bir kanıt olmadığı. Bu yanlış bir negatif örneğidir. Yanlış olmalı, ancak istatistiksel çıktı testi onu geçecek. SHA1 (1), SHA1 (2), SHA1 (3) ... SHA1 (n) 'i "RNG" olarak kullanırsam, bu da istatistiksel testleri geçer. Aynı zamanda yanlış. Doğru tanım, "istatistiksel testleri geçer" tanımının ötesine uzanır. İstatistiksel testlerden geçmek zorunludur ancak yeterli değildir.
Paco Hope

4
@CodesInChaos: "Olası IRL-shuffle'ların büyük çoğunluğunun asla üretilmeyeceği gerçeğinden faydalanabilecek bir saldırı bilmeyiz" argümanı böyle bir saldırının imkansız olduğu anlamına gelmez, sadece Bunun ne olduğunu veya ona karşı nasıl savunacağını bilmiyorum. Bu durumda doğru tutum, durumu ortadan kaldırarak saldırı olasılığını ortadan kaldırmaktır: gerçekten mümkün olan her güverteyi oluşturabilecek kalitede bir RNG yapın.
Eric Lippert

6

Sahte sayılar matematiksel olmayan bir fonksiyon ve bir başlangıç ​​değeri ( tohum adı verilen ) kullanılarak üretilir . Tahmin edilebilirliği, onları oyun tekrarları için inanılmaz derecede faydalı kılar , çünkü sadece tohum ve oyuncu girişini kaydetmeniz gerekir - AI her seferinde aynı "rastgele" şekilde cevap verecektir.


6

"Gerçek" rasgele ve "sahte" rasgele sayı arasındaki fark, öngörülebilirliktir. Bu cevap zaten verildi.

Bununla birlikte, tahmin edilebilirliğin çoğu örneğin gösterdiği gibi mutlaka kötü bir şey olması gerekmez. Tahmin edilebilirliğin iyi olduğu nadir vakalardan birine pratik bir örnek: Global Konumlandırma Sistemi.

Her uydu , sinyal yayılma zamanının ölçülmesi için gerekli olan otomatik korelasyon veya çapraz korelasyon için uygun olan farklı bir PRN kodu ( Altın kodlar ) kullanır . Bu Altın kodları için, birbirleri arasındaki korelasyon özellikle zayıftır, uydunun kesin bir tanımlamasını mümkün kılar, ancak yayılan dizi ile alıcı arasındaki korelasyon ile mesafe hesaplamasına izin verir.


2

Rastgele hızlı kontrolü için, [0; 1) 'de rastgele koordinatlara sahip noktaları alırsınız, sonra bunları k-boyutlu küpün içine koyun. Daha sonra, bu küpü alt küplere dilimleme prosedürü yaparsınız - her bir alt küp hacmi (veya alt küre), bu teoriye göre dalgalanmalarla doğru olarak ölçülmelidir.

Karşılaştığınız yerde rastlantısallık kalitesi önemlidir ...

  1. güvenlik amaçlı. Anahtar nesliniz için parametre olarak kullanmak için sayı oluşturduğunuzda ve tahmin edilebilir bir durum varsa - düşman bunu% 100 olasılıkla bulur ve arama alanını çok daha küçük hale getirir.

  2. Bilimsel amaçlar Bilimde iyi durumda sadece ortalama ortama sahip olmamanız gerekir, aynı zamanda çeşitli rasgele sayılar arasındaki korelasyonları ortadan kaldırmanız gerekir. Öyleyse (a_i - a) (a_ {i + 1} -a) alıp dağıtımını bulursanız, istatistiklere uygun olması gerekir.

Çift korelasyonu “zayıf rastgelelik” olarak adlandırılır. Gerçek rastgelelik istiyorsanız, 2'den fazla varyansla yüksek dereceli korelasyona sahip olmalısınız.

Günümüzde sadece kuantum mekaniği jeneratörleri gerçek rastgeleliği sağlar.


1

Gerçek rastgelelik neden önemlidir?

Gerçek rastgeleliğin gerekli olmasının iki temel nedeni vardır:

  1. Eğer RNG'yi kriptografi için kullanıyorsanız (gerçek parayla oynanan kumar ve piyango gibi şeyler dahil), o zaman bir PRNG sizi matematiksel analizinden (ki bir TRNG varsayar) daha zayıf hale getirecektir. PRNG aslında rastgele olmayacak, ancak bir kalıba sahip - rakipler, kırılmaması gereken bir şifreyi kırmak için kalıbı kullanabilirler.
  2. RNG'yi "rastgele" girişleri simüle etmek için kullanıyorsanız, örneğin hata testi veya simülasyon için, bir PRNG yaklaşımınızı zayıflatır. Hata bulmadığınız zaman, her zaman bu dürtücü şüphe olacaktır: PRNG'nin modelinde farkedilmeyen bir hata var mı, sadece TRNG kullansaydım ortaya çıkar mıydı? Simülasyonumun bulgusu gerçeği doğru bir şekilde tarif ediyor mu, yoksa keşfettiğim fenomen PRNG'nin modelinin bir eseri mi?

Bu alanların dışında, gerçekten önemli değil. Dikkat: Eğer PRNG'niz çok ama çok kötüyse, yine de uygun olmayabilir - zarların her zaman bile ortaya çıktığı bir Craps oyunu yapmak istemezsiniz, oyuncularınız bundan hoşlanmaz.

Python PRNG'si yeterince iyi değil?

Bu kadar basit bir metodoloji kullanarak gerçek bir PRNG'nin tuzaklarını tespit edebilmeniz pek olası değildir. RNG'lerin istatistiksel analizi, kendi başına bir bilim alanıdır ve bir algoritmanın "rastgelelik" ini ölçmek için çok karmaşık testler mevcuttur. Bunlar basit girişiminizden çok daha ileri.

Python geliştiricileri gibi gerçek dünya kütüphaneleri oluşturan her yazılım geliştiricisi, PRNG uygulamalarının yeterince iyi olup olmadığını görmek için bu istatistiksel testleri kıstas olarak kullanır. Bu nedenle, gerçek geliştirici gözetim durumları dışında, gerçek dünyadaki bir PRNG'deki bir deseni kolayca tespit etmeniz mümkün değildir. Bu, hiçbir şablon olmadığı anlamına gelmez - bir PRNG'nin tanımına göre bir düzeni vardır.


0

Temel olarak, bir çıktının matematik analizi ile bir kaynağın rastgele olduğunu kanıtlayamazsınız, örneğin kaynağın rastgele olduğunu söyleyen fiziksel bir modele ihtiyacınız vardır (radyoaktif bozunumda olduğu gibi).

Çıktı verilerinde istatistiksel korelasyon bulmak için toplu testler yapabilirsiniz, bu durumda verilerin rastgele olmadığı kanıtlanmıştır (ancak aynı zamanda rastgele bir kaynağın rastgele olmayan çıktıları olabilir veya belirli bir özelliği veremiyorsa, gerçekten rastgele olmayacaktır) çıktı). Aksi takdirde testler geçerse, verilerin sahte rastgele olduğunu söyleyebilirsiniz.

Bazı rastgelelik testlerini geçmek, yalnızca güvenliğin söz konusu olmadığı uygulamalar için yararlı olabilecek iyi bir PRNG'ye (sözde rastgele sayı üreteci) sahip olduğunuz anlamına gelir.

Güvenlik söz konusuysa (şifreleme, anahtar tuz üretme, kumar için rasgele sayı oluşturma ...) iyi bir PRNG'ye sahip olmak yeterli değildir, önceki çıktılardan kolayca tahmin edilemeyen fonksiyon çıktısı gibi ek özelliklere sahip olması gerekir, işlevin istenen bir hesaplama maliyetine sahip olması gerekir (kullanılabilir olması için yeterince sınırlı, ancak kaba zorlama girişimlerini yenecek kadar yüksek), işlevi çalıştıran donanım - ya da cihazı, bugün tuhaf bir durumda, bu bir analog cihazdır - kolayca kurcalanabilmek, vb.

İyi bir PRNG'ye sahip olmak, oyunlarda yeni ve öngörülemeyen kalıplar oluşturmak için faydalı olabilir ve şifrelemede - tek bir gönderide açıklamak çok zahmetlidir, şifreleme prosedüründen çıkışta neyin görünmediğini göstermek için rastgele olmalı, sadece küçük bir rol olarak düşünün. önceki şifrelenmiş verileri aşağıdaki şifrelenmiş verilerle ilişkilendirebilir veya düz metin verilerini şifrelenmiş verilerle ilişkilendirebilir veya iki farklı şifreli metni birbiriyle ilişkilendirebilir (bu nedenle düz metinler üzerinde tahminler yapılabilir) ....


-5

Kısa hikaye:

Sistemin mevcut mikrosaniyesini kullanarak rastgele bir tohum üretir.

Bu numara oldukça eski ve hala işlevsel.

Zorla brüt faktörü hariç, her kombinasyonu tüm olası sayılarda "bahis yaparak" belirleyebilirim ve bu, özellikle rastgele sayılar kullanımdan önce yuvarlanırken bu sorunun noktası değildir.

Bir örnek diyelim, kullanılan tohumu sadece 10 değer kullanarak belirleyebilirim. Yani, tohumu bilmek, bir sonraki değeri tahmin edebilirim.

Eğer tohum = 1'i kullanırsam bir sonraki sırayı elde edebilirim:

1, 2, 3, 4, 5, 6, 7, 8, 9 ... (ve tohumun 1 ve sonraki değeri 10 kullandığı sonucuna vardım)

Ancak, eğer her "nth" değerini gönderirseniz değişiklik ne olur? Tohumun mevcut mikrosaniye ile değiştirilmesi ucuz bir püf noktasıdır (yani, çok fazla CPU döngüsü gerektirmez).

Yani şimdi sıra: (tohum = 1) 1, 2, 3, 4, 5, (tohum = 2), 7, 9, 11, 13 ... (15?)

Bu durumda:

a) Hangi tohumun kullanıldığına karar veremiyorum.

b) Ergo, bir sonraki değeri tahmin edemiyorum.

c) Yapabileceğim tek tahmin, bir sonraki tohumun önemli bir sayı olabileceğini düşünmektir.

Her neyse, en modern rastgele jeneratör algoritmaları zaten bu hileyi kaputun altında kullanıyor.

Gerçek şu ki, "doğru" rasgele bir sayı oluşturmak için kuantum bir bilgisayara ihtiyacımız yok, bilgisayardaki kuvars kristalimizin rasgele bir jeneratör gibi davranması, CPU'nun rasgele verimliliği de dikkate alınmadan değişkendir. İşlemcinin genellikle aynı anda birkaç işlem yapması.


2
Bu oldukça kötü bir fikir ve kesinlikle öngörülemeyen dizilim gerektiren bir şey için bir güvenlik açığı kaynağı. Mikrosaniye alırsanız, yalnızca 10 ^ 6 tohumluk ihtimaliniz vardır, bu da oldukça düşüktür.
HoLyVieR

@HoLyVieR: Güvenliği önemsiyorsanız bu kesinlikle kötü bir fikir, ancak yaptığınız kadar kötü değil: normalde sistem başladığından beri (veya unix çağını ...) olası değer aralıklarını önemli ölçüde artıran mikrosaniye kullanırsınız.
mikera

1
@mikera Daha iyi değil, isteğin işlenme süresi tahmin edilebilir. Çok sayıda parola sıfırlama işlevi için bir güvenlik açığı vektörü. Bu komut dosyaları, tekniğinizle "rasgele" bir belirteç oluşturdu ve saldırgan, oluşturulduğu zamanı oldukça önemsiz bulduğu için oluşturulan belirteçleri bulabildi ... aynı zamanda parola sıfırlama isteğinin + - 150ms olarak gönderildiği sırada.
HoLyVieR

Elbette, bu durum çok kötü. Ancak devlet, sistem başlangıcında ekilmiştir ve saldırgan durum değil başlangıç zamanını tahmin etmenin iyi bir yol var oldukça kötü değildir. Bazı saldırı türlerini olanaksız kılan 10 ^ 12 olası mikro ses kaynağından kolaylıkla seçim yapabilirsiniz . Açık olmak gerekirse, tüm bu çözümler kripto perspektifinden oldukça kötüdür, ancak sabit önemlidir .
mikera

Çevrimiçi sunucular için, sistem çalışma süresi bilgileri bazen halka açık bir şekilde sunulur. Veya bir durum sayfasından "Olaylar. Sunucuyu tekrar aç." Şeklinde elde edebilirsiniz. Veya ping yapabilir, büyük bir duruş süresi bekleyebilir ve makinenin yeniden başlatılabileceğini not edebilirsiniz (ki bu durum kontrol etmek için yüzlerce milyon zaman verebilir, ki bu oldukça düşüktür).
Dereckson
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.