加密大写字母 python vigenere

Posted

技术标签:

【中文标题】加密大写字母 python vigenere【英文标题】:encrypting upper-case letters python vigenere 【发布时间】:2015-11-03 19:39:57 【问题描述】:

我在加密大写字母时遇到问题,例如如果消息是 COMPUTING IS FUN 关键字是 GCSE 我应该得到 JRFUBWBSN LL KBQ 但我的实际结果是 xftipkpgb zz ype。这个结果既没有正确的字母也没有大写。任何帮助表示赞赏

                    message = input('\nenter message: ')
                    keyword = input('enter keyword: ')
                    def chr_to_inta(char):
                        return 0 if char == 'Z' else ord(char)-64
                    def int_to_chra(integer):
                        return 'Z' if integer == 0 else chr(integer+64)
                    def add_charsa(msg, key):
                        return int_to_chr(( chr_to_int(msg) + chr_to_int(key)) % 26 )


                    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(msg, key):
                        return int_to_chr(( chr_to_int(msg) + chr_to_int(key)) % 26 )

                    def vigenere(message, keyword):

                        keystream = cycle(keyword)
                        new = ''
                        for msg in message:
                            if msg == ' ': # adds a space
                                new += ' '
                            elif 96 < ord(msg) < 123: # if lowercase
                                new += add_chars(msg, next(keystream))

                            else: # if uppercase
                                new += add_charsa(msg, next(keystream))

                        return new

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

【问题讨论】:

我们不是已经这样做了吗...***.com/questions/33442220/… 上次我们加了空格,现在我需要做大写字母。我已经尝试添加三个与其他函数类似的新函数,但现在它们返回一个大写的“Z”而不是小写的,它不起作用,我一直在寻找想法 首先,add_chars 有两个定义,add_charsa 没有定义。其次,你需要确保 add_charsa 调用你的新函数而不是你的旧函数,即它应该 return int_to_chra(( chr_to_inta(msg) + chr_to_inta(key)) % 26 ) 我的错,从 python 复制时出错了 更改return 语句以反映您的新功能,您应该会很好 【参考方案1】:

因为你似乎没有明白我在说什么:

def add_charsa(msg, key):
    return int_to_chr(( chr_to_int(msg) + chr_to_int(key)) % 26 )

是你目前拥有的。有了这个,你会得到不好的输出:

>>> vigenere('COMPUTING IS FUN','GCSE')
'xftipkpgb zz ype'

这是因为您没有更改此函数的 return 语句来调用新的大写函数。如果将return语句更改为:

def add_charsa(msg, key):
    return int_to_chra(( chr_to_inta(msg) + chr_to_inta(key)) % 26 )
#notice the change in function calls from int_to_chr -> int_to_chra, and chr_to_int -> chr_to_inta

然后你会得到预期的:

>>> vigenere('COMPUTING IS FUN','GCSE')
'JRFUBWBSN LL KBQ'

值得知道的是,如果您的密钥混合了大小写字母,这将不起作用。很好。我会改为将您的 keystream 更改为:keystream = cycle(keyword.lower()) 然后您的函数将是:

def add_charsa(msg, key):
        return int_to_chra(( chr_to_inta(msg) + chr_to_int(key)) % 26 )
    #notice the call to chr_to_int(key) because key will always be lower case

【讨论】:

以上是关于加密大写字母 python vigenere的主要内容,如果未能解决你的问题,请参考以下文章

jmu-python-凯撒密码加密算法,谢谢

有没有一种加密算法,把纯数字的加密成16位的密文,字母与数字组合的加密成32位的???

7-30 jmu-python-凯撒密码加密算法 (10 分)

Python实现英文文章加密传送,收到后进行解密

day5-Python学习笔记random模块,时间模块,加密模块

基于python语言实现凯撒加密