python本身有base64加密的模块,不过是用C写的,封装成了.so文件,无法查看源码,本着学习的心态,自己实现了一遍,算法

原理参考 浅谈Base64编码算法.

代码如下:

  1. # coding:utf8
  2. import string
  3. import base64
  4.  
  5. # 编码用64位数组 因为是转换为6个字节的字符 所以64位就够了
  6. letters = list(string.letters) + list(string.digits) + ['+', '/']
  7.  
  8. def my_base64_encodestring(input_str):
  9. # 对每一个字节取ascii数值或unicode数值,然后转换为2进制
  10. str_ascii_list = ['{:0>8}'.format(str(bin(ord(i))).replace('0b', ''))
  11. for i in input_str]
  12. output_str = ''
  13. # 不够3的整数倍 补齐所需要的次数
  14. equal_num = 0
  15. while str_ascii_list:
  16. temp_list = str_ascii_list[:3]
  17. if len(temp_list) != 3:
  18. while len(temp_list) < 3:
  19. equal_num += 1
  20. temp_list += [''*8]
  21. temp_str = ''.join(temp_list)
  22. # 三个8字节的二进制 转换为4个6字节的二进制
  23. temp_str_list = [temp_str[x:x+6] for x in [0, 6, 12, 18]]
  24. # 二进制转为10进制
  25. temp_str_list = [int(x, 2) for x in temp_str_list]
  26. # 判断是否为补齐的字符 做相应的处理
  27. if equal_num:
  28. temp_str_list = temp_str_list[0:4-equal_num]
  29. output_str += ''.join([letters[x] for x in temp_str_list])
  30. str_ascii_list = str_ascii_list[3:]
  31. output_str = output_str + '=' * equal_num
  32. #print(output_str)
  33. return output_str
  34.  
  35. def my_base64_decodestring(input_str):
  36. # 对每一个字节取索引,然后转换为2进制
  37. str_ascii_list = ['{:0>6}'.format(str(bin(letters.index(i))).replace('0b', ''))
  38. for i in input_str if i != '=']
  39. output_str = ''
  40. equal_num = input_str.count('=')
  41. while str_ascii_list:
  42. temp_list = str_ascii_list[:4]
  43. temp_str = ''.join(temp_list)
  44. # 补够8位
  45. if len(temp_str) % 8 != 0:
  46. temp_str = temp_str[0:-1*equal_num*2]
  47. # 4个6字节的二进制 转换 为三个8字节的二进制
  48. temp_str_list = [temp_str[x:x+8] for x in [0, 8, 16]]
  49. # 二进制转为10进制
  50. temp_str_list = [int(x, 2) for x in temp_str_list if x]
  51. output_str += ''.join([chr(x) for x in temp_str_list])
  52. str_ascii_list = str_ascii_list[4:]
  53. #print(output_str)
  54. return output_str
  55.  
  56. if __name__ == "__main__":
  57. input_str = '11我'
  58. input_str = 'MTHmiJE='
  59. #my_base64_encodestring(input_str)
  60. my_base64_decodestring(input_str)
  61. pass

如有疏漏之处还请指正

python实现base64算法加密的更多相关文章

  1. MD5加密、时间戳转换、base64算法加密、解密

    #region MD5加密 /// <summary> /// MD5加密 /// </summary> /// <param name="str"& ...

  2. hash模块 hashlib不可逆加密 和 base64算法加密解密

    hashlib模块 用于加密相关的操作,代替md5模块和sha模块,主要提供SHA1,SHA224,SSHA256,SHA384,SHA512,MD5算法 直接看代码案例: ---------md5- ...

  3. c# base64算法解密

    /// <summary> /// 将字符串使用base64算法加密 /// </summary> /// <param name="code_type&quo ...

  4. java Base64算法的使用

    Base64是常见的网络加密算法,Base64编码可用于在HTTP环境下传递较长的标识信息.详见 Base64介绍 1 自定义的base64算法 Base64Encrypt.java public c ...

  5. python AES 双向对称加密解密

    高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分 ...

  6. Base64算法

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/4288372.html ...

  7. [DEncrypt] MySecurity--安全加密/Base64/文件加密 (转载)

    点击下载 MySecurity.zip 这个类是关于加密,解密的操作,文件的一些高级操作1.MySecurity  加密字符串2.MySecurity  加密字符串 密钥为系统默认 012345678 ...

  8. C#与Java互通AES算法加密解密

    /// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...

  9. MD5加密算法(信息摘要算法)、Base64算法

    1 什么是MD5 信息摘要算法,可以将字符进行加密,每个加密对象在进行加密后都是等长的 应用场景:将用户密码经过MD5加密后再存储到数据库中,这样即使是超级管理员也没有能力知道用户的具体密码是多少:因 ...

随机推荐

  1. kafka相关资料

    先来说一下Kafka与RabbitMQ的对比: RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上. kafka是Linkedin于20 ...

  2. Hibernate hql 多表查询

    String hql="select c from Col c ,UserRole role where c.id=role.columnId and c.id=? and role.use ...

  3. Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数

    Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数~~~    呵呵... 看着有点晕.. 再解释一下就是 在Unity中 使用 C# 调用 C++ 写的 DLL, 但是在 ...

  4. springmvc框架的搭建

    1引入jar包 jar包下载地址http://maven.springframework.org/release/org/ 以下是我引入的jar包 aopalliance-1.0.jaraspectj ...

  5. scala -- 递归 实现 斐波那契函数

    求一个起始为0,1,1,2,3的斐波那契序列 def main(args: Array[String]): Unit = { def fib(n: Int): Int = { if (n == 1) ...

  6. threading实例

    import paramiko, threading import queue import pymysql class ThreadPool(object): def __init__(self, ...

  7. str和repr的区别(转)

    Python打印值的时候会保持该值在python代码中的状态,不是用户所希望看到的状态.而使用print打印值则不一样,print打印出来的值是用户所希望看到的状态. 例如: >>> ...

  8. console.log等不能打印全部数据/信息

    有时候console.log在chrome调试控制台打印不全,如下: 这个时候,我们可以点击进去:用watch 工具,添加变量,右击copy value 选项:

  9. Python的logging,记录log的包

    最近在做自动化测试时,想给他加上日志,所以用到logging的模块,以下是python增加log的几种方式 一.python代码配置方式(当然还有一种是可以多模块通用的一个python代码设置,这个网 ...

  10. 奇偶数判断2(if else+switch语句)

    public class 奇偶数判断2 { public static void main(String [] agrs){ float s = 17f; //定义浮点型数据s float h = s ...