一.初级加密(此方法同样适用于linux系统)
1.python环境:3.5.3(python3的环境必须导入这两个包才能使用)
2.安装模块:pip install Crypto
3.再安装pycrypto:pip install pycrypto(此模块在3.4之后已经不再使用,使用下面的模块代替其功能)
4.或者可以安装pycryptodome:pip install pycryptodome(此模块是3.4之后AES加密模块的一个分支)
二.python3.6.5版本无法使用该模块(No module named Crypto.Cipher)
1.公司给我新配的电脑,然后就开始在上面安装各种包,在导入AES模块的过程中,提示一直找不到Crypto这个包,我就很纳闷,在之前我个人的电脑python3.5.3的版本运行都是正常的,怎么到这就不行了呢?
2.之前在网上有看到说安装这个模块可能下载的是小写的,需要将下载的包改写成大写,然后我就通过查看文件路径找到安装包的目录
Lib\site-packages
找到 crypto 这个库,更改为首字母大写 Crypto 即可
这里发现安装包真的是小写的,而我导入的包是大写的,我就将安装包改写成大写,重新运行一下程序,OK,正常了!!!
还有一种方法就是:
pip install pycryptodome
安装这个库就可以了。因为 pycryptodome pycrypto 这两个库是同一个库,但是 pycrypto 已经不维护了。
pycrypto 这个库用的话是需要更改库名为大写,不知道为什么作者这么搞,非要更改一下库名,不更改的话,你会发现库里面的引用都是问题
from Crypto.Cipher import AES
import base64
class prpcrypt():
def __init__(self):
# key值(密码)
self.key = '***************'.encode("utf-8") # 因为在python3中AES传入参数的参数类型存在问题,需要更换为 bytearray , 所以使用encode编码格式将其转为字节格式(linux系统可不用指定编码)
# vi偏移量
self.iv = '****************'.encode("utf-8") # 编码
self.mode = AES.MODE_CBC
self.BS = AES.block_size
self.pad = lambda s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) % self.BS)
self.unpad = lambda s: s[0:-ord(s[-1])]
# 加密
def encrypt(self, text):
text = self.pad(text).encode("utf-8")
cryptor = AES.new(self.key, self.mode, self.iv)
# 目前AES-128 足够目前使用(CBC加密)
ciphertext = cryptor.encrypt(text)
# base64加密
return base64.b64encode(bytes(ciphertext))
# 解密
def decrypt(self, text):
# base64解密
text = base64.b64decode(text)
cryptor = AES.new(self.key, self.mode, self.iv)
# CBC解密
plain_text = cryptor.decrypt(text)
# 去掉补足的空格用strip() 去掉
return self.unpad(bytes.decode(plain_text).rstrip('\0')) # 解密字节???
if __name__ == '__main__':
pc = prpcrypt() # 初始化密钥 和 iv
# text='access&a494fcbc-9aa1-4718-bd7d-a90d01211d97&0&2&'
text = 'access&a494fcbc-9aa1-4718-bd7d-a90d01211d97&0&1&'
# text='access&a494fcbc-9aa1-4718-bd7d-a90d01211d97&1&1&'
# text='access&a494fcbc-9aa1-4718-bd7d-a90d01211d97&1&2&'
# text='update&a494fcbc-9aa1-4718-bd7d-a90d01211d97&0&2&'
# text='update&a494fcbc-9aa1-4718-bd7d-a90d01211d98&0&2&'
# text='logout&'
e = pc.encrypt(text + str(int(time.time() / 10))) # 加密
d = pc.decrypt(e) # 解密
print("加密:%s" % e.decode("utf-8"))
print("解密:%s"% d)
print("长度:%s"% len(d))
二.高级加密
python环境:2.7.3(也可以是3.5.3环境)
# -*- coding:utf-8 -*-
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
import sys,time
import base64
class prpcrypt():
def __init__(self):
# key值(密码)
self.key = '******************'
# vi偏移量
self.iv = '****************'
self.mode = AES.MODE_CBC
self.BS = AES.block_size
self.pad = lambda s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) % self.BS)
self.unpad = lambda s : s[0:-ord(s[-1])]
# 加密
def encrypt(self,text):
text = self.pad(text)
cryptor = AES.new(self.key,self.mode,self.iv)
# 目前AES-128 足够目前使用(CBC加密)
ciphertext = cryptor.encrypt(text)
# base64加密
return base64.b64encode(bytes(ciphertext))
# 解密
def decrypt(self,text):
# base64解密
text = base64.b64decode(text)
cryptor = AES.new(self.key,self.mode, self.iv)
# CBC解密
plain_text = cryptor.decrypt(text)
# 去掉补足的空格用strip() 去掉
return self.unpad(plain_text.rstrip('\0'))
if __name__ == '__main__':
pc = prpcrypt() #初始化密钥 和 iv
#text='access&a494fcbc-9aa1-4718-bd7d-a90d01211d97&0&2&'
text='access&a494fcbc-9aa1-4718-bd7d-a90d01211d97&0&1&'
#text='access&a494fcbc-9aa1-4718-bd7d-a90d01211d97&1&1&'
#text='access&a494fcbc-9aa1-4718-bd7d-a90d01211d97&1&2&'
#text='update&a494fcbc-9aa1-4718-bd7d-a90d01211d97&0&2&'
#text='update&a494fcbc-9aa1-4718-bd7d-a90d01211d98&0&2&'
#text='logout&'
e = pc.encrypt(text+str(int(time.time()/10))) #加密
d = pc.decrypt(e) #解密
print "加密:",e
print "解密:",d
print "长度:",len(d)