多级凯撒密码加密
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])
【讨论】:
这是有道理的。我今天没有时间,但明天我会把它放在一起,看看它是否按我想要的方式工作!谢谢!以上是关于多级凯撒密码加密的主要内容,如果未能解决你的问题,请参考以下文章