Dev Arksoft
  • Arksoft Developer Network
  • Ağustos 2023
    • Angularda DOM (Document Object Model) Manipülasyonu
    • Angular’da Routing
    • Representational State Transfer (REST)
    • .Net Framework için Local NugetPackage
    • Agile Nedir?
  • Temmuz 2023
    • Angular HTTP Interceptors
    • Angularda Promise ve Observable
    • Mongo DB Kullanımı
  • Haziran 2023
    • Angular Validators
  • Mayıs 2023
    • Docker Uzerine Redis Kurulumu ve .Net Core ile Redise Erişim
  • Nisan 2023
    • Angular 14 Componentler Arası İletişim
  • Şubat 2023
    • JMeter ile Performans Testi
  • Ocak 2023
    • Windows Giriş Ekranında C# Form Açmak
  • Temmuz 2022
    • Regular Expressions
  • Haziran 2022
    • RSA Şifreleme
    • AutoMapper Kullanımı
    • Permutasyon ve Kombinasyon
    • Generic Repository Pattern
    • Levenshtein Algoritması
    • HTML 5’e Giriş
    • Graph Yapılar
  • Mayıs 2022
    • IQueryable IEnumerable Farklar
    • Sıralama Algoritmaları
  • Şubat 2022
    • ADFS Custom 2FA Integration
    • Reacta Giriş ve Reactın Temel Prensipleri
    • TypeScript Kullanımı
    • Serialization Kullanımı
    • Log4Net Kullanımı
    • Collections Yapıları
    • Windows Service Projesini Debug Etme ve Harici Exe Çalıştırma
    • Culture ve DateTime Kullanımı
    • Reflection Kullanımı
    • Steganografi Teknikleri
    • ElasticSearch Kullanımı
    • SWAGGER ve JWT TOKEN BASED WEBAPI Kullanımı
    • LINQ Komutları Kullanımı
    • Image Processing İşlemleri Kullanımı
Powered by GitBook
On this page
  1. Haziran 2022

RSA Şifreleme

Husamettin Elalmis

PreviousRegular ExpressionsNextAutoMapper Kullanımı

Last updated 2 years ago

RSA Şifreleme

Merhaba arkadaşlar, bu yazıda sizlere RSA Şifreleme kavramından bahsecedeğim.

RSA Şifreleme Nedir?

  • RSA (Rivest-Shamir-Adleman) baş harflerinin birleşimi ile okunan, tek yönlü asimetrik bir şifreleme yöntemidir.

  • 1977 yılında geliştirilmiştir, günümüzde halen kullanılmaktadır.

  • Asimetrik şifreleme yöntemlerinde, public ve private key kavramları vardır.

  • Bir taraf şifreler (public key ile), diğer taraf şifrelenmiş veriyi geri çözer (private key ile)

  • Public key, genellikle herkese açıktır. Private key ise genellikle sunucu tarafında yer alır.

RSA Çalışma Prensibi

  • Public ve Private Key ikilisinden oluşur.

  • Public key, veriyi şifreler. Public key, sadece şifrelemek için kullanılır. Şifrelenmiş veriye Cipher text denir.

  • Şifrelenmiş veri, private key ile çözülerek orjinal veri elde edilir.

  • Public key, birçok kullanıcıya dağıtılabilir. Her kullanıcıya ayrı ayrı public key verilebilir. Kullanıcılar, verilerini public key ile şifrelerler. Dağıtılan tüm public keyler için ortak bir private key vardır. Bu private key, veriyi geri çözmek üzere sunucu tarafında tutulur.

  • Sunucudan dağıtılan, tüm kullanıcılara verilebilen public keyler aracılığı ile kullanıcılar verilerini şifrelerler. Bu şifrelenmiş verilere Cipher text denir. Bu Cipher textler sunucuya gönderilir ve sunucu tarafında private key ile geri çözülebilir. Burada, dağıtılan tüm public keyler için aynı private keyin kullanılıyor olması önemlidir. RSA şifreleme Public-Private key ikilisinden oluşur. Public key şifreler, private key çözer.

  • HTTPS (SSL) sertifikaları bu mantıkla çalışmaktadır.

RSA Çalışma Algoritması

  • P ve Q olmak üzere 2 adet Asal Sayı seçilir

  • N değeri ve o(N) değeri hesaplanır. N = P*Q, o(N) = (P-1)*(Q-1)

  • 1 < e < o(N) şartı sağlanıncaya kadar yeni bir e Asal Sayısı seçilir.

  • (d*e) % o(N) = 1 denklemi çözülür. Burada d değeri hesaplanır.

  • Bu denklemler doğrultusunda,

    • Public key değeri (e, N) ikilisidir

    • Private key değeri (d, N) ikilisidir

Not: RSA şifrelerinin kırılamaması zorluğu, Asal sayıların kullanılmasından kaynaklıdır. Bilgisayarlar, büyük boyutlu asal sayıları çarpanlarına ayıramadıkları için bu şifrelerin kırılması çok uzun zaman alır. (Asal Sayıların formülünün bulunması gerekir)

  • Şifreleme ve geri çözme formülü yukarıdaki denklemlere göre yapılır.

  • Örnek Public ve Private keylerin elde edilmesi

  • Public ve Private keylerin matematiksel karşılıkları

Uygulama

Program.cs

using RSAArge.Helpers;

using System;

using System.Text;

namespace RSAArge

{

class Program

{

static void Main()

{

// console ayarları

Console.BackgroundColor = ConsoleColor.White;

Console.ForegroundColor = ConsoleColor.Black;

Console.InputEncoding = Encoding.UTF8;

Console.OutputEncoding = Encoding.UTF8;

Console.Clear();

// public ve private keyleri "ARKOSFT...xml" isimli dosyalara yazmak için // RSAHelper.GenerateKeys("ARKSOFT", RSAHelper.RSAKeySizeEnum.Size_2048); // public ve privateyi biliyorsak bu şekilde girebiliriz, veya dosyadan okuturuz string publicKey = "<RSAKeyValue><Modulus>rfzlz5vARPlfFHSPfit9GoJ3uQ7u7pGZj9PIYQcJjM+600ZyOh1ofz+zCBx6RodcpYevk8Vb2PMk4Z1ePzghLpGep08yhASUspzyOtPwDdXqhX7Mf0ySdUF2ICpypkAu9/QYjvw1/fUm+aFGOAqqeFsJpXaDX6jl+SgPahwCrl0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; string privateKey = "<RSAKeyValue><Modulus>rfzlz5vARPlfFHSPfit9GoJ3uQ7u7pGZj9PIYQcJjM+600ZyOh1ofz+zCBx6RodcpYevk8Vb2PMk4Z1ePzghLpGep08yhASUspzyOtPwDdXqhX7Mf0ySdUF2ICpypkAu9/QYjvw1/fUm+aFGOAqqeFsJpXaDX6jl+SgPahwCrl0=</Modulus><Exponent>AQAB</Exponent><P>4LNv8IfQEaapvSk/6xW6BH9JZa0WqL3CoeVT9n4ySq8S2GYE9XmbFte28LK98eW+N8v7hhiCK8WWY4vb1cSPpw==</P><Q>xjkYPna3HuwWSav4/48Q2WHMcT5zBxAkGYxWTiZSUtHiXC735K627ELYtX4ZaWUVqX1w14s0SOBLRlY3FuMyWw==</Q><DP>dV8ldLXsiJvPBCEc4zZJIXo/o53DPUdJ+Hkq35HRwVMr+99mbbckvMzXIWmscEO6lbi2XLhGnoiqYrs2jLYM9w==</DP><DQ>XM6Gh1hVzGiE1uFpp114ag7cBXlTqc7o1/1YuyY+DQCvlrF25t7WTi/N/suXYj0tszlEB+bpB+Xb2IatLE4bWQ==</DQ><InverseQ>SGLSknLn0hzB9qCcCGLyk3UHRlut98wN2s5riNjmclUQODxgNr0x6ak0HbsRVnPiR+BzGgmyGG8hTB1EZIyolQ==</InverseQ><D>OYN/9EDoLeTBKWHejTaTBFBcgzAMi5BV0tWPR4OsBIAmofCHke5mvKmx5NyFDwtv9MgFojN7SRwW9P2wSfWkAdUTTHa4uLrcafR1YkxcNKcJd39nPcm0r+hdURvGKBg+rWnhdE0Nd+lrcR0u0+clFpmokTdHuActqJZtJoTg6YE=</D></RSAKeyValue>"; string data = "ARKSOFT A.Ş. Yazılım Ekibi";

Console.WriteLine($"Data: {data}");

string cipher = RSAHelper.Encryption(data, publicKey, RSAHelper.RSAKeySizeEnum.Size_2048);

Console.WriteLine($"Cipher: {cipher}");

string decrypted = RSAHelper.Decryption(cipher, privateKey, RSAHelper.RSAKeySizeEnum.Size_2048);

Console.WriteLine($"Decrypted: {decrypted}");

Console.WriteLine("ok");

Console.ReadLine();

}

}

}

RSAHelper.cs

using System;

using System.IO;

using System.Security.Cryptography;

using System.Text;

namespace RSAArge.Helpers

{

public class RSAHelper

{

// Kaç bit şifreleme kullanılacağı tanımı public enum RSAKeySizeEnum

{

Size_256 = 256,

Size_512 = 512,

Size_1024 = 1024,

Size_2048 = 2048

}

// GenerateKeys - Public ve Private keyleri xml dosyasına yazar public static void GenerateKeys(string name, RSAKeySizeEnum keySize)

{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider((int)keySize);

using (StreamWriter sw = new StreamWriter($"{name}-rsa-private.xml"))

{

sw.WriteLine(rsa.ToXmlString(true));

}

using (StreamWriter writer = new StreamWriter($"{name}-rsa-public.xml"))

{

writer.WriteLine(rsa.ToXmlString(false));

}

}

// Encryption - Datayı şifreler public static string Encryption(string data, string publicKey, RSAKeySizeEnum keySize)

{

var arr = Encoding.UTF8.GetBytes(data); using (var rsa = new RSACryptoServiceProvider((int)keySize))

{

try

{

rsa.FromXmlString(publicKey.ToString());

var encryptedData = rsa.Encrypt(arr, true); var base64Encrypted = Convert.ToBase64String(encryptedData); return base64Encrypted;

}

finally

{

rsa.PersistKeyInCsp = false;

}

}

}

// Decryption - Şifreli datayı geri çözer public static string Decryption(string cipherText, string privateKey, RSAKeySizeEnum keySize)

{

using (var rsa = new RSACryptoServiceProvider((int)keySize))

{

try

{

var base64Encrypted = cipherText;

rsa.FromXmlString(privateKey);

var resultBytes = Convert.FromBase64String(base64Encrypted); var decryptedBytes = rsa.Decrypt(resultBytes, true); var decryptedData = Encoding.UTF8.GetString(decryptedBytes); return decryptedData.ToString();

}

finally

{

rsa.PersistKeyInCsp = false;

}

}

}

}

}

Sonuç

  • Bu dokumanda RSA şifreleme kavramını uygulamalı görmüş olduk

  • Bir çok alanda kullanılabilmektedir.

Saygılarımla,

Hüsamettin ELALMIŞ – 25.06.2022

husamettin.elalmis@arksoft.com.tr