RSA Şifreleme Algoritması

Kriptoloji

haber-10-940

Şifreleme Algoritmaları (Encryption Algorithms)

Kriptoloji şifreleme bilimidir. Çeşitli iletilerin, verilerin belirli bir sisteme göre şifrelenmesi, bu mesajların güvenlikli bir ortamda alıcıya iletilmesi ve iletilmiş mesajın deşifre edilmesidir. Kriptoloji; askeri kurumlardan, kişiler arası veya devlet kurumları arasındaki iletişimden, sistemlerdeki güvenlik boşluklarına kadar tüm dallarla alakalıdır.

Şifreleme Algoritmalarında 2 çeşit şifreleme algoritması bulunur. Simetrik ve Asimetrik şifreleme algoritmaları. Ben bu yazımda Asimetrik RSA şifreleme algoritmasını anlatacağım.Kriptoloji = Kriptografi + Kriptoanaliz. Kriptoloji şifreli yazı yazma, kriptoanaliz ise şifreyi çözme ve analiz etmektir.

1-Simetrik Şifreleme Algoritmaları

Bu algoritmada şifreleme ve şifre çözmek için bir tane gizli anahtar kullanılmaktadır. Simetrik şifrelemenin en önemli avantajı hızlı olmasıdır. Kullanılan anahtarın boyundan dolayı bit sayısı küçüktür. Simetrik algoritma kullanan çok kullanıcılı bir sistemde anahtarın bütün kullanıcılara dağıtılması güvenlik açısından problem doğurabilmektedir. DES, AES, Blowfish algoritmaları örnek olarak verilebilir.

2-Asimetrik Şifreleme Algoritmaları

Asimetrik şifreleme algoritmalarında anahtar ile şifre çözme anahtarı birbirinden farklıdır. Şifreleme yapan açık anatar, şifreyi çözen anahtar ise özel anahtardır.

Simetrik şifreleme yapan algoritmalara göre güvenlik açısından daha başarılıdır, ancak hız ve donanımsal uygunluk bakımından dezavantajı vardır. DH(Diffie-Helman) ve RSA algoritmaları Asimetrik şifreleme algoritmaları grubunda yer alır.

Ben bu yazımda sizlere güvenlik açısından güçlü olan RSA şifrleme algoritmasını anlatacağım. RSA, güvenliği tam sayıları çarpanlarına ayırmanın algoritmik zorluğuna dayanan  açık anahtarlı yöntemidir. 1978’de Ron Rivest, Adi Shamir ve Leonard Adleman tarafından bulunmuştur.

Örnek üzerinden inceleyelim;

mesaj olarak 2 değerini seçelim.

P ve Q aralarında  asal sayı olan anahtarlar değerler girdiğimizi kabul edelim

P=3  ve Q=11 değerlerini seçtim.

N=3*11=33

Q(N)=(3-1)*(11-1) = 20    //Girdiğimiz değerlerin bir eksiğiyla çarparak Q(N) değerimizi bulduk

Enctrypt key   e = 1 <e <Q(N) koşulu sağlanmalıdır ve bu seçeceğimiz e sayısı Q(N) ile aralarında asal olmak zorundadır.

1 <e < 20 koşulunu aradığımızda

e=7 değerini seçtik.

d değerimiz ise (d*e)mod(Q(n))=1 olmalı o halde[(d*7)mod20=1]

Denklem çözüldüğünde d=3 değeri elde edilir.

Bu aşamada Öklid algoritması kullanılarak şu değerler elde edilir.

public key (e,n) –> (7,33)

private key (d,n) –>( 3,33)

Şifreleme İşlemi:   c=m^e mod n

Şifrelenin Açılması: m=c^d mod n

denklemleriyle hesaplanır. Aşağıda bu denklemler uygulanırsa;

Encryption  c degeri = m^d (mod 33) = 29 olarak şifreli mesaj elde edilir.

Bu elde edilen “29” şifreli mesajı aşağıda şifrenin çözümlenmiş halini bulmak için alttaki denkleme yazıyoruz.

decryption  c degeri= 29 ^ 3 mod 33 = 2

(29,2)  elde edilir.

RSA şifreleme algoritması C++  uygulama kodu:

#include "stdafx.h"
#include<iostream>
#include<math.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
long int p, q, n, t, flag, e[100], d[100], temp[100], j, m[100], en[100], i;
char msg[100];
int prime(long int);
void ce();
long int cd(long int);
void encrypt();
void decrypt();
int prime(long int pr)
{
 int i;
 j = sqrt(pr);
 for (i = 2; i <= j; i++)
 {
 if (pr % i == 0)
 return 0;
 }
 return 1;
}
int main()
{
 setlocale(LC_ALL, "turkish");
 cout << "\nBirincil Anahtar Asal Sayıyı Giriniz:";
 cin >> p;
 flag = prime(p);
 if (flag == 0)
 {
 cout << "\nYanlış Giriş\n";
 exit(1);
 }
 cout << "\nDiğer Anahtar Asal Sayıyı giriniz:";
 cin >> q;
 flag = prime(q);
 if (flag == 0 || p == q)
 {
 cout << "\nYanlış Giriş\n";
 exit(1);
 }
 cout << "\nŞifrelenmesini istediğiniz mesajı giriniz:\n";
 fflush(stdin);
 cin >> msg;
 for (i = 0; msg[i] != NULL; i++)
 m[i] = msg[i];
 n = p * q; //n Örnekte çözdüğüm n ifadesini temsil ediyor.
 t = (p - 1) * (q - 1); //t örnekte Q(N) ifadesini temsil ediyor.
 ce();
 cout << "\ne ve d değerleri\n";
 for (i = 0; i < j - 1; i++)
 cout << e[i] << "\t" << d[i] << "\n";
 encrypt();
 decrypt();
 system("pause");
 return 0;
}
void ce()
{
 int k;
 k = 0;
 for (i = 2; i < t; i++)
 {
 if (t % i == 0)
 continue;
 flag = prime(i);
 if (flag == 1 && i != p && i != q)
 {
 e[k] = i;
 flag = cd(e[k]);
 if (flag > 0)
 {
 d[k] = flag;
 k++;
 }
 if (k == 99)
 break;
 }
 }
}
long int cd(long int x)
{
 long int k = 1;
 while (1)
 {
 k = k + t;
 if (k % x == 0)
 return (k / x);
 }
}
void encrypt()//şifreleme işlemi
{
 long int pt, ct, key = e[0], k, len;
 i = 0;
 len = strlen(msg);
 while (i != len)
 {
 pt = m[i];
 pt = pt - 96;
 k = 1;
 for (j = 0; j < key; j++)
 {
 k = k * pt;
 k = k % n;
 }
 temp[i] = k;
 ct = k + 96;
 en[i] = ct;
 i++;
 }
 en[i] = -1;
 cout << "\nMesajınızın Şifrelenmiş Hali:\n";
 for (i = 0; en[i] != -1; i++)
 printf("%c", en[i]);
}
void decrypt()//şifrenin çözümlenme işl
{
 long int pt, ct, key = d[0], k;
 i = 0;
 while (en[i] != -1)
 {
 ct = temp[i];
 k = 1;
 for (j = 0; j < key; j++)
 {
 k = k * ct;
 k = k % n;
 }
 pt = k + 96;
 m[i] = pt;
 i++;
 }
 m[i] = -1;
 cout << "\nŞifrelenmiş mesajın çözülmül hali:\n";
 for (i = 0; m[i] != -1; i++)
 printf("%c", m[i]);
 cout << endl;
 
}

Ekran Çıktısı:

Screen Shot 2019-02-17 at 20.39.42

 

 

Programın kaynak kodu github üzerinde de yer almaktadır.: https://github.com/batuhaniskr/rsa-algorithm

RSA Şifreleme Algoritması’ için 3 yanıt

Yorum bırakın