繁体   English   中英

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

[英]itertools cycle in vigenere cipher causing problems with spaces python

在我的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密码关键字:qwerty

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

由于cycle返回一个可迭代的对象,因此您可以改用next而不是zip,以便仅在询问时调用下一个char:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM