PyCrypto是 Python 中密码学方面最有名的第三方软件包。可惜的是,它的开发工作于2012年就已停止。
其他人还在继续发布最新版本的 PyCrypto,如果你不介意使用第三方的二进制包,仍可以取得Python 3.5 的相应版本。
比如,可以在 Github 上找到了对应Python3.5的PyCrypto 二进制包。
幸运的是,有一个该项目的分支PyCrytodome 取代了 PyCrypto 。为了在 Linux 上安装它,
你可以使用以下pip 命令:
pip3 install -i https://pypi.douban.com/simple pycryptodome
在Windows 系统上安装则稍有不同:
pip3 install -i https://pypi.douban.com/simple pycryptodomex
1、Base64
在一些项目中,接口的报文是通过base64加密传输的,所以在进行接口自动化时,需要对所传的参数进行base64编码,对拿到的响应报文进行解码;
Base64编码是一种“防君子不防小人”的编码方式。广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符。
优点:速度快,ascii字符,肉眼不可理解
缺点:编码比较长,非常容易被破解,仅适用于加密非关键信息的场合

base64模块提供了6个函数用于Base64的编码和解码,可以将他们分为三组。

base64.b64encode(s, altchars=None)
base64.b64decode(s, altchars=None, validate=False)

参数s代表需要编码/解码的数据。其中b64encode的参数s的类型必须是字节包(bytes)。b64decode的参数s可以是字节包(bytes),也可以是字符串(str)。

参数altchars必须是长度为2的字节包,这两个符号会用于替换编码后数据中的’+’和’/’。这个参数默认是None。

参数validate默认为False。如果它为True时,base64模块在进行解码前会先检查s中是否有非base64字母表中的字符,如果有的话则抛出错误binascii.Error: Non-base64 digit found。

如果数据的长度不正确则会抛出错误binascii.Error: Incorrect padding。

base64.standard_b64encode(s)
base64.standard_b64decode(s)

这组函数会直接将参数s传到上一组函数中。

base64.urlsafe_b64encode(s)
base64.urlsafe_b64decode(s)

这组函数同样基于第一组函数,但进行编码后会将输出数据中的’+’和’/’替换为’-‘和’’。解码前则将数据中的’-‘和’’替换为’+’和’/’。

另,Base64编码还会产生一个符号’=’,这个符号用于将数据长度填充到4的倍数。

import base64


'''编码'''
string = "我是字符串"
string_1 = "asdfghjkl01234"
string_2 = "asdfghjk*789vvd4"
encodestr = base64.b64encode(string.encode('utf-8'))   #b'5oiR5piv5a2X56ym5Liy'
encodestr_1 = base64.b64encode(string_1.encode('utf-8'))  #b'YXNkZmdoamtsMDEyMzQ='
encodestr_2 = base64.urlsafe_b64encode(string_2.encode('utf-8')) #b'YXNkZmdoamsqNzg5dnZkNA=='
print(str(encodestr,'utf-8'))   #5oiR5piv5a2X56ym5Liy
print(str(encodestr_1,'utf-8'))   #YXNkZmdoamtsMDEyMzQ=
print(str(encodestr_2,'utf-8'))               #YXNkZmdoamsqNzg5dnZkNA==

'''解码'''
decodestr = base64.b64decode(encodestr)   #b'\xe6\x88\x91\xe6\x98\xaf\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
decodestr_1 = base64.b64decode(encodestr_1)   #b'asdfghjkl01234'
decodestr_2 = base64.urlsafe_b64decode(encodestr_2)
print(str(decodestr,'utf-8'))   
print(str(decodestr_1,'utf-8'))
print(str(decodestr_2,'utf-8'))