【密码学】换表的base64+切割补位

1.题目:

import string
import re

keys = string.digits + '+/' + string.ascii_lowercase + string.ascii_uppercase


def encrypt(code):
    st = re.findall('.{3}', code)
    st.append(code[(len(st) * 3):])
    bins = ''
    for s in st:
        for i in s:
            bins += bin(ord(i)).replace('0b', '').rjust(8, '0')
    bt = re.findall('.{6}', bins)
    bt.append(bins[(len(bt) * 6):])
    res = ''
    for b in bt:
        res += keys[int(b.ljust(6, '0'), 2)]
    res += '=' * (4 - (len(bt) % 4))
    return res

encrypt("flag{********************************}") == "nALvnRGRmhqLbQ4Tnx4MaAeRchrvmAaRc38Pnxzyah5vmhiNmlO"

2.加密算法解读:

1)code为加密字符串,首先对code进行正则匹配切割为每3位一组,然后将不足3位的添加到st中,这一段相当于3等分切割后,将每一段的字符串进行ascii转码后再转为二进制,这边测试发现print出的二进制数字前面存在0b,所以将其替换掉,然后不足8位的进行右对齐后在最左面补齐8位。

st = re.findall('.{3}', code)
    st.append(code[(len(st) * 3):])
    bins = ''
    for s in st:
        for i in s:
            bins += bin(ord(i)).replace('0b', '').rjust(8, '0')

2)同样的方法,下面将所得的bins再次进行6等分分割,将不满足6位的二进制进行左对齐后在最后补0,之后转换位整型作为keys的第n位,最后的结果res累加并且再加上(4 - (len(bt) % 4))个等号=,但是可以看到给出的加密后的字符串没有等号,所以这句话在本题中并不重要。

bt = re.findall('.{6}', bins)
    bt.append(bins[(len(bt) * 6):])
    res = ''
    for b in bt:
        res += keys[int(b.ljust(6, '0'), 2)]
    res += '=' * (4 - (len(bt) % 4))

3.脚本解密即可,首先取出每一个字符串判断所在keys中的位置,要注意这里的keys进行了码表转换:

a = 'nALvnRGRmhqLbQ4Tnx4MaAeRchrvmAaRc38Pnxzyah5vmhiNmlO'
keys = '0123456789+/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
bt=''
flag=''
for i in a:
    for j in range(0,len(keys),1):
        if keys[j]==i:
            bt += bin(j)[2:].rjust(6, '0')
print bt
for i in range(0,len(bt),8):
    flag += chr(int(bt[i:i+8].ljust(8, '0'),2))
print flag

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值