Python AES加密

一.初级加密(此方法同样适用于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)  

原文 :https://www.jianshu.com/p/123ae4b5684f 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值