zoukankan      html  css  js  c++  java
  • 常见“加密”算法之 base64

    严格意义上来说,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码表中应该如何处理!

  • 相关阅读:
    再谈反射
    XmlElement和XmlNode的区别
    几个常用的集合类的使用
    node.js 练习3 调用函数
    ioc 的好文章 转自 GavinJun
    sqlserver 使用小技巧总结
    node.js 练习2 (调用函数)
    c# 面向对象基础
    linq 和 lmabda 表达式 的用法 和优劣 转自 农码一生
    memcache 基本操作
  • 原文地址:https://www.cnblogs.com/slientbrain/p/13089566.html
Copyright © 2011-2022 走看看