攻防世界crypto

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就是这一个,没有花括号
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值