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, PRNG
1 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. PRNG
Tohumun 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 CPRNG
gü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)-1
tohum ü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 CPRNG
ve 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 PRNG
ve CPRNG
tü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: