ASCII 是用128(2的8次方)个字符,对二进制数据进行编码的方式
base64编码是用64(2的6次方)个字符,对二进制数据进行编码的方式
base32就是用32(2的5次方)个字符,对二进制数据进行编码的方式
base16就是用16(2的4次方)个字符,对二进制数据进行编码的方式
这里举一个百度百科里base64的例子(base原理可以自己问一下度娘~&*&)
转码过程例子:
3*8=4*6
内存1个字节占8位
转前: s 1 3
先转成ascii:对应 115 49 51
2进制: 01110011 00110001 00110011
6个一组(4组) 011100110011000100110011
然后才有后面的 011100 110011 000100 110011
然后计算机是8位8位的存数 6不够,自动就补两个高位0了
所有有了 高位补0
科学计算器输入 00011100 00110011 00000100 00110011
得到 28 51 4 51
查对下照表 c z E z
加密程序:
#Python3.6
from base64 import *
import random
basecode={
'16':lambda x:b16encode(x),
'32':lambda x:b32encode(x),
'64':lambda x:b64encode(x)
} #定义一个字典函数(三个关键字)
flag=input('Please input a string:').encode()
#注意要加 encode();input()输入的是字符串;而base加解密函数要接受byte类型
i=0
while(i<10): #用三种加密函数随机加密10次
order=random.choice(['16','32','64'])
flag=basecode[order](flag)
i+=1
with open("text.txt",'w') as fp:
fp.write(flag.decode())
这段程序对要加密的字符串用base64\base32\base16 的三种加密函数进行随机加密。
加密效果
解密程序:
#Python3.6
from base64 import *
import binascii
'''因为对用base64加密的数据用base32或base16解密几乎是不可能成功的,同base32;
所以依次尝试使用base16、base32、base64进行解密'''
def decode_fun(code):
try:
decode=b16decode(code)
return decode
except binascii.Error:
pass
try:
decode=b32decode(code)
return decode
except binascii.Error:
pass
try:
decode=b64decode(code)
return decode
except binascii.Error:
pass
def main():
with open('text.txt','r') as fp:
code=fp.read().encode()
i=0
while(i<10):
code=decode_fun(code)
i+=1
print('The string is:'+ code.decode())
if __name__ == '__main__':
main()
解密效果:成功得到原文
注意:这两个程序都是在3.6环境下使用的,要注意encode(),和decode()进行字符串和字节类型的转换。