base64加解密原理
转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
现将字符串转化为二进制
for ch in'ABC':
(bin(ord(ch))[2:]).zfill(8)
六位六位取
>>>for ch in'ABC':
string+=(bin(ord(ch))[2:]).zfill(8)
base64=[]
for i in range(4)
转换
>>>binascii.unhexlify('454647')
b'EFG'
>>>int('a',16)
16表示进制
10
binstr='454647'
for ch in binstr:
(bin(int(ch,16)))[2;].zfill(4)
练习题目
解题——base64 CTF
flag='nctf'
total=3**10
import base64 as b64
alg={'0':lambda x:b64.b16decode(x),'1':lambda x:b64.b32decode(x),'2':lambda x:b64.b64decode(x)}
temp=''
for i in range(total):
k=i
for j in range(10):
cipertext=(alg[str(k%3)](cipertext)
k//3
if flag in cipertext:
print'OK'
注:参数validate默认为False。如果它为True时,base64模块在进行解码前会先检查s中是否有非base64字母表中的字符,如果有的话则抛出错误binascii.Error: Non-base64 digit found