RosettaCodeData/Task/RSA-code/Python/rsa-code-2.py

187 lines
5.0 KiB
Python

import random
import time
def decrypt(F,d):
if d == 0:
return 1
if d == 1:
return F
w,r = divmod(d,2)
if r == 1:
return decrypt(F*F%n,w)*F%n
else:
return decrypt(F*F%n,w)
def correct():
for i in range(len(C)):
if len(str(P[i]))%2 !=0:
y = str(0)+str(P[i])
P.remove(str(P[i]))
P.insert(i,y)
def cipher(b,e):
if e == 0:
return 1
if e == 1:
return b
w,r = divmod(e,2)
if r == 1:
return cipher(b*b%n,w)*b%n
else:
return cipher(b*b%n,w)
def group(j,h,z):
for i in range(int(j)):
y = 0
for n in range(h):
y += int(numP[(h*i)+n])*(10**(z-2*n))
X.append(int(y))
def gcd(a, b):
while b != 0:
(a, b) = (b, a%b)
return a
letter = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q",
"r","s","t","u","v","w","x","y","z",",",".","!","?"," "]
number = ["01","02","03","04","05","06","07","08","09","10","11","12","13",
"14","15","16","17","18","19","20","21","22","23","24","25","26","27",
"28","29","30","31"]
print( '\n' )
def Decrypt():
#decrypts an encoded message
global m,P,C,x,h,p,Text,y,w
P = []
C = str(input("Enter ciphertext blocks:"))
C = C.lstrip('[')
C = C.rstrip(']')
C = C.split(',')
for i in range(len(C)):
x = decrypt(int(C[i]),d)
P.append(str(x))
correct()
#print(P)
h = len(P[0])
p = []
for i in range(len(C)):
for n in range(int(h/2)):
p.append(str(P[i][(2*n):((2*n)+2)]))
Text = []
for i in range(len(p)):
for j in range(len(letter)):
if str(p[i]) == number[j]:
Text.append(letter[j])
PText = str()
for i in range(len(Text)):
PText = PText + str(Text[i])
print("Plaintext is:", PText)
def Encrypt():
#encrypts a plaintext message using the current key
global plaintext,numP,q,j,z,X,C
plaintext =(input("Enter Plaintext :"))
plaintext = plaintext.lower()
numP = []
for i in range(len(plaintext)):
for j in range(len(letter)):
if plaintext[i] == letter[j]:
numP.append(number[j])
h = (len(str(n))//2)-1
q = len(numP)%h
for i in range(h-q):
numP.append(number[random.randint(0,25)])
j = len(numP) / h
#print(numP)
X = []
z = 0
for m in range(h-1):
z+=2
group(j,h,z)
k = len(X)
C = []
for i in range(k):
b = X[i]
r = cipher(b,e)
C.append(r)
print("Ciphertext:",C)
print("Number of Ciphertext blocks:",len(C))
def setup():
global n,e,d
while True:
try:
n = int(input(" Enter a value for n :"))
if n > 2:
break
except ValueError:
print('please enter a number')
while 1!=2 :
try:
e = int(input(" Enter a value for e :"))
if e >= 2:
break
except ValueError:
print('please enter a number')
while True:
try:
d = int(input(" Enter a value for d. If d unknown, enter 0 :"))
if d >= 0:
break
except ValueError:
print('please enter a number')
#setup()
n = 2537
e = 13
d = 937
print("To redefine n,e, or d, type 'n','e',... etc.")
print("To encrypt a message with the current key, type 'Encrypt'")
print("To decrypt a message with the current key, type 'Decrypt'")
print("Type quit to exit")
print( '\n' )
print( '\n' )
mm = str()
while mm != 'quit':
mm = input("Enter Command...")
if mm.lower() == 'encrypt':
Encrypt()
elif mm.lower() == 'decrypt':
Decrypt()
elif mm.lower() == 'n':
try:
print('current n = ',n)
n = int(input(" Enter a value for n :"))
except ValueError:
print('That is not a valid entry')
elif mm.lower() == 'help':
print("To redefine n,e, or d, type 'n','e',... etc.")
print("To encrypt a message with the current key, type 'Encrypt'")
print("To decrypt a message with the current key, type 'Decrypt'")
print("Type quit to exit")
print( '\n' )
print( '\n' )
elif mm.lower() == 'e':
try:
print('current e = ',e)
e = int(input(" Enter a value for e :"))
except ValueError:
print('That is not a valid entry')
elif mm.lower() == 'd':
try:
print('current d = ',d)
d = int(input(" Enter a value for d :"))
except ValueError:
print('That is not a valid entry')
else:
if mm != 'quit':
ii= random.randint(0,6)
statements = ["I sorry, Dave. I'm afraid i can't do that","I'm begging you....read the directions","Nah ahh ahh, didnt say the magic word","This input is....UNACCEPTABLE!!","Seriously....was that even a word???","Please follow the directions","Just type 'help' if you are really that lost"]
print(statements[ii])