问题是创建一个加密系统来加密字母和空格的字母。方法如下。
1)选择两个素数p和q。然后如下计算另外两个整数n和k。 n = p * q和k =(p-1)(q-1)。
2)选择另一个整数e,使得e与(p-1)和(q-1)相对为素数。[如果两个数的最大公约数为1,则它们相对素数。]
3)计算整数d作为满足(e * d-1)%k = 0
的最小数4)将两位数整数分配给英文字母。[例如:A-00,B-01,C-02,...,Z-25,'' - 26]
5)然后通过用数字替换字符将消息转换为数字。
6)对于每两位数计算c =(two_digits)^ e mod n。 [e与e相同]
7)这会创建秘密消息。
8)为了创建解密,消息从秘密文本中取两个数字,然后分别为每两个数字计算(two_crypted_digits)^ d mod n。
9)结果数字可以参考上述数字的两位数表示。
我的代码在我的笔记本电脑上运行没有任何错误,但当我尝试使用大学的虚拟编程实验室评估代码时,它会提到错误。
这是我的代码:
def read_input(file_name):
f=open(file_name,'r')
message=f.read().split('\n')
p=message.pop(0)
q=message.pop(0)
e=message.pop(0)
return p,q,e,message
def is_prime(number):
count=0
for i in range(1,number+1):
if number%i==0:
count=count+1
if count==2:
return True
else:
return False
def is_relatively_prime(number1,number2):
if is_prime(number2)==True:
x=min(number1,number2-1)
y=max(number1,number2)
a=[]
if x==number1:
for i in range(x,0,-1):
if x%i==0:
a.append(i)
for j in a:
if (number2-1)%j==0:
if j==1:
return True
else:
return False
break
else:
for i in range(number2-1,0,-1):
if (number2-1)%i==0:
a.append(i)
for j in a:
if number1%j==0:
if j==1:
return True
else:
return False
break
else:
return False
def get_digits_from_char(letter):
if letter == " ":
string_digits = '26'
else:
letter = letter.upper()
ascii_val = ord(letter)
temp_string_digits = ascii_val - 65
if temp_string_digits >=10:
string_digits = str(temp_string_digits)
else:
string_digits = '0'+str(temp_string_digits)
return string_digits
def char_from_digits(two_digits):
if two_digits == "26":
character = ' '
else:
temp_digits = int(two_digits)
ascii_digits = 65 + temp_digits
character = chr(ascii_digits)
return character
def get_d(e,k):
for i in range(2,(k+1)):
if ((e * i - 1) % k) == 0:
d = i
break
return d
def get_two_digit_representation(message):
string = ''
for letter in message:
string = string + get_digits_from_char(letter)
return string
def get_secret_message(digit_message,e,n):
secret_message=''
a=''
b=''
digmsg_lis=list(digit_message)
for i in range(len(digit_message)/2):
a=digmsg_lis.pop(0)
b=digmsg_lis.pop(0)
c=a+b
sec_digit=(int(c)**int(e))%int(n)
if sec_digit<10:
sec_digit='0'+str(sec_digit)
secret_message+=sec_digit
else:
secret_message+=str(sec_digit)
return secret_message
def get_digit_message(secret_message,d,n):
digit_message=''
a=''
b=''
secdig_lis=list(secret_message)
for i in range(len(secret_message)/2):
a=secdig_lis.pop(0)
b=secdig_lis.pop(0)
c=a+b dig=(int(c)**int(d))%int(n)
if dig<10:
dig='0'+str(dig)
digit_message+=dig
else:
digit_message+=str(dig)
return digit_message
def write_output (file_name,message_list):
f=open(file_name,'w') #open file as a writemode
for x in message_list:
f.write(str(x)+'\n')
p, q, e, messages = read_input(raw_input())
while is_prime(int(p)) and is_prime(int(q)) and is_relatively_prime(int(e),(int(p))) and is_relatively_prime(int(e),(int(q))):
n = int(p)*int(q)
k = (int(p)-1)*(int(q)-1)
d = get_d(int(e),k)
messages_list = []
for message in messages:
messages_list.append(get_secret_message(get_two_digit_representation(message),e,n))
write_output('Output.txt',messages_list)
break
以下是错误消息:
Traceback (most recent call last):
File "runProgram.py", line 12, in <module>
import test
File "/home/p13312/test.py", line 141, in <module>
messages_list.append(get_secret_message(get_two_digit_representation(message),e,n))
File "/home/p13312/test.py", line 102, in get_secret_message
sec_digit=(int(c)**int(e))%int(n)
ValueError: invalid literal for int() with base 10: '0-'