栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python中实现AES加密和解密

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python中实现AES加密和解密

AES-CBC加密

整个过程key和iv必须保持一致, 在pycharm中实现需要在该文件目录下安装crypto-js, 先cd到该目录, 然后输入命令npm install crypto-js
CBC模式和ECB模式的唯一区别就是多了个iv

let CryptoJS = require('crypto-js');

## AES-CBC模式加密
let key = CryptoJS.enc.Utf8.parse('123456789qwertyu'),  //密钥必须是16位,utf8编码方式
	iv = CryptoJS.enc.Utf8.parse("0123456789ABCDEF");   //iv也是16位哦, utf8编码方式
function jiami(text){
	let encryptedData  = CryptoJS.AES.encrypt(text, key, {
		iv: iv,
	    mode: CryptoJS.mode.CBC,
	    padding: CryptoJS.pad.Pkcs7
	});
	let hexData = encryptedData.ciphertext.toString();
	return hexData;
}
console.log(jiami('iloveyoubaby'));
// hexData = 5d405dde1859ed49e8eaed988b82c8bf


## AES-CBC模式解密
function jiemi(hexData){
    let encryptedHexStr  = CryptoJS.enc.Hex.parse(hexData), //把加密数据以Hex编码方式转成数组
    	encryptedBase64Str  = CryptoJS.enc.Base64.stringify(encryptedHexStr), //把上一步的数组以Baes64编码方式转成字符串 
    	decryptedData  = CryptoJS.AES.decrypt(encryptedBase64Str, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
});  
    let text = decryptedData.toString(CryptoJS.enc.Utf8);  
    return text;  // 得到解密结果
}
console.log(jiemi('5d405dde1859ed49e8eaed988b82c8bf'))
那在python中又该怎么实现AES-CBC模式的加密和解密呢?
import base64
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
## 先encode是为了防止明文有中文报错, 中文utf8编码后是占3个字节, 数字和字母是占1个字节

# 填充函数
def add_to_16(value):   
    while len(value.encode('utf-8')) % 16 != 0:
        value += 'x00'   #  补全, 明文和key都必须是16的倍数
    return value.encode('utf-8')

# 加密
def AESEncrypt():
    text = 'ilvoelove我爱你呀'   
    iv = '0123456789ABCDEF'
    key = '123456789qwertyu'
    aes = AES.new(key=add_to_16(key), mode=AES.MODE_CBC, iv=iv.encode())
    encryptedstr = aes.encrypt(add_to_16(text))   # 加密后得到的字节数据
    # 结果: b'x8f#x10xebxf8x13xb4xb5x11x9dx185'
    en_str = base64.b64encode(encryptedstr).decode()  # 以base64编码方式解码, 得到加密字符串!
    # 结果:yMQ6/gTtLURnRg1Iu2ZMiix79u8jsVHHFA2qKs28aQ=
    # en_str = b2a_hex(encryptedstr).decode()  # 以hex编码方式解码, 得到加密字符串
    # 结果:8f2310ebf813b4b5119d183522ed993228b1efdbbc8ec5471c5036a8ab36f1a4
    return en_str   # 把加密后的字节数据返回

# 解密
def AESDecrypt(en_str):
    iv = '0123456789ABCDEF'
    key = '123456789qwertyu'
    # 解密时必须重新构建aes对象
    aes = AES.new(key=add_to_16(key), mode=AES.MODE_CBC, iv=iv.encode())   
    # 先把密文转换成字节型, 再解密, 最后把之前填充的'x00' 去掉
    decryptedstr = aes.decrypt(base64.decodebytes(en_str)).decode().strip('x00')   
    # decryptedstr = aes.decrypt(a2b_hex(en_str)).decode().strip('x00') # 对应上面的hex编码
    print(decryptedstr)

if __name__ == '__main__':
    en_str = AESEncrypt()
    AESDecrypt(en_str)
	

PS : 话说 base64.b64encode(text.encode()) 和 base64.encodebytes(text.encode()) 以及 base64.b64decode(text.encode()) 和 base64.decodebytes(text.encode()) 有什么区别吗?

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/918496.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号