Rastgele Sayı Üretimi - II

Rastgele Sayı Üretimi - II Bu makalede, Microsoft. NET Çerçevesinde rastgele sayı üretimi için tanımlanmış iki sınıfın birbirinden farkını ve diğer rastgele sayı üretimi algoritmalarından bahsedeceğiz. Yazar: Yunus Emre ALPÖZEN Yazıldığı Tarih: 24.09.2004 İstatistik: Bu makale 399 defa okundu.Geçen makalemizde geliştirdiğimiz uygulamayı çalıştırdığımız zaman, Microsoft .NET çerçevesinde oluşturulmuş rastgele sayı dağılımı örneği ile aralarında bir çelişki olduğunu göreceğiz. Hatırlatmak için, verdiğimiz örneği tekrarlamak istiyorum:{ 59, 8, 25, 97, 47, 37, 6, 66, 95, 99, 77, 74, 98, 11, 85, 54, 81, 52, 29, 2}Geliştirdiğimiz uygulamanın örnek bir sonucu da şu şekildedir:{ 20, 26, 75, 22, 30, 24, 66, 29, 40, 7, 7, 93, 98, 54, 60, 54, 5, 22, 72, 23}Bu iki sayı dağılımı arasında önemli bir fark var. Geliştirdiğimiz uygulamanın sonuçlarında 7, 22 ve 54 sayıları iki kez tekrarlanmaktadır. Oysa verdiğimiz örnekte tekrarlanan hiç bir sayı bulunmamaktadır. statiksel olarak Random sınıfını kullanarak elde ettiğimiz sonuçlar yeterlidir. Fakat, kriptolojik olarak bu sonuçlar yeterli değildir. Üretilen sayıların tekrarlanması düzenli dağılım oluşmamasına sebep olabilmektedir. Verdiğimiz örneği yine Microsoft .NET Çerçevesinde yer alan System.Security.Cryptography altında yer alan RandomNumberGenerator soyut sınıfı ve RNGCryptoServiceProvider mühürlü sınıfını kullanılarak oluşturulmuştur.Microsoft .NET Çerçevesinde yer alan RandomNumberGenerator soyut sınıfı ile kriptolojik olarak güçlü bir rastgele sayı üretecinin sahip olması gereken özellikler tanımlanmıştır. Bu soyut sınıfın erişelebilir bir özelliği tanımlanmamıştır. Bu sınıfın erişilebilir metotları ise şu şekilde tanımlanmıştır: Create, Kriptografik rastgele sayı üretici nesnesi oluşturur. Equals, iki nesnenin birbirine eşit olup olmadığını test eder. GetBytes,kriptografik olarak güçlü rastgele sayı dizilimini içeren bir byte dizisini doldurur. GetHashCode, bellekteki o nesneye özgü bir hash kodu oluşturur. GetNonZeroBytes, sıfırı içermeyen kriptografik olarak güçlü rastgele sayı dizilimini içeren bir byte dizisi oluşturur. GetType, bu nesnenin tipini verir. ToString, şu an ki nesneyi ifade eden bir metin oluşturur.Kriptolojik olarak güçlü rastgele sayı üretimi Microsoft .NET Çerçevesinde RNGCryptoServiceProvider sınıfı gerçeklenmektedir. RNGCryptoServiceProvider, RandomNumberGenerator soyut sınıfından türeyen mühürlü bir sınıftır. Mühürlü sınıf, hiç bir sınıfın kendisinden türetilemeyeceğini ifade eder. Bu sınıfın erişebilir bir özelliği bulunmamaktadır. Bu sınıfın erişilebilir metotları ise şu şekilde tanımlanmıştır. Equals,iki nesnenin birbirine eşit olup olmadığını test eder. GetBytes,kriptografik olarak güçlü rastgele sayı dizilimini içeren bir byte dizisini doldurur. GetHashCode,bellekteki o nesneye özgü bir hash kodu oluşturur. GetNonZeroBytes,sıfırı içermeyen kriptografik olarak güçlü rastgele sayı dizilimini içeren bir byte dizisi oluşturur. GetType,bu nesnenin tipini verir. ToString, şu an ki nesneyi ifade eden bir metin oluşturur.Bu sınıfın kullanımı ile ilgili örnek bir uygulama geliştirelim. Ayrıca bu örnekte bir byte dizisinden nasıl tamsayı oluşturabileceğimizi göreceğiz.C# using System; using System.Security.Cryptography; namespace TestConsoleApplication { public class TestUygulaması { static int ByteArrayToInt32(byte[] byteArray, int offset) { int iResult =0; for (int i=offset; i<(offset+4);i++ ) iResult = iResult | ( (int)byteArray[i] << ((3+offset-i)*8) ); return iResult; } static void Main() { RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); //20 Adet Tamsayı oluşturabilmemiz için //80 Byte"a ihtiyacımız var byte[] byteArray= new byte[80]; rng.GetBytes(byteArray); int offset=0; while(offset using namespace System; using namespace System::Security::Cryptography; int ByteArrayToInt32(Byte byteArray[], int offset) { int iResult=0; for(int i=offset;i<(offset+4);i++) iResult = iResult | ( (int)byteArray[i] << ((3+offset-i )*8) ); return iResult; } int _tmain() { //20 Adet Tamsayı oluşturabilmemiz için //80 Byte"a ihtiyacımız var RNGCryptoServiceProvider __gc* rng = __gc new RNGCryptoServiceProvider(); Byte byteArray __gc[]= __gc new Byte[80]; int iOffset=0; rng->GetBytes(byteArray); while (iOffsetLength) { Console::WriteLine(ByteArrayToInt32(byteArray,iOffset)); iOffset+=4; } Console::Read(); return 0; }J#package TestConsoleApplication; import System.*; import System.Security.Cryptography.*; public class TestUygulaması { public TestUygulaması() { } public static int ByteArrayToInt32(ubyte[] byteArray, int offset) { int iResult =0; for (int i=offset; i<(offset+4);i++ ) iResult = iResult | ( (int)byteArray[i] << ((3+offset-i)*8) ); return iResult; } /** @attribute System.STAThread() */ public static void main(String[] args) { RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); //20 Adet Tamsayı oluşturabilmemiz için //80 Byte"a ihtiyacımız var ubyte[] byteArray=new ubyte[80]; rng.GetBytes(byteArray); int offset=0; while(offsetBlum Blum Shub(BBS) , algoritması da yine yalancı rastgele sayı üretici algoritmasıdır. Daha önce vermiş olduğumuz yinelemeli fonksiyonun biraz değiştirilmiş bir halidir.Xn+1 = (Xn)2 mod MBu algoritma L. Blum, M.Blum ve M.Shub isimli üç geliştirici tarafından 1986 yılında geliştirilmiştir. Bu algoritma istatiksel bir rastgele üretiminden çok kriptografik olarak rastgele sayı üretimi için kullanılmaktadır. Bunun da en önemli sebebi algoritmasının yavaşlığıdır. Fonksiyon da verilen M sayısı çok büyük iki asal sayının çarpımıdır. Üretilen bir sayıdan diğerinin oluşturulabilinmesi için M sayısının bilinmesi gerekmektedir. Çok büyük asal sayılar üzerinde çalışabilen hızlı bir algoritma olmadığı için BBS şimdilik güvenli olarak ele alınmaktadır. Ancak günün birinde, bu işlemi yapabilen bir algoritma önerildiğinde BBS çökecektir. Bu yüzden güvenilirliğini kanıtlayamamıştır.ISAAC , Bob Jenkins tarafından geliştirilmiş kriptografik olarak güvenilir bir yalancı rastgele sayı üreticidir. 256 adet tamsayıyı tutan bir diziden bir başka diziye çeşitli hesaplamalar yapılarak kopyalanması üzerine çalışmaktadır. Hesaplamalar i. tam sayıyı i^128’inci tamsayı ile değiştirerek yapılmaktadır. Çok yaygın olarak kullanılmamaktadır. Kaynak kodlarını ve daha detaylı açıklamalarını İnternet üzerinden rahatlıkla bulabilirsiniz.Bir sonraki makalemizde görüşünceye dek güvende kalın...Yazar : Yunus Emre ALPÖZENe-Posta : yunus.alpozen et msakademik.net

Döküman Arama

Başlık :

Kapat