2015-06-11 18 views
-2

我写的代码是Vignere Cipher加密程序,它使用关键字来加密消息。我写了这段代码,当我完成它的时候,我运行它,它完成了它应该做的所有事情,但输出了加密的消息。见我下面的代码,任何帮助感激地接受:我的程序运行但它不输出加密的消息

ans = False 
print(""" *****Hello. Welcome to the Vignère Cipher Encryption Program***** 
    ***This program uses a keyword that is repeated until it 
    matches the same lenght of the message and then adds its 
    numerical value to the numerical value of the message and 
    outputs the encrypted message in alpha. 
    Please press: 
    E to Encrypt 
    D to Decrypt 
    or double tap enter to quit. 
    """) 

ans=input("What would you like to do now???") 

if ans == "E": 
    plaintext = input("Please enter a message to be encrypted: ").upper() 
    keyword = input("Please enter a keyword to be used to encrypt a message (alpha only): ").upper() 
    ciphered = " " 
    for i in range (len(plaintext)): 
     char = plaintext[i] 
     alphakeywordvalue = ord(keyword[i%len(keyword)]) - ord("A")+1 
     if char.isupper(): 
      if ans == "E" : 
       value = ord(char) + alphakeywordvalue 
       if value > ord("Z"): 
        value -= 26 
        print ("Your encrypted text is:", ciphered) 


elif ans == "D": 
    plaintext = input("Please enter a message to be dencrypted: ").upper() 
    keyword = input("Please enter a keyword to be used to dencrypt a message (alpha only(make sure that it is the same keyword used to encrypt the message)): ").upper() 
    ciphered = " " 
    for i in range (len(plaintext)): 
     char = plaintext[i] 
     alphakeywordvalue = ord(keyword[i%len(keyword)]) - ord("A")+1 
     if char.isupper(): 
      if ans == "D" : 
       value = ord(char) - alphakeywordvalue 
       if value <ord("A"): 
        value += 26 
       ciphered += chr(value) 
       print ("Your decrypted text is:", ciphered) 
+2

在加密情况下,'加密'永远不会被修改,它的值总是''“'。 – stellasia

+0

您的打印位于for循环内。如果ans ==“E”(内部无用),则不需要测试两次。 –

回答

2

,怎么会打印加密邮件,加密程序不会从一个空字符串改变ciphered

if ans == "E": 
     plaintext = input("Please enter a message to be encrypted: ").upper() 
     keyword = input("Please enter a keyword to be used to encrypt a message (alpha only): ").upper() 
1)-> ciphered = " " 
     for i in range (len(plaintext)): 
      char = plaintext[i] 
      alphakeywordvalue = ord(keyword[i%len(keyword)]) - ord("A")+1 
2)->  if char.isupper(): 
3)->   if ans == "E" : 
        value = ord(char) + alphakeywordvalue 
        if value > ord("Z"): 
         value -= 26 
4)->     print ("Your encrypted text is:", ciphered) 
  1. ciphered设置为空字符串,则从来没有改变过。
  2. 你总是知道char是上,因为你所做的所有明文上()
  3. 你知道ans == "E",因为你测试了它早些时候
  4. 此打印()是迄今为止缩进它试图通过循环打印每一次
3

这不是一种很好的书写方式。非常破旧难读。如果需要,您应该为各个部分创建方法并创建一个单独的main()类部分以与用户进行交互。发动机应该隐藏,车身应该打磨。保持它们分开。是的,不要重复自己

好吧,这是我重写的代码。重要部分包含评论。错误在后面解释..

def encrypt(message, key, direction='E'): 
    # Look here. There are three arguments. Third one takes 'E' to encrypt 
    # and anything else to decrypt. You can modify to handle more cases 

    ciphered = "" # Initialize. You did it almost well 
    for i in range (len(message)): 
     char = message[i] 
     alphakeywordvalue = ord(key[i%len(key)]) - ord("A")+1 # Perfect. We took the key 
     if direction=='E': # To encrypt 
      value = ord(char) + alphakeywordvalue 
     else: # To decrypt 
      value = ord(char) - alphakeywordvalue 
     ciphered += chr(value) # chr is the inverse of ord. It gets the character back 
     # You missed this line 
    return ciphered 

就是这样。现在您可以编写代码与用户或其他模块进行交互。这里有一个样本测试: -

message = "Hello World" 
key = "abc" 
print "ORIGINAL : "+message 

encoded_message = encrypt(message, key, 'E') 
print "ENCRYPTED : "+encoded_message 

plain_message = encrypt(encoded_message, key, 'D') 
print "DECRYPTED : "+plain_message 

下面是输出: enter image description here

现在,您可以编辑这个方法来处理更多的情况下,像出的ASCII字符范围等

相关问题