写在前面
前几天学习到递归,发现递归的一个经典应用是可以翻转字符串,昨天又看到递归的一个经典难题【第k个语言符号】,在力扣上翻着答案想到凯撒密码,于是又突发奇想结合两者写个模仿凯撒密码的加密算法。于是便有了本文。
正文开始
-
加密原理:
1.将字符串原地翻转;
2.把第一个单词放到最后;
3.把字符串中所有字符的ASCII码加一; -
哈哈哈是不是很简单,这样就得到了一个加密的密钥,同样的基于此原理可以实现解密。
-
下面通过Python代码实现:
'''【递归的经典应用】翻转字符串'''
def reverse_str(strr):
if strr == '':
return strr
else:
return reverse_str(strr[1:]) + strr[0]
''' 加密算法 '''
def encrypt_str(strr):
list1 = reverse_str(strr).split() # 将字符串翻转并按单词切分为列表
list2 = list1[1:] # 将列表从第二个单词开始赋值给新列表,再把第一个单词插入最后
list2.append(list1[0])
strr = ' '.join(list2) # 将列表还原回字符串
str2 = ''
for s in strr:
str2 = str2 + chr(ord(s) + 1) # ord()把字符转换为对应的ASCII码,chr相反
print("你的密文是:",str2,sep='')
''' 解密算法 '''
def decrypt_str(strr):
str2 = '' # 先按字符串的ASCII码把字符串还原回来
for s in strr:
str2 = str2 + chr(ord(s) - 1)
list1 = str2.split() # 接着就是上面的反过程了
list2 = list1[:-1]
list2.insert(0,list1[-1])
strr = ' '.join(list2)
strr = reverse_str(strr)
print("密钥对应的明文是:",strr,sep='')
encrypt_str(input("请输入要加密的字符串:"))
decrypt_str(input("请输入密钥:"))
- 测试结果
中文测试:
请输入要加密的字符串:莫古134不打代码
你的密文是:砂令扔与542句莬
请输入密钥:砂令扔与542句莬
密钥对应的明文是:莫古134不打代码
英文测试:
请输入要加密的字符串:MoGu134 don't want to write code.
你的密文是:fujsx!pu!uobx!u(ope!542vHpN!/fepd
请输入密钥:fujsx!pu!uobx!u(ope!542vHpN!/fepd
密钥对应的明文是:MoGu134 don't want to write code.
写在后面
- 是不是很好玩?留给各位一个密钥,看有没有人可以破解出来hhh
"亇耼矦与――廊乊礽昰尲盵箁札旦迒朁