-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)
4

2 回答 2

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

这是输出: 在此处输入图像描述

现在您可以编辑此方法以处理更多情况,例如超出 ascii 范围的字符等。

于 2015-06-11T07:40:24.283 回答
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 是大写的,因为你把所有的明文都写成了 upper()
  3. 你知道ans == "E"是因为你之前测试过
  4. 这个 print() 到目前为止是缩进的,它每次都尝试通过循环打印
于 2015-06-11T07:32:20.387 回答