python实现AES加密
Posted 书犹药也
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现AES加密相关的知识,希望对你有一定的参考价值。
目录
1.AES加密
AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;
AES有多种加密模式,其中CBC分组模式是SSL、IPSec的标准。使用CBC加密模式时需要提前给出一段初始化向量iv,因为明文分组都是根据前一个明文分组加密的,所以第一个明文分组需要用到iv来加密。
2.需要导入的模块
import base64
from Crypto.Cipher import AES
3.定义好全局变量
iv = '1234567887654321'
key = 'miyaoxuyao16ziji'
data = 'hello world'
iv是初始化向量,第一组明文就是用它加密的
key是密钥,这里选择的长度是128比特,所以字符串的长度要固定在16
data就是需要加密的数据
4.编写加密函数
- AES的区块固定是128比特,也就是16字节,所以一开始要先判断明文是否小于16字节,如果小于16字节,需要补齐,为此要写一个补齐的函数。
# 将原始的明文用空格填充到16字节 def pad(data): pad_data = data for i in range(0,16-len(data)): pad_data = pad_data + ' ' return pad_data
- 创建AES加密对象
- 用创建好的加密对象,对明文进行加密
- 把加密好的密文用base64编码
- 把字符串解码成字符串
代码:
# 将明文用AES加密
def AES_en(key, data):
# 将长度不足16字节的字符串补齐
if len(data) < 16:
data = pad(data)
# 创建加密对象
AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
# 完成加密
AES_en_str = AES_obj.encrypt(data.encode("utf-8"))
# 用base64编码一下
AES_en_str = base64.b64encode(AES_en_str)
# 最后将密文转化成字符串
AES_en_str = AES_en_str.decode("utf-8")
return AES_en_str
5.将密文解密
解密是加密的逆过程,按着加密代码的逆序很容易就能写出
- 将密文字符串重新编码成bytes类型
- 将base64编码解开
- 创建AES解密对象
- 用解密对象对密文解密
- 将补齐的空格用strip()函数除去
- 将明文解码成字符串
代码:
def AES_de(key, data):
# 解密过程逆着加密过程写
# 将密文字符串重新编码成二进制形式
data = data.encode("utf-8")
# 将base64的编码解开
data = base64.b64decode(data)
# 创建解密对象
AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
# 完成解密
AES_de_str = AES_de_obj.decrypt(data)
# 去掉补上的空格
AES_de_str = AES_de_str.strip()
# 对明文解码
AES_de_str = AES_de_str.decode("utf-8")
return AES_de_str
6.完整代码
import base64
from Crypto.Cipher import AES
iv = '1234567887654321'
key = 'miyaoxuyao16ziji'
data = 'hello world'
# 将原始的明文用空格填充到16字节
def pad(data):
pad_data = data
for i in range(0,16-len(data)):
pad_data = pad_data + ' '
return pad_data
# 将明文用AES加密
def AES_en(key, data):
# 将长度不足16字节的字符串补齐
if len(data) < 16:
data = pad(data)
# 创建加密对象
AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
# 完成加密
AES_en_str = AES_obj.encrypt(data.encode("utf-8"))
# 用base64编码一下
AES_en_str = base64.b64encode(AES_en_str)
# 最后将密文转化成字符串
AES_en_str = AES_en_str.decode("utf-8")
return AES_en_str
def AES_de(key, data):
# 解密过程逆着加密过程写
# 将密文字符串重新编码成二进制形式
data = data.encode("utf-8")
# 将base64的编码解开
data = base64.b64decode(data)
# 创建解密对象
AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
# 完成解密
AES_de_str = AES_de_obj.decrypt(data)
# 去掉补上的空格
AES_de_str = AES_de_str.strip()
# 对明文解码
AES_de_str = AES_de_str.decode("utf-8")
return AES_de_str
data = AES_en(key, data)
print(data)
data = AES_de(key, data)
print(data)
python 实现AES加密和解密
参考 https://blog.csdn.net/zhchs2012/article/details/79032656
AES加密算法是一种对称加密算法, 他有一个密匙, 即用来加密, 也用来解密
import base64 from Crypto.Cipher import AES # 密钥(key), 密斯偏移量(iv) CBC模式加密 def AES_Encrypt(key, data): vi = ‘0102030405060708‘ pad = lambda s: s + (16 - len(s)%16) * chr(16 - len(s)%16) data = pad(data) # 字符串补位 cipher = AES.new(key.encode(‘utf8‘), AES.MODE_CBC, vi.encode(‘utf8‘)) encryptedbytes = cipher.encrypt(data.encode(‘utf8‘)) # 加密后得到的是bytes类型的数据 encodestrs = base64.b64encode(encryptedbytes) # 使用Base64进行编码,返回byte字符串 enctext = encodestrs.decode(‘utf8‘) # 对byte字符串按utf-8进行解码 return enctext def AES_Decrypt(key, data): vi = ‘0102030405060708‘ data = data.encode(‘utf8‘) encodebytes = base64.decodebytes(data) # 将加密数据转换位bytes类型数据 cipher = AES.new(key.encode(‘utf8‘), AES.MODE_CBC, vi.encode(‘utf8‘)) text_decrypted = cipher.decrypt(encodebytes) unpad = lambda s: s[0:-s[-1]] text_decrypted = unpad(text_decrypted) # 去补位 text_decrypted = text_decrypted.decode(‘utf8‘) return text_decrypted key = ‘0CoJUm6Qyw8W8jud‘ data = ‘sdadsdsdsfd‘ AES_Encrypt(key, data) enctext = AES_Encrypt(key, data) print(enctext) text_decrypted = AES_Decrypt(key, enctext) print(text_decrypted) hBXLrMkpkBpDFsf9xSRGQQ== sdadsdsdsfd
以上是关于python实现AES加密的主要内容,如果未能解决你的问题,请参考以下文章