【问题标题】:Vigenère cipher: How to make it so that the encrypted message appears in a print function?Vigenère cipher:如何使加密消息出现在打印功能中?
【发布时间】:2018-06-26 22:23:49
【问题描述】:

我也是编码和 Python 的初学者。现在我正在处理Vigenère cipher

我已经够用密钥加密消息了。我在代码的每一部分都添加了 cmets 以供参考。这是我的代码。我的问题在代码下方。

# Ask user for message
print('type a message.')
message = input()

# print a white line for neatness
print()

# ask user for a key
print('give your key')
key = input()

# create a range with the length of the message
ran = range(len(message))

# Iterate though the range and therefor show all the letters
for i in ran:
    # get current letters for this iteration
    currentLetter = message[i]
    currentKeyLetter = key[i % len(key)]

    # Get corresponding numbers
    numberLetter = ord(currentLetter)
    numberKeyLetter = ord(currentKeyLetter)

    # Add two letters
    sumTwoLetters = numberLetter + numberKeyLetter

    # Get the number of the encrypted letter
    newNumberLetter = sumTwoLetters % 128
    # Get the encrypted number based on number
    newLetter = chr(newNumberLetter)

    # print out the result
    printText = currentLetter + "(" + str(numberLetter) + ") + "
    printText += currentKeyLetter + "(" + str(numberKeyLetter) + ") = "
    printText += newLetter + "(" + str(newNumberLetter) + ")"
    print(printText)

代码要求用户输入消息和密钥。 ran 变量创建一个包含消息长度的范围。

之后,for 循环使用 ordchr 使用密钥加密消息

加密后的字母存储在变量newLetter中 用户可以看到程序对printText做了什么

但是,我的问题是:如何使加密文本出现在单个字符串上。我试图循环进行。我失败得很惨(以至于我不想表现出来)

有人对如何使加密消息显示在单行文本中有任何建议吗?

【问题讨论】:

    标签: python encryption python-3.6 vigenere


    【解决方案1】:

    您可以在listjoin() 中收集结果,然后在for 循环之后将它们全部放入一个字符串中。请参阅 cmets 了解更改。

    ...
    results = []  # ADDED.
    
    # Iterate though the range and therefor show all the letters
    for i in ran:
        # get current letters for this iteration
        currentLetter = message[i]
        currentKeyLetter = key[i % len(key)]
    
        # Get corresponding numbers
        numberLetter = ord(currentLetter)
        numberKeyLetter = ord(currentKeyLetter)
    
        # Add two letters
        sumTwoLetters = numberLetter + numberKeyLetter
    
        # Get the number of the encrypted letter
        newNumberLetter = sumTwoLetters % 128
        # Get the encrypted number based on number
        newLetter = chr(newNumberLetter)
    
        # print out the result
        printText = currentLetter + "(" + str(numberLetter) + ") + "
        printText += currentKeyLetter + "(" + str(numberKeyLetter) + ") = "
        printText += newLetter + "(" + str(newNumberLetter) + ")"
        results.append(printText)  # PUT IN results LIST INSTEAD OF PRINTING.
    
    print(''.join(results))  # ADDED.
    

    【讨论】:

    • 谢谢。我会玩这个。
    • 不客气。请注意,您可能希望在 printText 字符串中添加一些换行符 ("\n") 以使放入 results 列表和 join()ed 的内容更具可读性。另请阅读What should I do when someone answers my question?
    【解决方案2】:

    有两种简单的方法。要么(1)在循环内构建字符串并在循环外打印,要么(2)在循环中移动时打印每个字符,但没有换行符,在循环后加上一个换行符。

    尝试其中一种方法,如果您需要更多帮助,请添加评论。亲自尝试会学到更多!

    【讨论】:

    • 谢谢。我会试试看。我会及时通知你。
    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 2019-07-18
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多