- 17 Nis 2015
- 1,654
- 1,605
RSA Algoritması Nedir ?
RSA algoritması (Rivest-Shamir-Adleman), ortak anahtar şifrelemesine izin veren ve özellikle internet gibi güvenli olmayan bir ağ üzerinden teslim edildiğinde hassas verilerin güvenliğini sağlamak için sıklıkla kullanılan bir şifreleme sisteminin temelidir. 1973'te İngiliz matematikçi Clifford Cocks tarafından bir açık anahtar algoritmasının keşfi, 1997 yılına kadar Birleşik Krallık'ın GCHQ'su tarafından gizli tutulmuş olsa da, Massachusetts Teknoloji Enstitüsü'nden Ron Rivest, Adi Shamir ve Leonard Adleman, RSA'yı ilk kez 1977'de halka açıkladı.
Genellikle açık anahtarlı şifreleme olarak bilinen asimetrik şifreleme, matematiksel olarak birbirine bağlı bir genel ve bir özel olmak üzere iki anahtar kullanır. Genel anahtar herkesle paylaşılabilir, ancak özel anahtar gizli kalmalıdır.
Hem genel hem de özel anahtarlar, RSA şifrelemesinde bir mesajı şifreleyebilir. Şifre çözme anahtarı, iletişimi şifrelemek için kullanılanın tam tersidir. Bu özellik, RSA'nın en yaygın olarak kullanılan asimetrik algoritma olmasının nedenlerinden biridir: elektronik iletişim ve veri depolamanın gizliliğini, bütünlüğünü, özgünlüğünü ve reddedilmemesini sağlar.
RSA, Secure Shell (SSH), OpenPGP, S/MIME ve SSL/TLS dahil olmak üzere çeşitli protokollerde şifreleme ve dijital imza yetenekleri için kullanılır. Ayrıca, internet gibi güvenli olmayan bir ağ üzerinden güvenli bir bağlantı kurması veya bir dijital imzanın kimliğini doğrulaması gereken tarayıcılar gibi yazılımlarda da kullanılır.
Ağa bağlı sistemlerde en yaygın faaliyetlerden biri RSA imza doğrulamasıdır.
RSA Algoritması Neden Kullanılır ?
İki büyük asal sayının çarpımı olan büyük tam sayıları çarpanlarına ayırmanın zorluğu RSA'nın güvenliğinin kaynağıdır. Günümüzün süper bilgisayarlarında bile, bu iki tamsayıyı çarpmak basittir, ancak orijinal asal sayıları toplamdan hesaplamak - veya çarpanlara ayırmak - alacağı zaman nedeniyle mümkün değildir.
RSA kriptografisinin en zor bileşeni, genel ve özel anahtarlar üretme algoritmasıdır. Rabin-Miller asallık testi prosedürü, p ve q olmak üzere iki büyük asal sayı oluşturmak için kullanılır. p ve q'nun çarpılmasıyla bir modül, n, elde edilir. Bu numara, genel ve özel anahtarlar tarafından paylaşılır ve her ikisi arasında bir bağlantı görevi görür. Anahtar uzunluğu, genellikle bit olarak verilen anahtarın uzunluğudur.
Genel anahtar, n modülünden ve küçük bir asal tamsayı olduğu için genellikle 65537'ye ayarlanan bir genel üste, e'den oluşur. Açık anahtar herkes tarafından paylaşıldığından, e rakamının gizlice seçilmiş bir asal sayı olması gerekmez.
Özel anahtar, n modülünden ve çarpımsal tersini bulmak için Genişletilmiş Öklid yönteminin n'nin totientine uygulanmasıyla bulunan özel üs d'den oluşur.
RSA Algoritması Nasıl Çalışır ?
Meltem, RSA anahtarları için iki asal sayı seçer: p=11 ve q=13. n=pq=143 modüldür. n =(p1)x(q1)=120 totient'tir. RSA genel anahtarı e için 7'yi seçer ve 103 veren RSA özel anahtarını hesaplamak için Genişletilmiş Öklid tekniğini kullanır.
Serdar Meltem'e şifreli bir mesaj göndermek ister, (M), bu durumda RSA açık anahtarını (n, e) alır, bu durumda (143, 7). Düz metin mesajı sadece 9 sayısıdır ve şifreli metin C ile şu şekilde kodlanmıştır:
Kodlama için Me mod n = 97 ile başlar ve mod 143 = 48 = C
Meltem, Serdar'ın iletişimini aldığında, RSA özel anahtarını (d, n) aşağıdaki şekilde çözmek için kullanır:
Şifre çözmek için Cd mod n = 48103 ile başlar ve mod 143 = 9 = M
Meltem'in bir hash (Serdar'a gönderdiği mesajın bir mesaj özeti) oluşturması, hash değerini kendi RSA özel anahtarıyla şifrelemesi ve bir mesajı dijital olarak imzalamak için RSA anahtarlarını kullanmak için anahtarı mesaja eklemesi gerekir. Serdar daha sonra, iletişimin kendisi tarafından gönderildiğini ve değiştirilmediğini doğrulamak için Meltem'in açık anahtarıyla karma değerinin şifresini çözebilir. Bu değer orijinal mesajın hash değeriyle eşleşiyorsa, mesaj yalnızca Meltem tarafından gönderilmiştir (kimlik doğrulama) ve tam olarak onun yazdığı gibidir (bütünlük).
Elbette Meltem, Serdar'ın RSA açık anahtarıyla olan iletişimini Serdar'a iletmeden önce şifreleyerek gizliliği garanti altına alabilir. Dijital sertifika, sertifikanın sahibini tanımlayan bilgilerin yanı sıra, sahibinin ortak anahtarını da içerir. Sertifikalar, onları veren sertifika yetkilisi tarafından imzalanır ve genel anahtarların alınmasını ve sahibin onaylanmasını çok daha kolay hale getirebilirler.
RSA Algoritması Python Örnek
Python:
import math
import base64
class AsimetrikSifreleme:
def __init__(self):
p = int(input('p için asal sayı gir: '))
q = int(input('q için asal sayı gir: '))
if not self.asalKontrol(p) or not self.asalKontrol(q):
print('Lütfen asal giriniz')
exit(-1)
n = p * q
r = (p - 1)*(q - 1)
for i in range(1,1000):
if(self.ortakBolen(i,r)==1):
e=i
d = self.carpimsalTers(e, r)
public = (e, n)
private = (d, n)
print('1 - ) Şifrele\n2 - ) Çöz\n ')
islem = input("İslem Seciniz: ")
if islem == '1':
data = input('Veri: ')
e_data = self.sifrele(public, data)
print(e_data)
print(base64.b64encode(e_data.encode()).decode())
elif islem == '2':
data = base64.b64decode(input('Veri: ').encode()).decode()
d_data = self.sifreCoz(private, data)
print(d_data)
else:
print("Hatalı işlem")
def asalKontrol(self,sayi):
if sayi == 2:
return True
if sayi < 2:
return False
for i in range(2, int(math.sqrt(sayi)) + 1):
if sayi%i == 0:
return False
return True
def ortakBolen(self,e,r):
while(r!=0):
e,r=r,e%r
return e
def oklid(self,x, y):
if x%y == 0:
return(y, 0, 1)
else:
b, s, t = self.oklid(y, x%y)
s = s - ((x//y)*t)
return(b, t, s)
def carpimsalTers(self,x, y):
a, b, _ = self.oklid(x, y)
if(a != 1):
return None
return b%y
def sifrele(self,key, data):
e, n = key
x = []
m = 0
for i in data:
if(i.isupper()):
m = ord(i)-65
c=(m**e)%n
x.append(str(c))
elif(i.islower()):
m= ord(i)-97
c=(m**e)%n
x.append(str(c))
elif(i.isspace()):
spc=400
x.append(str(400))
return ','.join(x)
def sifreCoz(self,priv_key,c_text):
d,n=priv_key
txt=c_text.split(',')
x=''
m=0
for i in txt:
if(i=='400'):
x+=' '
else:
m=(int(i)**d)%n
m+=65
c=chr(m)
x+=c
return x
if __name__ == '__main__':
Uygulama = AsimetrikSifreleme()
Son düzenleme: