1、base64
看一下题目就知道这是一个base64加密,我们可以直接在网上搜索解密工具,也可以使用下面脚本进行解密
import base64
a = open('D:\\crypto1.txt','r')
s = a.read()
print(base64.b64decode(s))
flagcyberpeace{Welcome_to_new_World!}
2、Caesar
这一题也可以直接用解密工具,也可以使用以下脚本
a = open('D:\\caser.txt','r')
ciphertext = a.read()
b='abcdefghijklmnopqrstuvwxyz'
for key in range(26):
flag = ''
for i in ciphertext:
if i in b:
num = b.find(i)
num = num - key
if num<0:
num = num + len(b)
flag = flag + b[num]
else:
flag = flag + i
print('key %s :%s'%(key,flag))
得到flag
cyberpeace{you_have_learned_caesar_encryption}
3、Railfence
这一个是栅栏密码,看一下题目描述
题目描述:被小鱼一连将了两军,你心里更加不服气了。两个人一起继续往前走, 一路上杂耍卖艺的很多,但是你俩毫无兴趣,直直的就冲着下一个谜题的地方去了。 到了一看,这个谜面看起来就已经有点像答案了样子了,旁边还画着一张画,是一副农家小院的 图画,上面画着一个农妇在栅栏里面喂5只小鸡,你嘿嘿一笑对着小鱼说这次可是我先找到答案了。
题目中说喂5只小鸡,应该是5个栏数,但当我们使用正常的栅栏解密的话根本解不出来。这是一个普通栅栏密码脚本
#!/usr/bin/env python3
# 常见的栅栏解密
e = input('清输入要解密的字符串\n')
elen = len(e) # 计算字符串长度
field = []
for i in range(2, elen): # 做一个循环,从2开始到数字elen(字符串长度)
if elen % i == 0: # 计算那些数字能整除字符串长度
field.append(i) # 将能整出的数字加入到field里面
for f in field:
b = elen // f # 用字符串实际长度除以上面计算出能整出的数字f
result = {x: '' for x in range(b)}
for i in range(elen): # 字符串有多少位,就循环多少次
a = i % b
result.update({a: result[a] + e[i]}) # 字符串截断,并更新数据
d = ''
for i in range(b):
d += result[i]
print('分为' + str(f) + '栏时,解密结果为:' + d + '\n') # 输出结果,并开始下一个循环
但这样解不出来。后来查了一下栅栏密码还有一个www型的。而这个题就是www型的。
所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。
传统型
假如有一个字符串:123456789
取字符串长度的因数进行分组,假如key=3
1 2 3 \\分组情况,每三个数字一组,分为三组
4 5 6
7 8 9
然后每一组依次取一个数字组成一个新字符串:147258369 \\加密完成的字符串
解密方法:
遇到这种的栅栏加密的密文,解密的key值就是字符串的长度除以加密的key值 (de_key = len / key)再用de_key将密文字符串加密就可以得到原文字符串。
www型
同样一个字符串:123456789
key=3
1----5----9 \\让数字以W型组织,同样是三组,但每组的数量不一定相同
-2--4-6--8
--3----7--
加密密文:159246837
解密方法:
WWW型的加密密钥就不只能是字符串长度的因子,小于其长度的任何一个数都可能是其key值,所以第一步也是确定密钥。
字符串:159246837
假设 key = 3 \\具体情况下可以遍历key值,每个值都算一次
确定key值之后就可以确定字符串的排部方法,即:
分组1:1---2---3 \\ 将第一个行第一个数到第一行的下一个数看作为一部分(相同数字), 其长度为这部分长度len = 2key-2
分组2:-1-1-2-2 \\确定长度的排布之后将密文带入解密即可
分组3:--1---2-
原文:123456789
www型的可以直接在这个网站解密
http://www.atoolbox.net/Tool.php?Id=777
4、转轮机加密
直接上个脚本吧
import re
sss = '1: < ZWAXJGDLUBVIQHKYPNTCRMOSFE < 2: < KPBELNACZDTRXMJQOYHGVSFUWI < 3: < BDMAIZVRNSJUWFHTEQGYXPLOCK < 4: < RPLNDVHGFCUKTEBSXQYIZMJWAO < 5: < IHFRLABEUOTSGJVDKCPMNZQWXY < 6: < AMKGHIWPNYCJBFZDRUSLOQXVET < 7: < GWTHSPYBXIZULVKMRAFDCEONJQ < 8: < NOZUTWDCVRJLXKISEFAPMYGHBQ < 9: < XPLTDSRFHENYVUBMCQWAOIKZGJ < 10: < UDNAJFBOWTGVRSCZQKELMXYIHP < 11 < MNBVCXZQWERTPOIUYALSKDJFHG < 12 < LVNCMXZPQOWEIURYTASBKJDFHG < 13 < JZQAWSXCDERFVBGTYHNUMKILOP <'
m = 'NFQKSEVOQOFNP'
# 将sss转化为列表形式
content=re.findall(r'< (.*?) <',sss,re.S)
# re.S:DOTALL,此模式下,"."的匹配不受限制,可匹配任何字符,包括换行符
iv=[2,3,7,5,13,12,9,1,8,10,4,11,6]
print(content)
vvv=[]
for i in range(13):
index=content[iv[i]-1].index(m[i])
vvv.append(index)
print(vvv)
for i in range(0,26):
flag=""
for j in range(13):
flag += content[iv[j]-1][(vvv[j]+i)%26]
print(flag.lower())
flag就是这一个,没有花括号