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