ValueError:基数为10的int()的无效文字:'0-'

时间:2018-04-23 13:42:13

标签: python valueerror

问题是创建一个加密系统来加密字母和空格的字母。方法如下。

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-'

0 个答案:

没有答案