期末事情有点多,新年放一波完整wp
Death_Chain
夏多密码,对照翻译即可,参考链接如下
https://www.33iq.com/group/topic/242254/
PS:所有的变换都要以原图中的为准,而不是基于上一次变换
先有什么
对着键盘画圈圈
检查符号
摩斯密码,写个替换脚本再翻译即可
# -*- coding: utf-8 -*-
# __author__: Pad0y
import re
s = "o00。o。o0oo。0o0o。000。00。o。0。000。ooo0。o。0o。oo0。ooo。0o0o。0。oo0o"
a = ["。", "o","0"]
b = [" ", ".","-"]
dic = dict(zip(a,b))
pattern = re.compile('(' + '|'.join(a) + ')')
s = pattern.sub(lambda a:dic[a.group()], s)
print(s)
德军密码
费娜姆密码,密文每7个一组,与密钥进行异或处理,详情看这里,脚本如下
# coding=utf-8
# __author__: Pad0y
import re
def b2ten(string):
split = re.findall(r'.{7}', string)
ten = []
for i in split:
ten.append(int(i, base=2))
return ten
bin_t= '0000011000000000101010110111001011000101100000111001100100111100111001'
private_key= 'helloworld'
b2ascii = map(ord, private_key)
a_ten = b2ten(bin_t)
c = []
for i in range(len(a_ten)):
c.append(a_ten[i] ^ b2ascii[i])
print ''.join(map(chr, c))
密钥生成
找个工具算下
规则很公平
tips是公平的游戏规则,想到了Playfair密码,也是一种古典密码,基于字符替换的密码。参考如下
Playfair算法是基于一个5*5的字母矩阵,
题目中CGOCPMOFEBMLUNISEOZY是密文,
关键词矩阵题目已经构造好了,比较省事。
- 矩阵构造规则
按从左到右、从上到下顺序
填入关键词的字母(去除重复字母)后
将字母表其作余字母填入
- 加密规则
Playfair加密算法是先将明文按两个字母一组进行分组,然后在矩阵中找对应的密文。
取密文的规则如下:
- 若明文出现相同字母在一组,则在重复的明文字母中插入
一个填充字母(eg:z)进行分隔后重新分组(eg: balloon被重新分组为ba lz lo on)
- 若分组到最后一组时只有一个字母,则补充字母z
若明文字母在矩阵中同行,则循环取其右边下一个字母为密文
(矩阵最右边的下一个是最左边的第一个)(eg: ar被加密为RM)
- 若明文字母在矩阵中同列,则循环取其下边下一个字母为密文
(矩阵最下边的下一个是最上边的第一个)(eg: mu被加密为CM)
- 若明文字母在矩阵中不同行不同列,则取其同行且与同组另一字
母同列的字母为密文(eg: hs被加密为BP,ea被加密为IM或JM)
为了方便用numpy构造下5*5的关键词矩阵(其实是懒的画图)
# coding=utf-8
# __author__: Pad0y
import numpy as np
s = 'CULTREABDFGHIKMNOPQSVWXYZ'
print(np.array(list(s)).reshape(5, 5))
"""
手动解密对照如下,python两行代码的事情(pycipher)
[['C' 'U' 'L' 'T' 'R']
['E' 'A' 'B' 'D' 'F']
['G' 'H' 'I' 'K' 'M']
['N' 'O' 'P' 'Q' 'S']
['V' 'W' 'X' 'Y' 'Z']]
"""
# 从矩阵可以看出密钥是CULTRE
# CG OC PM OF EB ML UN IS EO ZY
栅栏加密
根据题目描述是分成了3根栅栏,将密文每3个字符一组,将第一列与第二列换一下位置(用notepad/sublime的列编辑模式很容易做到),得到如下
duJ
mZl
V2Y
uVW
dkx
XXs
N2e
D1V
V59
EXs
Z2d
7ZW
SlN
Vbr
9me
DNS
alF
GX9
F1
然后将所得到的字符串从上到下从左至右组合在一起再base64解码即可
numpy很容易就可以实现转换过程,解密脚本如下
# -*- coding: utf-8 -*-
# __author__: Pad0y
import numpy as np
import base64
s = 'udJZml2VYVuWkdxXXs2Ne1DV5V9XEs2ZdZ7WlSNbVrm9eNDSlaFXG91F*' # 字符串末尾补充*,构造19*3的矩阵
arr = np.