
Teknik Özellikler
C#,Windows Application,N-Layer Mimari
Genel bakış
Proje 3 senaryodan oluşmaktadır. Genel olarak RSA Algoritmasının sektöre yönelik kullanımlarını araştırarak senaryoları bu şekilde şifre sıfırlama, E-imza ve Rsa algoritmasına ek olarak Vigenere Algoritması baz alınarak oluşturulmuştur.
Program ile İlgili Genel Görseller ve Çalışma Örnekleri
AnaSayfa:

Email Link Senaryosu:
Öncelikle anahtar uzunluğu belirlenir görselde 512 bit seçildi daha sonra “Anahtar Oluştur” butonuna basılır ve public private olmak üzere 2 adet metin textleri program tarafından doldurulur
Daha sonra ise şifrenilecek metin “Mesaj” kutucuğuna girilir ve “şifrele” butonuna basılır daha sonra şifrelenmiş mesaj (Encrypt) kutucuğu program tarafından doldurulur. Doldurulan metin kopyalanır ve sağdaki “Şifrelenmiş Mesaj” ( Decrypt) kutucuğuna yazılır. Şifreyi çözmek için de “Metni çöz” butonuna basılır.

Alice’in Mesajı(E-imza) Senaryosu:
İlk olarak 2 adet asal sayı kullanıcı tarafından girilir eğer kullanıcı girmek istemez ise “Random Üret” butonuna basılır daha sonra ise “Anahtar Oluştur” butonuna basılır ve public private kutucuklarında belli sayılar ile program tarafından doldurulur.
Şifrelenecek mesaj “Mesaj” kutucuğuna yazılır ve “Şifrele” butonuna basılır daha sonra “Encrypt” bölümündeki “Şifrelenecek Metin” kutucuğu program tarafından doldurulur. Doldurulan metin kopyalanır ve sağdaki (Decrypt) “Şifrelenmiş Mesaj” kutucuğuna yazılır. ”Metni Çöz” butonuna basılır.

Vigeenire Chipher Senaryosu:
“Anahtar Kutucuğu”na bir metin girilir.Daha sonra mesaj kısmına kullanıcı tarafından şifrenilecek mesaj girilir.”Şifrele” butonuna basılır ve “Şifreli Mesaj” (Encrypt) Kutucuğu dolu bir şekilde gelir. Bu kutucuktaki mesaj kopyalanıp sağ taraftaki “şifreli mesaj” (Decrypt) kutucuğuna yapıştırılır “Metni Çöz ” butonuna basılarak mesaj elde edilir.
RSA Algoritması
Bir şifreleme yöntemi olan RSA, 1977 yılında Ron Rives, Adi Shamir ve Leonard Aldeman tarafından bulunmuştur. Şifreleme yönteminin adı da bu üç kişinin soy isimlerinin baş harflerinden oluşur.
Çalışması:
- Yeterince büyük iki adet asal sayı seçilir: Bu sayılar p ve q olsun
- n=pq hesaplanır. Buradaki n sayısı iki asal sayının çarpımıdır ve hem umumî hem de hususî şifreler için taban (modulus) olarak kabul eder.
- Totient fonksiyonu hesaplanır. Bu örnek için çarpanların ikisi de asal sayı olduğu için φ(n) = (p-1)(q-1) olarak bulunur.
- Hesaplanan Totient fonksiyonu değeri (φ(n) ) ile aralarında asal olan öyle bir e sayısı alınır ki 1 < e < φ(n) olmalıdır. Bu seçilen e sayısı umumî anahtar olarak ilan edilebilir.
- d gibi bir sayı hesaplanır ki bu sayı için şu denklik geçerli olmalıdır .de ≡ 1 mod ( φ(n) ). Bu d değeri hususî şifre olarak saklanır. Bu sayının hesaplanması sırasında uzatılmış öklid algoritmasından faydalanılır.
Yukarıdaki şifreleme yönteminin en önemli dez avantajlarından birisi büyük asal sayılar bulmak aşamasında ortaya çıkar. Bilindiği üzere ele alınan bir sayının asal olup olmadığını bulmak kolay bir işlem değildir. Bu işlemin zorluğunu projeyi kodlarken daha büyük asal sayıları üretmede programın kitlendiğini görerek ne kadar zor bir işlem olduğunu daha net anladım.
Şifreleme işlemi:
Şifreleme işlemi için Alice kendi umumî şifresi olan (n,e) ikilisini yayınlar. Bu şifreyi alan Bob aşağıdaki şekilde mesajını şifreler:
c = me mod n
Burada m, şifrelenecek olan açık metin, e ve n ise Alice tarafından yayınlanan umumî şifredir.
Şifrenin Açılması:
Alice, Bob tarafından yollanmış olan mesajın açılması sırasında aşağıdaki formülü kullanır:
m = cd mod n
Burada açılacak olan şifrelenmiş metin c, Alice’in hususî şifresi ise d ile gösterilmiştir. n ise taban değeri olan modulus’tur.
Örnek:
- İki asal sayı seçilir
p = 61 ve q = 53
- n değeri hesaplanır n = pq şeklinde
n = 61 * 53 = 3233
Totient fonksiyonu hesaplanır
φ(n) = (p-1)(q-1)
φ(n) = (61-1)(53-1) = 3120
- Totient fonksiyonu sonucu ile aralarında asal olan ve 1 den büyük bir sayı seçilir
e > 1 => e = 17 (3120 ile aralarında asal) , bu sayı aynı zamanda umumî şifredir.
- Hususî şifre olması için bir d sayısı seçilir:
de ≡ 1 mod(n) olacak şekilde d sayısı bulunur , d = 2753 (çünkü 17 * 2753 = 46801 = 1 + 15 * 3120 ) Bu sayının hesaplanması sırasında öklit yönetimi kullanılmıştır.
- Örneğin mesaj olarak 123 gönderilecek olsun:
12317 mod 3233 = 855 olarak şifreli metin bulunur.
- açacak taraf için tersi işlem uygulanır:
8552753 mod 3233 = 123 şeklinde orjinal mesaj geri elde edilir.
E-Mail Senaryosu
Bu Senaryonun temel amacı bilgisayarımda yapamadığım çok büyük private ve public keyleri üreten asal sayıları windowsun servisleri sayesinde yapabildim. Buranın Kodları ve algoritması E İmza senaryosu ile aynı olduğu için (Rsa Algoritması) sunumu kısa tutmak amaçlı açıklamıyorum.
- Buradaki senaryoda public ve private keyleri windowsun hazırladığı RSACryptoServiceProvider servici ile üretiyoruz.
- Anahtaların 512 bit,1024 bit vs. seçenekleri ile anahtarların boyutunu kullanıcı belirliyor.

- Üretilen Public ve Private Keyler ile Encrypt( şifrelemek) için gerekli mesaj girilir.Girilen Mesaj Sonrasında Şifreli bir metin oluşur.Bu metini private key olmadan kimse açamaz.
- Decryption(Şifre Çözme) Bu kısımda şifrelenmiş metin girilir ve private key ile çözümü gerçekleştirilir.
- Public ve Private keyleri windowsun servislerinden xml olarak alıyorum ve bunu kendi programım ile kullanıcının okuyacağı string veri tipine çeviriyorum.

İlk olarak şifreleme işleminde public key ve şifrelenecek metini bir fonksiyona gönderiyorum daha sonra kod yorum kısımlarında açıkladığım üzere bu metni şifreleyip kullanıcıya veriyorum.

Decrypt işleminde ise aynı şekilde bitleri kaydırarak servise gönderiyorum ve metnin çözülmüş halini elde ediyorum.

E-Imza Senaryosu (Alice’nin Mesajı)

1.RSA Algoritmasındaki gibi 2 adet asal sayı belirlenir.Programda Random Üret Butonu ile program kendi asal sayılarını üretebilir.Buradaki Kodu açıklamam gerekirse.

Random olarak min ve max değerleri belli olan bir sayı üretiyorum.

Yukarıdaki kod da iki sayı değer dönecek şekilde tasarlanmış random üretilen sayıları asal olana kadar rangelerini arttırp yenilerini üretiyor. asal olup olmadığını check obeb fonksiyonu ile kontrol ediyorum.Bu fonksiyonun koduda aşağıdaki görselde yer almaktadır.

Daha sonra rsa algoritmasındaki aşamaları tek tek uygulayarak public ve private keylerimi elde ediyorum.Aşağıdaki görselde d ve e alanları oluşturduğum rsa key manager adlı entity den gelen p ve q sayıları ile bulunur. D sayısı publickey E sayısı private key dir.
Şifreleme kısmında ise karakterlerin ascii değerlerini buluyorum fakat şifreleme için girilen metin cok uzun olursa bunu bilgisayarımla hesaplamak çok fazla uzun sürüyor.Bende çözüm olarak her karakteri rsa algoritması ile şifreledim.

Koddan kısaca bahsetmek gerekirse encrypt fonksiyonuna bir mesaj değeri gelir.Bu mesajı ascii tablosundaki değerlere göre çevirerek.charactersAsNumbers adlı array dizisine çeviriyorum ve daha sonra bunu encrypter fonksiyonuna gönderiyorum..Burada karakterin şifrelenmesi için gereken rsa algoritması ndan gelen (mesaj üssü publickey mod (asal1*asal2) )işlemi uygulanır ve bu işlem her karakter için yapılır.Buradaki Biginteger veri tipini kullanmamın sebebi çok büyük sayıların üssünü alırken ve bunların modunu alırken verileri bozmuyor.int ve daha uzun olan int32 veri tiplerinde boyutları gereği veriler bozuluyor doğru sonuç alamıyorum.

Buradaki Descryter işlemin de aynı şekilde bir mesaj gelir bu mesajı biginteger listesine dönüştürürüz daha sonra( msg üssü d(public key) mod n(Asal1*Asal2)) işlemine tabi tutarız. ve dönen değerin ascii karşılığını bularak kullanıcıya bilgi veriyorum.
Vigenere Cipher Senaryosu
Vigenere şifresinde anahtar, bir kelime veya cümledir. Vigenere şifrelemenin algoritmik ifadesi, şifrelenecek mesajın(plain-text) modüler eklenmesi ve anahtar kelimenin tekrarıdır. Şifreli mesajı çözme mantığı da benzerdir, şifreli mesajın (cipher-text) ve anahtar kelimenin (key)modüler çıkarılmasıdır.
Şifre bulunduktan yaklaşık 200 sene sonra (1854) Charles Babbage Vigenere şifreli mesajı çözme yöntemini bulmuştur. Şifrenin güvenlik açığı, bloklama yapmak için anahtarın tekrar etmesidir. Dolayısıyla uzun bir mesajda bir kelime birden fazla kez tekrar ediliyorsa şifreli metindeki aynı kelimelerinin bloğu, anahtarın o anki boyutuyla eşit ise aynı biçimde (aynı alfabelerle aynı kelimeleri) şifreleyecektir. Kelimenin tekrarından anahtarın boyu tahmin edilebilir. Dolayısıyla anahtarın uzunluğu bilindiğinde şifreyi kırmak kolaylaşacaktır.
Aşamalar
İlk olarak ‘VIGENERE ’ kelimesini ‘KEY’ anahtar sözcüğü ile şifreleme işlemi (encrypt) şu şekilde yapılmaktadır.
Şifrelenecek mesaj (plain-text) -> VIGENERE (8 harf)
Anahtar (key) -> KEY
Yeni anahtar(8 harfli) -> KEYKEYKE
Dipnot:Buradaki harf sırası yazdığım kodda belli bir algoritmaya dayanarak ascii rakamlarından oluşmaktadır.Detaylı bilgiyi kodumu anlatırken açıklayacağım.
Şifrelenecek mesajın harf sıraları -> 22 9 7 5 14 5 18 5
Anahtarın harf sıraları -> 11 5 25 11 5 25 11 5
Mesaj + anahtar -> 22 09 07 05 14 05 18 05
11 05 25 11 05 25 11 05
+____________________
33 14 32 16 19 30 29 10
%26 -> 7 14 6 16 19 4 3 10
Mesaj ve anahtarları toplayarak şifreli mesajımı 26 sayısı ile modunu alarak elde ettim.Kodda temsili olarak mod 127 kullanılmıştır.
Şifreli mesaj (cipher-text) -> G N F P S D C J
Şifreli mesajı açmak (decrypt) ise aşağıdaki şekilde yapılabilmektedir. ‘GNFPSDCJ’ şifreli mesajını ‘KEY’ anahtar sözcüğü ile çözme işlemi.
Şifreli mesaj (cipher-text) -> G N F P S D C J (8 harf)
Anahtar (key) -> KEY
Yeni anahtar (8 harfli) -> KEYKEYKE
Şifreli mesajın harf sıraları -> 7 14 6 16 19 4 3 10
Anahtarın harf sıraları -> 11 5 25 11 5 25 11 5
Şifreli mesaj – anahtar -> 07 14 06 16 19 04 03 10
11 05 25 11 05 25 11 05
-____________________
-4 9 -19 5 14 -21 -8 5
oluşan metni şifreleme kısmında ne ile modunu aldıysak burada şifreli mesaja ekleyip modunu alıyoruz.
+26 -> 22 35 7 31 40 5 18 31
%26 -> 22 9 7 5 14 5 18 5
Orijinal mesaj -> V I G E N E R E
Yazdığım programa dönecek olursam;

İlk başta kullanıcının gözüne çarpması için bir key anahtar değerini almak için textbox oluşturdum.Bu anahtar yukarıda bahsettiğim üzere şifrelenecek ve şifrenilen metni çözmek için gerekli .

Mesajın şifrelemek için kendim oluşturduğum Viegener Cipher adlı service method mu kullanıyorum bu servise key ve şifrenilecek mesajı veriyorum.

Yukarıdaki görselde gelen değer ile anahtar uzunluğunu kullanarak bir block listesi oluşturuyorum.
Daha sonra oluşan liste içindeki her itemi kullanıcıya vermek için döneceğim değer ile topluyorum.

şifreyi çözme aşamasında ise

daha sonra dönen değerleri string dönüştürüp kullanıcıya veriyorum.

