多级凯撒密码加密

Posted

技术标签:

【中文标题】多级凯撒密码加密【英文标题】:Multi level Caesar Cipher encryption 【发布时间】:2014-04-11 07:31:30 【问题描述】:

所以我正在研究麻省理工学院开放课件的问题集 4。我尝试参考他们的解决方案,但由于某种原因它不存在。他们发布了错误的答案。所以,这是我的问题。

它应该做什么的描述是这样的:“这个函数接受一个字符串文本和一个元组移位列表。移位中的元组表示移位的位置,以及移位本身。例如( 0,2) 表示移位开始于字符串中的位置 0,并且是 2 的凯撒移位。此外,移位是分层的。这意味着一组移位 [(0,2), (5, 3)]将首先对整个字符串应用 2 的凯撒位移,然后从字符串中的第 6 个字母开始应用 3 的凯撒位移"

这就是我写的:

def apply_shifts(text, shifts):
    encryptedText = text
    for t in shifts:
        encryptedText = apply_shift(encryptedText[t[0]:len(encryptedText)], t[1])
        print encryptedText
    return encryptedText

所以,我知道我是在告诉它每次遍历循环时替换我引用的变量。我只是不知道如何设置它,所以我没有这个问题。这是我的测试:

print apply_shifts("Do androids Dream of Electric Sheep?", [(0,6), (3, 18), (12, 16)])
print 'JufYkaolfapxQdrnzmasmRyrpfdvpmEurrb?'

第一个打印语句是我的测试,第二个是输出应该是什么。有什么想法吗?

【问题讨论】:

apply_shift 函数将 (text, shift) 作为参数。它使用我编写的另一段代码来执行实际的班次。没有问题。 嗯...也许我遗漏了什么,但我看不出你在哪里描述了你的问题 【参考方案1】:

这是少数几个我可能会推荐使用递归函数的函数之一!

import string

def apply_shift(text,shift):
    ciphertext = string.ascii_uppercase+string.ascii_lowercase
    cipherdict = char:idx for idx,char in enumerate(string.ascii_uppercase+string.ascii_lowercase)
    loop_amt = len(ciphertext)

    start,shift = shift
    text = list(text)
    for idx,char in enumerate(text[start:]):
        idx = start+idx
        if char not in cipherdict: continue
        else: text[idx] = ciphertext[(cipherdict[char]+shift)%loop_amt]
    return ''.join(text)

def apply_shifts(text,shifts):
    start,shift = shifts.pop(-1)
    if shifts:
        return apply_shifts(apply_shift(text,(start,shift)),shifts)
    else:
        return apply_shift(text,(start,shift))

【讨论】:

我曾想过尝试一种递归方法,但我无法弄清楚如何实现它。谢谢!【参考方案2】:

在每次迭代中将 apply_shift 的结果添加到未移位的部分:

+ 运算符连接字符串

您可以使用切片短语法从开头 s[:i] 或结尾 s[i:] 获取字符串的切片

encryptedText = encryptedText[:t[0]] + apply_shift(encryptedText[t[0]:], t[1])

【讨论】:

这是有道理的。我今天没有时间,但明天我会把它放在一起,看看它是否按我想要的方式工作!谢谢!

以上是关于多级凯撒密码加密的主要内容,如果未能解决你的问题,请参考以下文章

凯撒密码实现英文短句的加解密

凯撒加密算法(最简单的对称加密)

凯撒密码加密解密--JAVA实现(基础)

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

Go 语言入门很简单:Go 实现凯撒密码

加密给定的文本字符串 - 凯撒密码 [关闭]