严格意义上来说,base64并不是一种加密算法,不过在不少网站的参数加密中都会使用到atob/btoa,因此将其做一个简单的实现。
base64使用64个字符来对信息进行编码,64个字符依次是ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 最后两个字符在不同协议中会有所不同,并且在实际需要加密的场景中,64个字符也有可能是乱序排列。
base64对信息进行编码依次为以下几个步骤:
1.将字符串逐个转变为其ASCII码值
2.将每个ASCII码值转变为8位二进制数值后连在一起
3.如果字符串的二进制数值连起来之后的长度不是6的整数倍,那么在后面补0直到是6的整数倍为止
4.从3得到的字符串中每6位作为一组,转为整型。
5.将4中得到的整型值作为索引,从64个字符中取出对应的字符
6.如果5得到的字符串长度不是3的整数倍,那么在后面补上=直到是3的整数倍为止。
python代码如下(不要在意变量命名)
1 s = '123abc' 2 p = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' 3 l = '' 4 for i in s: 5 asc = ord(i) 6 b = bin(asc) 7 if len(b)<10: 8 n = 10 - len(b) 9 b = '0'*n + b[2:] 10 l += b 11 if len(l)%6: 12 n = 6 - len(l)%6 13 l += '0'*n 14 encrypt = '' 15 for i in range(0, len(l), 6): 16 tt = l[i:i+6] 17 n = int(tt, 2) 18 encrypt += p[n] 19 if len(s)%3: 20 n = 3 - len(s) 21 encrypt += '='*n 22 print(encrypt)
最后使用base64模块对结果进行对比检验,结果吻合
注意!以上方案有一个非常严重的缺陷就是如果字符不在ASCII码表中应该如何处理!