RSA Şifreleme
Husamettin Elalmis
Last updated
Husamettin Elalmis
Last updated
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