BUUCTF之Crypto题目:[BJDCTF2020]这是base??

一  在做题之前我们先了解一下什么是base64编码

base64编码类似ASCLL编码

ASCLL使用7个二进制位来表示一个字符,7个二进制位刚好可以表示128个不同的字符,如图

而base64编码使用6个二进制位表示一个字符

6个二进制位可以表示64个不同的字符,如图

现在我们来解释base64编码,我们先将一个对象先由ascii码转化为二进制(7个二进制一组),然后再将它们以6个为一组(不足用0补齐),然后转化为十进制,再通过十进制的数字和base64的码值表相互转换得到对应的字符,最后的base64的结果需要是4的倍数,不足用=补齐。

二 解题

由题目可知这里重新定义了base64,(如这里的0表示j,而原本的0表示A)

所以通过base64的原理写出代码:

import base64

dict={0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}

a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='    #标准表

c='FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw'

ds=''  #把dict转换成字符串方便处理
for i in range(65):
    ds+=dict[i]

l=[]
for i in range(len(c)):
    l.append(ds.index(c[i]))  #无论换不换表,base64变换本身产生的6位二进制数对应的十进制数是不变的,这里就是找到密文c的每个字符在dict表中键值

#print(l)  #l中存的是索引值(下标数字)

m1=''
for ll in l:
    m1+=a[ll]  #找到l中所存的每个数字在标准的base64加密表中所对应的字符
print(m1)  #m1是标准base64表编码结果

m2=base64.b64decode(m1)  #直接调用函数恢复出明文
print(m2)

得到结果

将BJD换为flag即可。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值