原理


Python实现:Crypto算法库
from Crypto.Cipher import AES
在python中要使用到crypto相关的库,但是网上的解决方法一大片,能用的没有几个,而且能安装的没有几个,首先我告诉大家为什么不能安装,其次告诉一种真正的方法。
pycrypto,pycrytodome和crypto是一个东西,crypto在python上面的名字是pycrypto它是一个第三方库,但是已经停止更新三年了,所以不建议安装这个库;
windows下python3.6安装也不会成功!
这个时候pycryptodome就来了,它是pycrypto的延伸版本,用法和pycrypto 是一模一样的;
所以,我现在告诉一种真的解决方法:直接安装:
pip install pycryptodome
(亲测,目前不用改文件夹名字了) 但是,在使用的时候导包是有问题的,这个时候只要修改一个文件夹的名称就可以完美解决这个问题
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Lib\site-packages
找到这个路径,下面有一个文件夹叫做crypto,将c改成C,对就是改成大写就ok了!!!
简单使用
from Crypto.Cipher import AES
import base64
secret = "12345678912345678912345678912345" #由用户输入的16位或24位或32位长的初始密码字符串
cipher = AES.new(secret) #通过AES处理初始密码字符串,并返回cipher对象
s = cipher.encrypt("1234567891234567") #输入需要加密的字符串,注意字符串长度要是16的倍数。16,32,48..
print s #输出加密后的字符串
print base64.b64encode(s) #输出加密后的字符串的base64编码。
print cipher.decrypt(s) #解密
接口自动化中实现
class AesMethod:
def __init__(self):
self.key=key
def pkcs7padding(self,text):
"""
明文使用PKCS7填充,如果块长度是16,数据长度9,那么还差7个字节,就在后面补充7个0x07
数据: FF FF FF FF FF FF FF FF FF
填充后:FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07
最终调用AES加密方法时,传入的是一个byte数组,要求是16的整数倍,因此需要对明文进行处理
:param text: 待加密内容(明文)
:return:填充后的数据
"""
bs = AES.block_size # 16
length = len(text)
bytes_length = len(bytes(text, encoding='utf-8'))
# tips:utf-8编码时,英文占1个byte,而中文占3个byte
padding_size = length if(bytes_length == length) else bytes_length
padding = bs - padding_size % bs
# tips:chr(padding)看与其它语言的约定,有的会使用'\0'
padding_text = chr(padding) * padding
return text + padding_text
def aes_encrypt(self, data):
key_bytes=bytes(self.key, encoding='utf-8')
cipher = AES.new(key_bytes,mode=1)
# 处理明文
content_padding = self.pkcs7padding(data)
# 加密
encrypt_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
# 重新编码
result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
return result