RSA Şifreleme Algoritması
Gönderilme zamanı: 04 Şub 2008, 21:37

RSA sifreleme Algoritması
İlk defa 1977 yılında Ron Rivest, Adi Shamir ve Len Adleman tarafından olusturulan RSA algoritması gelistiricilerinin soyisimlerinin ilk harfleriyle anılmaktadır. Bu yazımızda RSA algoritmasını ve bu algoritmanın Microsoft .NET teknolojileri ile nasıl gerçeklenebilecegini inceleyecegiz.
RSA algoritması, Amerika’ da 1983 yılında MIT’ten patent almıstır. Bu patent 21 Eylül 2000 de son bulmustur. Ancak patenti daha önce bir uygulamaya ait oldugu için bir baska ülkede patent alınamaz.
Bir genel anahtarlı sifreleme teknigi olan RSA, çok büyük tamsayıları olusturma ve bu sayıları isleminin zorlugu üzerine düsünülmüstür. Anahtar olusturma islemi için asal sayılar kullanılarak daha güvenli bir yapı olusturulmustur. Anahtar olusturma algoritması su sekildedir:
•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ı olusturur.
Genel ve özel anahtarları olusturduktan sonra gönderilmek istenen bilgi genel anahtar ile sifrelenir. sifreleme islemi su sekilde yapılmaktadır: sifrelenecek bilginin sayısal karsılıgının E’ ninci kuvveti alınır ve bunun mod N deki karsılıgı sifrelenmis metni olusturmaktadır. Genel anahtar ile sifrelenmis bir metin ancak özel anahtar ile açılabilir. Bu yüzden sifrelenmis metin, yine aynı yolla, sifrelenmis metnin sayısal karsılıgının D’ninci kuvveti alınır ve bunun mod N deki karsılıgı orjinal metni olusturur.
Basit bir örnek ile algoritmayı tekrar anlatalım. Örnegin basitligi açısından daha küçük asal sayılarla çalısacagız. Öncelikle genel ve özel anahtarlarımızı olusturalı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ı olusturur.
Bu algoritmada iki asal sayının çarpımını kullanarak anahtar olusturulması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. simdi olusturdugumuz {5, 119} ve {77, 119} anahtarlarımızı kullanarak sifreleme yapalım. Örnek olarak, 19 sayısını genel anahtarımızla{5, 119} sifreleyelim. 19 sayısının 5’inci kuvvetinin mod 119 daki karsılıgı olan 66, 19 sayısının RSA sifrelenmis halidir. Özel anahtarımızı {77, 119} kullanarak 66’nın 77’nci kuvvetinin mod 119 daki karsılıgı tahmin de edebileceginiz gibi 19 dur.
İki tamsayının aralarında asal olup olmadıgının testi için matematikten de bildigimiz Öklit algoritması kullanılır. Çok büyük asal sayı olusturmak oldukça zor bir istir. RSA ile günümüzde 1024 bitlik bir anahtar (yaklasık 300 basamaklı bir sayı) basit uygulamalar için yeterli bir sifreleme teknigi olarak kullanılabilir.
RSA algoritması, bir sifreleme algoritması için oldukça basit bir algoritmadır. Buna karsın sürekli çok büyük asal sayı olusturmak oldukça zor bir islemdir. 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 ugrasmak zorunda kalırdık. Bunun için, Microsoft .NET Framework’ te hali hazırda RSA uygulaması gelistirebilmek için RSA sınıfı bulunmaktadır. Kullanımı oldukça basit oldugu için bir web servisi ile örneklendirebiliriz. Bunun için bir web servisi olusturalım. Bu web servisine rsa isimli sınıfından bir degisken tanımlayalım. Bu web servisine sifreleme ve desifreleme için asagıdaki iki web metotu ekleyelim.
C#
Kod: Tümünü seç
[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
_
Public Function Encrypt(ByVal stringToEncrypt As String) As String
Dim buffer As Byte() = Encoding.UTF8.GetBytes(stringToEncrypt)
Return Encoding.UTF8.GetString(rsa.Encrypt(buffer, False))
End Function
_
Public Function Decrypt(ByVal stringToDecrypt As String) As String
Dim buffer As Byte() = Encoding.UTF8.GetBytes(stringToDecrypt)
Return Encoding.UTF8.GetString(rsa.Decrypt(buffer, False))
End Function
C++.NET
[System::Web::Services::WebMethod]
String __gc* Encrypt(String __gc * stringToEncrypt)
{
Byte buffer[] = Encoding::UTF8->GetBytes(stringToEncrypt);
return Encoding::UTF8->GetString(rsa->Encrypt(buffer,false));
}
[System::Web::Services::WebMethod]
String __gc* Decrypt(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().GetString( rsa.Encrypt(buffer,false) );
}
/** @attribute WebMethod() */
public String Decrypt(String stringToDecrypt)
{
ubyte[] buffer = Encoding.get_UTF8().GetBytes(stringToDecrypt);
return Encoding.get_UTF8().GetString( rsa.Decrypt(buffer,false) );
}RSA sınıfı RSA algoritmasını kullanmak isteyen kodların türetilmesi gereken ana sınıfı tanımlar. RSA sınıfı, AsymmetricAlgorithm sınıfından türeyen soyut bir sınıftır. Bu sınıfın erisilebilir özellikleri sunlardır:
•KeyExchangeAlgorithm, anahtar degisimi algortimasının ismini belirtir. RSA için “RSA-PKCS1-KeyEx” tir.
•KeySize, sifreleme ve desifreleme için kullanılacak anahtarların kaç bitten olusacagını gösterir. Bu özelligin degerini degistirerek, kullanılacak bit sayısını ayarlayabilirsiniz. Varsayılan anahtar boyutu 1024 bittir.
•LegalKeySize, bu algoritma tarafından desteklenen geçerli anahtarlar bit olarak büyüklügünü gösterir. RSA algoritması için anahtar büyüklügü en az 384 bit en fazla 16384 bittir. 16384 bit 2KB büyüklügünde bir anahtar anlamına gelmektir. Bu da yaklasık 5000 basamaklı bir sayı anlamına gelmektedir.
•SignatureAlgorithm, imzalama için kullanılacak algoritmanın adını gösterir. RSA için “http://www.w3.org/2000/09/xmldsig#rsa-sha1” tir.
Bu sınıfın erisilebilir metotları ise sunlardır:
•Clear, RSA tarafından kullanılan tüm kaynakları sisteme geri verir.
•Create, RSA'nın özel uygulamalarının yazıldıgı durumlarda nesnenin olusturuldugunda yapılacak isleri içerir.
•DecryptValue, özel anahtar ile verilen bilgiyi desifrelemek için kullanılır.
•EncryptValue, genel anahtar ile verilen bilgiyi sifrelemek için kullanılır.
•Equals, iki nesnenin birbirine esit olup olmadıgını test eder.
•ExportParameters, RSA'in tüm parametreleri özel ve genel anahtarlar dahil RSAParameter yapısından bir nesne içine kaydeder.
•FromXmlString, XML Deserilestirme gibidir. ToXMLString metotu ile XML'e aktarılmıs nesneyi yeniden olusturur, nesneyi XML'e yüklenmeden önceki durumuna getirir.
•GetHashCode, bellekteki o nesneye özgü bir hash kodu olusturur.
•GetType, bu nesnenin tipini verir.
•ImportParameters, RSAParameters yapısından bir nesne içindeki, RSA'nın kullanacagı tüm parametreleri özel ve genel anahtarları dahil geri yükler.
•ToString, su an ki nesneyi ifade eden bir metin olusturur.
•ToXmlString, XML Serilestirme gibidir. Nesnenin o anki durumunu yeniden olusturulabilecek bir sekilde XML'e aktarır.
simdi, RSA sınıfından bahsederken ismi geçen RSAParameters yapısını inceleyelim. Bu yapı da yine System.Security.Cryptography altında yer almaktadır. Bu yapının en önemli özelligi serilestirilebiliyor olmasıdır. Bu özelligi sayesinde Binary(ikili) ve ya XML olarak bu yapıyı serilestirip, aktarabiliriz.Bu yapı içerisinde algoritmayı anlatırken kullandıgımız P ve Q gibi semboller ile ifade ettigimiz algoritmanın temel parametreleri yer almaktadır.
Örneklerimizde de yer alan RSACryptoServiceProvider sınıfı ise dogrudan RSA sifrelemesi için kullanılacak sınıfı ifade eder. Bu sınıf biraz evvel bahsettigimiz RSA 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üretilemeyecegini ifade eder. Bu sınıfın erisilebilir özellikleri sunlardır:
•KeyExchangeAlgorithm, anahtar degisimi algortimasının ismini belirtir. RSA için “RSA-PKCS1-KeyEx” tir.
•KeySize, sifreleme ve desifreleme için kullanılacak anahtarların kaç bitten olusacagını gösterir. Bu özelligin degerini degistirerek, kullanılacak bit sayısını ayarlayabilirsiniz. Varsayılan anahtar boyutu 1024 bittir.
•LegalKeySize, bu algoritma tarafından desteklenen geçerli anahtarlar bit olarak büyüklügünü gösterir. RSA algoritması için anahtar büyüklügü en az 384 bit en fazla 16384 bittir. 16384 bit 2KB büyüklügünde bir anahtar anlamına gelmektir. Bu da yaklasık 5000 basamaklı bir sayı anlamına gelmektedir.
•PersistKeyInCsp, anahtarın CSP(Cryptographic Service Provider) içerisinde kalıcı olarak tutulup tutulmayacagını belirten özelliktir. Bu özelligin degerini degistirerek dısarıdan bu özelligi aktif/pasif kılabilirsiniz.
•SignatureAlgorithm, imzalama için kullanılacak algoritmanın adını gösterir. RSA için “http://www.w3.org/2000/09/xmldsig#rsa-sha1” tir.
•UseMachineKeyStore, PersistKeyInCsp ile bilgisayar üzerinde kalıcı olarak tutulması istenen anahtarları o an ki kullanıcı profilinde mi yoksa tüm kullanıcılar için ortak olan bir yerde mi tutulacagını belirtir.
Bu sınıfın erisilebilir metotları ise sunlardır:
•Clear, RSA tarafından kullanılan tüm kaynakları sisteme geri verir.
•Decrypt, RSA algoritması ile verilen bilgiyi desifre eder.
•DecryptValue, özel anahtar ile verilen bilgiyi desifrelemek için kullanılır. Ancak Microsoft .NET Framework’ ün 1.1 versiyonunda bu metot desteklenmemektedir.
•Encrypt, RSA algoritması ile verilen bilgiyi sifreler.
•EncryptValue, genel anahtar ile verilen bilgiyi sifrelemek için kullanılır. Ancak Microsoft .NET Framework’ ün 1.1 versiyonunda bu metot desteklenmemektedir.
•Equals, iki nesnenin birbirine esit olup olmadıgını test eder.
•ExportParameters, RSA'in tüm parametreleri özel ve genel anahtarlar dahil RSAParameter yapısından bir nesne içine kaydeder.
•FromXmlString, XML Deserilestirme gibidir. ToXMLString metotu ile XML'e aktarılmıs nesneyi yeniden olusturur, nesneyi XML'e yüklenmeden önceki durumuna getirir.
•GetHashCode, bellekteki o nesneye özgü bir hash kodu olusturur.
•GetType, bu nesnenin tipini verir.
•ImportParameters, RSAParameters yapısından bir nesne içindeki, RSA'nın kullanacagı tüm parametreleri özel ve genel anahtarları dahil geri yükler.
•SignData, verilen bilginin hash degerini hesaplar ve bu deger ile veriyi imzalar.
•SignHash, belirtilen hash degeri için imzayı hesaplar ve özel anahtar ile bu bilgiyi sifreler.
•ToString, su an ki nesneyi ifade eden bir metin olusturur.
•ToXmlString, XML Serilestirme gibidir. Nesnenin o anki durumunu yeniden olusturulabilecek bir sekilde XML'e aktarır.
•VerifyData, belirtilen bilgi için imzayı tekrar hesaplayıp var olan imza ile karsılastırır.
•VerifyHash, belirtilen hash degeri için imzayı tekrar hesaplayıp var olan imza ile karsılastırır.
Not: ALINTIDIR.