RSA Algoritması

Eyl 08, 2013
RSA, güvenilirliği çok büyük tam sayılarla işlem yapmanın zorluğuna dayanan bir şifreleme tekniğidir. Bu algoritma, adını Ron Rivest, Adi Shamir ve Leonard Adleman adlı geliştiricilerinin soyadlarının ilk harflerinden almıştır.

Özellikleri
  • Asimetrik bir şifreleme algoritmasıdır. Simetrik şifrelemedeki gibi tek anahtar kullanılmasının yerine; biri gizli (Private Key) diğeri açık (Public Key) olmak üzere iki anahtar kullanılır.
  • Güvenilirlik derecesi, şifrelemede kullanılan asal sayıların büyüklüğü ile orantılıdır.
  • Özellikle çok kullanıcısı olan sistemlerde güvenli veri paylaşımına ve sayısal imza ile kimlik doğrulaması (authentication) yapılmasına olanak sağlamaktadır.
  • Sistemin güvenilirliğinin yanı sıra hızının da yüksek olması için, kullanılacak anahtarın sayısal büyüklüğü önemlidir. Yeterli güvenilirlik derecesine ulaşmak için gerekli büyüklük Eliptik Eğri Şifreleme (ECC) Algoritması kullanılarak belirlenmektedir.

Avantajları

  • Simetrik şifreleme, şifrelenmiş veriyi alan tarafın veriyi deşifre edebilmesi için, gizli anahtar paylaşımını gerekli kılar. Ancak RSA asimetrik bir şifreleme tekniği olduğu için gizli anahtarın paylaşılmasına gerek yoktur. Kullanıcıların gizli anahtarlarının saklanması gerekmez. Bu da sistemi büyük bir depolama yükünden kurtarır.
  • Büyük sayılarla işlem yapmak zor olduğu için güvenilirliği son derece yüksek olan bir şifreleme tekniğidir.

Dezavantajları

  • RSA algoritmasının en büyük dezavantajı, asimetrik bir şifreleme algoritması olması ve büyük sayılarla işlem yapması nedeniyle yavaş olmasıdır.
  • Özellikle kablosuz ağ sistemlerinde bu algoritmanın kullanılması bazı sorunlara yol açabilir. Çünkü band genişliğini fazlaca tüketir ve sistemi yavaşlatarak performans düşüşüne neden olur.

.NET Teknolojisi ile RSA Şifreleme

.NET teknolojisi ile yazılım geliştirenler, herhangi bir veride şifreleme yapmak için .NET Framework içerisinde yer alan System.Security.Cryptography kütüphanesini kullanmaktadırlar. Bu kütüphane içerisinde yer alan fonksiyonlar sayesinde, yazılımcı istediği platformda güvenli bir şekilde veri şifreleme ve şifre çözümleme yapabilmektedir. Yazılım geliştiricinin RSA algoritmasını kullanarak şifreleme yapabilmesi için RSACryptoServiceProvider sınıfını kullanması gerekmektedir. Bununla ilgili bağlantıda yer alan uygulama incelenebilir.

Aşağıdaki kod parçası RSA algoritmasına parametre atamaya yarar.

    public static RSACryptoServiceProvider rsa;

    public static void AssignParameter()
        {
            const int PROVIDER_RSA_FULL = 1;
            const string CONTAINER_NAME = "SpiderContainer";
            CspParameters cspParams = 
                  new CspParameters(PROVIDER_RSA_FULL);
            cspParams.KeyContainerName = CONTAINER_NAME;
            cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
            cspParams.ProviderName = 
                  "Microsoft Strong Cryptographic Provider";
            rsa = new RSACryptoServiceProvider(cspParams);
        }

    Aşağıdaki kod parçası "AssignParameter" metoduyla aldığı parametreleri kullanarak alınan katar ifadeyi Açık Anahtar (Public Key) yardımıyla şifrelenmesini sağlar.

      public static string EncryptData(string data2Encrypt)
          {
              AssignParameter();
              StreamReader reader = 
                    new StreamReader(@"D:\publickey.xml");
              string publicOnlyKeyXML = reader.ReadToEnd();
              rsa.FromXmlString(publicOnlyKeyXML);
              reader.Close();
              byte[] plainbytes = 
                    System.Text.Encoding.UTF8.GetBytes(data2Encrypt);
              byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
              return Convert.ToBase64String(cipherbytes);
          }


      Aşağıdaki kod parçası "AssignParameter" metoduyla oluşturulmuş Açık Anahtar ve Gizli Anahtar (Private Key) bilgilerinin yerel bir xml dosyasında saklanmasını sağlar. Böylece oluşturulmuş şifreler "EncryptData" ve "DecryptData" metodlarının kullanımına açılır.

        public static void AssignNewKey()
            {
                AssignParameter();
                StreamWriter writer = 
                      new StreamWriter(@"D:\privatekey.xml");
                string publicPrivateKeyXML = rsa.ToXmlString(true);
                writer.Write(publicPrivateKeyXML);
                writer.Close();
                writer = new StreamWriter(@"D:\publickey.xml");
                string publicOnlyKeyXML =
                      rsa.ToXmlString(false);
                writer.Write(publicOnlyKeyXML);
                writer.Close();
            }


        Aşağıdaki kod parçası "EncryptData" metodunun Açık anahtar yardımıyla şifrelediği veriyi Gizli Anahtarı kullanarak tekrar ilk haline çevirmeyi sağlar.

          public static string DecryptData(string data2Decrypt)
              {
                  AssignParameter();
                  byte[] getpassword = 
                        Convert.FromBase64String(data2Decrypt);
                  StreamReader reader =
                        new StreamReader(@"D:\privatekey.xml");
                  string publicPrivateKeyXML = reader.ReadToEnd();
                  rsa.FromXmlString(publicPrivateKeyXML);
                  reader.Close();
                  byte[] plain = rsa.Decrypt(getpassword, false);
                  return System.Text.Encoding.UTF8.GetString(plain);
              }