Задача - реализовать алгоритм RSA с целью демонстрации работы самого алгоритма. Т.е. никаких извращенств, модуль не будет использоваться в реальных задачах, поэтому стойкости от него не требуется.
Что у меня получилось:
import random, math, string
class RSA:
def __init__(self):
self.lets=string.letters+' '
self.strength=2
self.text=''
self.res=[]
self.keys=[]
def fact(self, x):
res=1
for i in range(1,x+1):
res*=i
return res
def is_easy(self, n):
if (self.fact(n-1)+1)%n==0:
return True
else:
return False
def NOD(self, a,b):
while b:
a,b=b,a%b
return a
def findPrimes(self):
self.p=4
self.q=4
while not self.is_easy(self.p):
self.p=random.randint(1*self.strength, 10*self.strength)
while not self.is_easy(self.q):
self.q=random.randint(1*self.strength, 10*self.strength)
self.n=self.p*self.q
self.m=(self.p-1)*(self.q-1)
self.d=4
while abs(self.NOD(self.d, self.m))!=1:
self.d=random.randint(10*self.strength,1000*self.strength)
self.e=0
for self.e in range(99998, 0, -1):
if (self.e*self.d)%self.m==1:
break
def encrypt(self):
self.text=[self.lets.index(n) for n in self.text]
for i in self.text:
self.res.append(int(i)**self.e%self.n)
#print "Open key e=%i n=%i"%(self.e, self.n)
#print "Private key d=%i n=%i"%(self.d, self.n)
#print "Cryptophrase = %s"%(' '.join([str(i) for i in self.res]))
return {'e':self.e, 'd':self.d, 'n':self.n, 'crypto':str(' '.join([str(i) for i in self.res]))}
def decrypt(self):
self.n=self.keys[0][1]
self.d=self.keys[1][0]
for i in self.text.split(' '):
print int(i)**int(self.d)%int(self.n)
self.res+=(self.lets[int(i)**int(self.d)%int(self.n)])
return ''.join([i for i in self.res])
while 1:
my=RSA()
my.text=raw_input('Enter text: ')
started=my.text
my.findPrimes()
result=my.encrypt()
my=RSA()
my.text=result['crypto']
my.keys=[[result['e'], result['n']], [result['d'], result['n']]]
l=my.decrypt()
if l!=started:
print "Started: %s"%started
print "e=%i d=%i n=%i"%(result['e'], result['d'], result['n'])
print "Ended: %s"%l
raw_input()
Заранее спасибо!