3 Mayıs 2014 Cumartesi

zaman : Yorum bırak

RSA Şifreleme Algoritması

RSA algoritması, Amerika’ da 1983 yılında MIT’ten patent almıştır. Bu patent 21 Eylül 2000 de son bulmuştur. Ancak patenti daha önce bir uygulamaya ait olduğu için bir başka ülkede patent alınamaz.

Bir genel anahtarlı şifreleme tekniği olan RSA, çok büyük tamsayıları oluşturma ve bu sayıları işleminin zorluğu üzerine düşünülmüştür. Anahtar oluşturma işlemi için asal sayılar kullanılarak daha güvenli bir yapı oluşturulmuştur. Anahtar oluşturma algoritması şu şekildedir:
• P ve Q gibi çok büyük iki asal sayı seçilir.
• Bu iki asal sayının çarpımı N = PxQ ve bu bir eksiklerinin ?(N)=(P-1)x(Q-1) hesaplanır
• 1’den büyük ?(N)’den küçük ?(N) ile aralarında asal bir E tamsayısı seçilir.
• Seçilen E tamsayısının mod ?(N)’de tersi alınır, sonuç D gibi bir tamsayıdır.
• E ve N tamsayıları genel anahtarı, D ve N tamsayıları ise özel anahtarı oluşturur.
Genel ve özel anahtarları oluşturduktan sonra gönderilmek istenen bilgi genel anahtar ile şifrelenir. Şifreleme işlemi şu şekilde yapılmaktadır: Şifrelenecek bilginin sayısal karşılığının E’ ninci kuvveti alınır ve bunun mod N deki karşılığı şifrelenmiş metni oluşturmaktadır. Genel anahtar ile şifrelenmiş bir metin ancak özel anahtar ile açılabilir. Bu yüzden şifrelenmiş metin, yine aynı yolla, şifrelenmiş metnin sayısal karşılığının D’ninci kuvveti alınır ve bunun mod N deki karşılığı orjinal metni oluşturur.

Basit bir örnek ile algoritmayı tekrar anlatalım. Örneğin basitliği açısından daha küçük asal sayılarla çalışacağız. Öncelikle genel ve özel anahtarlarımızı oluşturalım.
• P=7 ve Q=17 gibi iki asal sayı seçelim.
• Bu iki asal sayının çarpımı N=PxQ; N=119 ve bu iki asal sayının bir eksiklerinin çarpımı ?(N) = (P - 1)x(Q-1); ?(N) =96 olarak hesaplanır.
• 1’den büyük 96’dan küçük 96 ile aralarında asal bir E=5 tamsayısı seçelim.
• Seçilen E=5 tamsayısının mod 96’da tersi alınır, sonuç D=77 gibi bir tamsayıdır.
• 5 ve 119 tamsayıları genel anahtarı, 77 ve 119 tamsayıları ise özel anahtarı oluşturur.
Bu algoritmada iki asal sayının çarpımını kullanarak anahtar oluşturulmasının sebebi, iki asal sayının çarpımını asal çarpanlarına ayırmak asal olmayan sayıları ayırmaktan daha zorlu olmasıdır. Şimdi oluşturduğumuz {5, 119} ve {77, 119} anahtarlarımızı kullanarak şifreleme yapalım. Örnek olarak, 19 sayısını genel anahtarımızla{5, 119} şifreleyelim. 19 sayısının 5’inci kuvvetinin mod 119 daki karşılığı olan 66, 19 sayısının RSA şifrelenmiş halidir. Özel anahtarımızı {77, 119} kullanarak 66’nın 77’nci kuvvetinin mod 119 daki karşılığı tahmin de edebileceğiniz gibi 19 dur.

İki tamsayının aralarında asal olup olmadığının testi için matematikten de bildiğimiz Öklit algoritması kullanılır. Çok büyük asal sayı oluşturmak oldukça zor bir iştir. RSA ile günümüzde 1024 bitlik bir anahtar (yaklaşık 300 basamaklı bir sayı) basit uygulamalar için yeterli bir şifreleme tekniği olarak kullanılabilir.

RSA algoritması, bir şifreleme algoritması için oldukça basit bir algoritmadır. Buna karşın sürekli çok büyük asal sayı oluşturmak oldukça zor bir işlemdir. Asal sayılarının bilinen bir formülü yoktur. RSA algoritmasını biz de yazabiliriz, ancak algoritmanın tüm detaylarıyla teker teker uğraşmak zorunda kalırdık. Bunun için, Microsoft .NET Framework’ te hali hazırda RSA uygulaması geliştirebilmek için RSA sınıfı bulunmaktadır. Kullanımı oldukça basit olduğu için bir web servisi ile örneklendirebiliriz. Bunun için bir web servisi oluşturalım. Bu web servisine rsa isimli sınıfından bir değişken tanımlayalım. Bu web servisine şifreleme ve deşifreleme için aşağıdaki iki web metotu ekleyelim.
C#


   [WebMethod] 
public string Encrypt(string stringToEncrypt) 
{ 
    byte[] buffer Encoding.UTF8.GetBytes(stringToEncrypt); 
    return Encoding.UTF8.GetString(rsa.Encrypt(buffer,false)); 
} 

[WebMethod] 
public string Decrypt(string stringToDecrypt) 
{ 
    byte[] buffer Encoding.UTF8.GetBytes(stringToDecrypt); 
    return Encoding.UTF8.GetString(rsa.Decrypt(buffer,false)); 
}  
VB.NET


   <WebMethod()> Public Function Encrypt(ByVal stringToEncrypt As String) As String 
        Dim buffer As Byte() = Encoding.UTF8.GetBytes(stringToEncrypt) 
        Return Encoding.UTF8.GetString(rsa.Encrypt(bufferFalse)) End Function 

<WebMethod()> Public Function Decrypt(ByVal stringToDecrypt As String) As String 
        Dim buffer As Byte() = Encoding.UTF8.GetBytes(stringToDecrypt) 
        Return Encoding.UTF8.GetString(rsa.Decrypt(bufferFalse)) End Function  
C++.NET


   [System::Web::Services::WebMethod]  String __gcEncrypt(String __gc stringToEncrypt) 
{ 
        Byte buffer[] = Encoding::UTF8->GetBytes(stringToEncrypt); 
        return Encoding::UTF8->GetString(rsa->Encrypt(buffer,false)); 
} 

[System::Web::Services::WebMethod]  String __gcDecrypt(String __gc stringToDecrypt) 
{ 
        Byte buffer[] = Encoding::UTF8->GetBytes(stringToDecrypt); 
        return Encoding::UTF8->GetString(rsa->Decrypt(buffer,false)); 
}  
J#


   /** @attribute WebMethod() */ public String Encrypt(String stringToEncrypt) 
{ 
    ubyte[] buffer Encoding.get_UTF8().GetBytes(stringToEncrypt); 
    return Encoding.get_UTF8().GetStringrsa.Encrypt(buffer,false) ); 
} 
/** @attribute WebMethod() */ public String Decrypt(String stringToDecrypt) 
{ 
    ubyte[] buffer Encoding.get_UTF8().GetBytes(stringToDecrypt); 
    return Encoding.get_UTF8().GetStringrsa.Decrypt(buffer,false) ); 
}  

0 yorum :

Yorum Gönder