vigenere密码中的itertools循环导致空间问题python

Posted

技术标签:

【中文标题】vigenere密码中的itertools循环导致空间问题python【英文标题】:itertools cycle in vigenere cipher causing problems with spaces python 【发布时间】:2015-10-30 18:00:44 【问题描述】:

在我的 vigenere 密码代码中,我使用来自 itertools 的循环来循环访问关键字。这很有效,直到我在消息中使用空格,因为它加密了空间,因此使加密错误。这是代码。

    message = input('enter message: ')
    keyword = input('enter keyword: ')
    def chr_to_int(char):
        return 0 if char == 'z' else ord(char)-96
    def int_to_chr(integer):
        return 'z' if integer == 0 else chr(integer+96)
    def add_chars(a, b):
        return int_to_chr(( chr_to_int(a) + chr_to_int(b)) % 26 )
    def vigenere(message, keyword):
        keystream = cycle(keyword)
        new = ''
        for msg, key in zip(message, keystream):
            if msg == ' ':
                new += ' '
            else:
                new += add_chars(msg, key)
        return new

    new = vigenere(message, keyword)
    print('your encrypted message is: ',new)

我认为解决这个问题的方法是循环使用与消息长度相同的空间,这样它就会继续到下一个字母,就好像空间不存在一样。我不知道该怎么做。

示例:

消息:vignere cipher 关键字:qwerty

加密消息(应该是什么):mflahdib hajgvo

【问题讨论】:

【参考方案1】:

由于cycle 返回一个可迭代对象,您可以改用next 而不是 zip,这样它只会在被询问时调用下一个字符:

>>> def vigenere(message, keyword):
        keystream = cycle(keyword)
        new = ''
        for msg in message:
            if msg == ' ':
                new += ' '
            else:
                new += add_chars(msg, next(keystream))
        return new

>>> new = vigenere('computing is fun', 'gcse')
>>> new
'jrfubwbsn ll kbq'

编辑:每个 OP 请求,使用 zip 和 offset 变量

>>> def vigenere(message, keyword):
        keystream = cycle(keyword)
        new = ''
        offset = 0
        for msg, key in zip(message,keystream):
            if msg == ' ':
                new += ' '
                offset += 1
            else:
                new += add_chars(msg, keyword[keyword.index(key)-offset])
        return new
>>> new = vigenere('computing is fun', 'gcse')
>>> new
'jrfubwbsn ll kbq'

【讨论】:

谢谢它很好用,但我想知道是否可以用 zip 来实现,如果你不能不用担心的话。 嗯,关于 zip 的事情是它会迭代两个列表,所以它肯定会添加一些多余的东西,但我添加了一个编辑,其中 zip 可以使用偏移量 var 工作

以上是关于vigenere密码中的itertools循环导致空间问题python的主要内容,如果未能解决你的问题,请参考以下文章

使用修改后的 Vigenere 密码算法,解密不会导致原始输入 [关闭]

Vigenere 密码解码无法正常工作

java中的ASCII Vigenere密码实现

python中的Vigenere密码[关闭]

用itertools.product简化嵌套for循环

Python 中的 Vigenere 密码