Rastgele sayı üreteci nedir?
Rastgele sayı üreteci (RNG), rastgele veya sözde rastgele sayılar üreten bir sistemdir. Bir sonraki sayının gerçekten tahmin edilip edilemeyeceği, üretecin türüne bağlıdır. Bazı üreteçler fiziksel bir süreçten yararlanır, bazıları sayılarını bir algoritmayla hesaplar ve bazı algoritmalar ise çıktılarını görmüş birinin bile bir sonraki sayıyı tahmin edemeyeceği şekilde oluşturulmuştur. Rastgele görünmek ve tahmin edilemez olmak farklı özelliklerdir ve bu makalenin büyük kısmı bu farkı ele almaktadır.
Donanım rastgele sayı üreteçleri
Gerçek rastgele sayı üreteci (TRNG) olarak da adlandırılan bir donanım rastgele sayı üreteci (HRNG), sayılarını fiziksel bir süreçten elde eder. En eskileri gözümüzün önünde çalışır: atılan bir madeni para, atılan bir zar, bir rulet çarkı. Mekanik bunların her birini tamamen açıklar, ancak iyi yapılmış bir çark pratikte yine de tahmin edilemezdir; çünkü her dönüşün başlangıcındaki küçük farklılıklar tamamen farklı sonuçlara dönüşür.
Modern donanım üreteçleri ise mikroskobik olayları ölçer: elektronik devrelerdeki tanecik gürültüsü ve termal gürültü, atmosferik gürültü, kuantum etkileri. Bunlar iyi entropi kaynaklarıdır — ölçülebilen öngörülemezlik — ancak fiziksel bir kaynak doğası gereği kusursuz değildir: yanlılık gösterebilir, zamanla sapabilir ve arızalanabilir; bu nedenle kalitesinin değerlendirilmesi ve izlenmesi, çıktısının gerektiğinde daha fazla işlenmesi gerekir, ki bu da NIST SP 800-90B gibi standartların tanımladığı şeydir. Donanım kaynakları, güvencenin en önemli olduğu yerlerde kullanılır — her şeyden önce kriptografide, burada Transport Layer Security (TLS) gibi protokollerin arkasındaki anahtarlar için tahmin edilemez başlangıç materyali sağlarlar.
Sözde rastgele sayı üreteçleri
Fiziksel bir aygıtın alternatifi bir algoritmadır. Bir sözde rastgele sayı üreteci (PRNG), rastgele görünen ancak tohum (seed) adı verilen bir başlangıç değeri tarafından tamamen belirlenen bir dizi üretir. Aynı tohumu aynı algoritmaya verirseniz her defasında aynı diziyi elde edersiniz. Bu, bir sonucun tahmin edilemez olması gerektiğinde ve tohumun veya iç durumun tahmin edilebildiği veya yeniden oluşturulabildiği durumlarda bir zayıflıktır; bir sonucun yeniden üretilebilir olması gerektiğinde ise bir güçtür — bir simülasyon veya bir test tam olarak yeniden çalıştırılabilir. PRNG'ler ayrıca hızlı, ucuz ve uygulaması kolaydır, bu yüzden çoğu yazılım bunlara güvenir. Tanınmış algoritmalar arasında doğrusal kongrüans üreteci (LCG), xorshift üreteçleri ve Mersenne Twister yer alır.
Mersenne Twister
1997 yılında Makoto Matsumoto ve Takuji Nishimura tarafından yayımlanan Mersenne Twister, en yaygın kullanılan sözde rastgele sayı üreteçlerinden biridir ve birçok programlama dilinde varsayılandır. Adını periyodundan — dizinin tekrarlanmadan önceki uzunluğu — alır; bu periyot standart varyant olan MT19937'de Mersenne asalı 219937 − 1'dir. Rastgeleliğin çoğu istatistiksel testini geçer ve simülasyonlar için uygundur. Ancak sır tutmak için tasarlanmamıştır: art arda gelen 624 adet 32 bitlik çıktıdan herhangi biri iç durumunu yeniden oluşturabilir ve sonraki her değeri tahmin edebilir, bu nedenle anahtarlar, şifreler veya öngörülemez kalması gereken başka hiçbir şey için kullanılmamalıdır.
Kriptografik olarak güvenli üreteçler ve entropi
Birçok uygulama her iki şeye aynı anda ihtiyaç duyar: bir algoritmanın hızı ve fiziksel bir kaynağın öngörülemezliği. Yanıt, kriptografik olarak güvenli bir sözde rastgele sayı üretecidir (CSPRNG). Bu yine de bir PRNG'dir, ancak çıktısının bir kısmını görmenin geri kalanını tahmin etmek için pratik bir yol sunmayacağı şekilde oluşturulmuştur; ayrıca gerçek bir entropi kaynağından tohumlanır ve düzenli olarak yeniden tohumlanır. Fiziksel bir kaynaktan gelen bir tohum, sıradan bir PRNG'yi güvenli kılmaz; algoritmanın bunun için tasarlanmış olması gerekir. Termal gürültü veya donanım olaylarının zamanlaması gibi fiziksel bir kaynak az miktarda gerçek rastgelelik sağlar ve CSPRNG bundan çok daha hızlı biçimde uzun bir değer dizisi elde eder. Bu kombinasyon, bir işletim sisteminin üzerinde çalışan programlara sunduğu şeydir ve günümüzde pratikte "rastgele sayı üreteci" ifadesinin genellikle ifade ettiği şeydir. Şifreleme anahtarları, oturum belirteçleri ve şifreler üretir.
Tarayıcıda rastgele sayılar
JavaScript, bir web sayfasına rastgele değerler alması için yerleşik iki yol sunar ve bunlar farklı sınıflara aittir. Math.random() sıradan bir PRNG'dir: dil standardı algoritmayı her tarayıcıya bırakır ve güvenlik konusunda hiçbir vaatte bulunmaz — bir animasyon için uygundur, birinin itiraz edebileceği bir çekiliş için uygun değildir. Diğeri ise Web Crypto API'dir. Onun crypto.getRandomValues() yöntemi, işletim sisteminin entropisiyle tohumlanmış bir CSPRNG tarafından üretilen kriptografik olarak güçlü rastgele değerler döndürür.
Çevrimiçi rastgele sayı üreteci aracımız her çekiliş için Web Crypto API'yi kullanır ve sayılar bir sunucu yerine tarayıcınızda üretilir. İster zar atma, ister yazı tura yapın veya bir şifre oluşturucu kullanın, bu sitedeki diğer üreteçleri de aynı kaynak çalıştırır.
Rastgele bitlerden belirlediğiniz aralıktaki bir sayıya
Kriptografik olarak güvenli bir üreteç, adil bir çekilişin yalnızca yarısıdır. Ham bitler sunar ve programın bunları yine de istediğiniz aralıktaki bir sayıya dönüştürmesi gerekir — ve işte burada eşit olmayan şanslar (modulo bias) sızabilir. Kaynağın 0 ila 9 arasındaki değerleri eşit olasılıkla verdiğini ve sizin 0 ila 5 arasında bir sayıya ihtiyacınız olduğunu varsayalım. 6 ile bölündükten sonraki kalanı almak doğal görünebilir, ancak 0, 1, 2 ve 3 bu durumda iki yoldan gelebilir ve 4 ile 5 yalnızca bir yoldan gelebilir; bu nedenle 0 ila 3 arasındaki sayıların her biri %20 şansa sahipken, 4 ve 5 yalnızca %10 şansa sahip olur. Bu dengesizliği ortadan kaldırmanın bir yolu, uymayan değerleri atmak ve yeniden çekiliş yapmaktır; rastgele sayı materyallerimiz bu konuyu ayrıntılı olarak ele alır.
İki şey daha insanları şaşırtır. Tekrarlar normaldir: 1 ila 10 arasında bir tam sayı bağımsız olarak çekildiğinde ve her sayı eşit olasılığa sahip olduğunda, az önce çekilen sayının diğerleri gibi tekrar gelme şansı 10'da 1'dir. Tekrarsız bir çekiliş daha rastgele bir çekiliş değil, farklı türde bir çekiliştir. Ve tek başına adil bir üreteç tüm süreci adil kılmaz: rastgele kazananları nasıl seçersiniz rehberimizin açıkladığı gibi, katılımcı listesi ve deneme sayısı da aynı derecede önemlidir.