前言:
AES,高级加密标准。目前比较流行的对称加密算法。是一种对称加密算法,即加密和解密都用相同的密钥。
AES只是个基本算法,实现AES有几种模式,主要有ECB、CBC、CFB等几种模式。CBC模式中还有一个偏移量参数IV。
AES加密有AES-128、AES-192和AES-256三种,分别对应三种密钥长度128位(16字节)、192位(24字节)和256位(32字节)。密钥越长,安全性越高,加密和解密时间也会更长。一般默认是128位,其安全性完全够用。
一、加密/解密时,字节数不够时的处理:
加密时:
因为密钥是16字节,所以明文加密时,字符串不足16字节的倍数,则要补充个数,例如:少4个,要补chr(4)chr(4)chr(4)chr(4),少2个,要补chr(2)chr(2)。chr(参数)中的参数是缺少的字节,要补全。这里为什么要补充chr(缺少位的ASCII码作为参数)。是因为这样能更好的读取字符串最后字符时,知道有几个填充字符,从而能采用字符串切片操作而逆向清除填充字符,为自己理解这点,兴奋。
实现方法:明文字符串 + chr(16-len(明文字符串)%16) * (16 - len(明文字符串)%16)
1、自定义函数实现:
def pad(data): text = data + chr(16 - len(data) % 16) * (16 - len(data) % 16) return text
2、 用lambda匿名函数:(因为只有一个表达式,lambda语法自行查阅)
pad = lambda s: s + chr(16 - len(s) % 16) * (16 - len(s) % 16)
解密时:
加密时字符串不足16字节倍数时,填充的字符是chr(缺少的字节数作为参数的),所以逆向清除填充的字符串,利用最后字符的ASCII码进行切片得出所需字符串。
1、自定义函数实现:
def unpad(s): last_num = s[-1] text = s[:-last_num] return text
2、 用lambda匿名函数:
unpad = lambda s: s[:-s[-1]]
二、加密、解密用到的库函数
Cryptodome和base64库,听爬虫课时,UP说的Crytodo库安装出现了问题,查了建议用Cryptodome库,安装方法:pip install Cryptodome 安装正常,base64为内置。
base64在这里起什么作用呢?
Base64是网络上最常见的用于传输8Bit字节码的编码方式,能实现二进制与字符之间编码的互转。所以说Base64就是把字符串以二进制编码/解码。其中,b64encode为编码,b64decode为解码
三、加密/解密的实现
ECB模式加密:
def aes_ECB_Encrypt(data,key): # ECB模式的加密函数,data为明文,key为16字节密钥 key = key.encode('utf-8') data = pad(data) # 补位 data = data.encode('utf-8') aes = AES.new(key=key,mode=AES.MODE_ECB) #创建加密对象 #encrypt AES加密 B64encode为base64转二进制编码 result = base64.b64encode(aes.encrypt(data)) return str(result,'utf-8') # 以字符串的形式返回
CBC模式加密:
def aes_CBC_Encrypt(data,key,iv): # CBC模式的加密函数,data为明文,key为16字节密钥,iv为偏移量 key = key.encode('utf-8') iv = iv.encode('utf-8') # CBC 模式下的偏移量 data = pad(data) # 补位 data = data.encode('utf-8') aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv) #创建加密对象 #encrypt AES加密 B64encode为base64转二进制编码 result = base64.b64encode(aes.encrypt(data)) return str(result,'utf-8') # 以字符串的形式返回
解密为逆向:
def aes_ECB_Decrypt(data,key): # ECB模式的解密函数,data为密文,key为16字节密钥 key = key.encode('utf-8') aes = AES.new(key=key,mode=AES.MODE_ECB) # 创建解密对象 #decrypt AES解密 B64decode为base64 转码 result = aes.decrypt(base64.b64decode(data)) result = unpad(result) # 除去补16字节的多余字符 return str(result,'utf-8') # 以字符串的形式返回 def aes_CBC_Decrypt(data,key,iv): # CBC模式的解密函数,data为密文,key为16字节密钥 key = key.encode('utf-8') iv = iv.encode('utf-8') aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv) # 创建解密对象 #decrypt AES解密 B64decode为base64 转码 result = aes.decrypt(base64.b64decode(data)) result = unpad(result) # 除去补16字节的多余字符 return str(result,'utf-8') # 以字符串的形式返回
四、附自己做的练习源代码
import base64 from Crypto.Cipher import AES str_a = 'This is a book, that is a pen' pad = lambda s: s + chr(16 - len(s) % 16) * (16 - len(s) % 16) unpad = lambda s: s[:-s[-1]] key = 'sdf46asdfs54hgjg' iv = '0102030405060708' def aes_ECB_Encrypt(data,key): # ECB模式的加密函数,data为明文,key为16字节密钥 key = key.encode('utf-8') data = pad(data) # 补位 data = data.encode('utf-8') aes = AES.new(key=key,mode=AES.MODE_ECB) #创建加密对象 #encrypt AES加密 B64encode为base64转二进制编码 result = base64.b64encode(aes.encrypt(data)) return str(result,'utf-8') # 以字符串的形式返回 def aes_CBC_Encrypt(data,key,iv): # CBC模式的加密函数,data为明文,key为16字节密钥,iv为偏移量 key = key.encode('utf-8') iv = iv.encode('utf-8') # CBC 模式下的偏移量 data = pad(data) # 补位 data = data.encode('utf-8') aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv) #创建加密对象 #encrypt AES加密 B64encode为base64转二进制编码 result = base64.b64encode(aes.encrypt(data)) return str(result,'utf-8') # 以字符串的形式返回 def aes_ECB_Decrypt(data,key): # ECB模式的解密函数,data为密文,key为16字节密钥 key = key.encode('utf-8') aes = AES.new(key=key,mode=AES.MODE_ECB) # 创建解密对象 #decrypt AES解密 B64decode为base64 转码 result = aes.decrypt(base64.b64decode(data)) result = unpad(result) # 除去补16字节的多余字符 return str(result,'utf-8') # 以字符串的形式返回 def aes_CBC_Decrypt(data,key,iv): # CBC模式的解密函数,data为密文,key为16字节密钥 key = key.encode('utf-8') iv = iv.encode('utf-8') aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv) # 创建解密对象 #decrypt AES解密 B64decode为base64 转码 result = aes.decrypt(base64.b64decode(data)) result = unpad(result) # 除去补16字节的多余字符 return str(result,'utf-8') # 以字符串的形式返回 b = aes_ECB_Encrypt(str_a,key) b1 = aes_ECB_Decrypt(b,key) c = aes_CBC_Encrypt(str_a,key,iv) c1 = aes_CBC_Decrypt(c,key,iv) print("加密前长度:{},加密前字符串为:{}\n加密后长度:{},ECB加密后字符串:{}\n解密后长度:{},解密后字符串:{}\n".format(len(str_a),str_a,len(b),b,len(b1),b1)) print("加密前长度:{},加密前字符串为:{}\n加密后长度:{},CBC加密后字符串:{}\n解密后长度:{},解密后字符串:{}".format(len(str_a),str_a,len(c),c,len(c1),c1))
运行结果:
PS D:\python> & "C:/Program Files/Python311/python.exe" d:/python/Crypto_Cipher.py 加密前长度:29,加密前字符串为:This is a book, that is a pen 加密后长度:44,ECB加密后字符串:Y9OEJM1wcv1OwUYmvAEt2cFAPC2Gh1Gk5ts5d+HSngo= 解密后长度:29,解密后字符串:This is a book, that is a pen 加密前长度:29,加密前字符串为:This is a book, that is a pen 加密后长度:44,CBC加密后字符串:FJ7cEn3uKW7aacuC755xkzs4e3T68+bNEVE0SS1emkE= 解密后长度:29,解密后字符串:This is a book, that is a pen PS D:\python>
猜你喜欢
- 15天前(fender japan hybrid)Fender东京旗舰店盛大开幕在即,开售商品和店内服务提前揭晓
- 15天前(万达酒店及度假村连续五年荣获“中国饭店集团60强”)万达酒店及度假村连续五年荣获“中国饭店集团60强”
- 15天前(哥伦比亚号邮轮)爱达邮轮与哥仑比亚船舶管理集团达成合作
- 15天前(三亚太阳湾柏悦度假酒店)三亚太阳湾柏悦酒店携手ROSEONLY诺誓缔造浪漫七夕
- 15天前(福朋喜来登酒店宴会厅)福朋喜来登品牌亮相北部湾城市群 阳江中心福朋喜来登酒店开业
- 15天前(兵团猛进秦剧团持续开展“戏曲进校园”活动)兵团猛进秦剧团持续开展“戏曲进校园”活动
- 15天前(天气预报 华为)2025HDC华为天气上新系统级天气智能体,引领更智能的气象服务
- 15天前(星级饭店的发展困境)星级饭店转型之路:从市场逻辑到行业实践的深度探索
- 15天前(内蒙古交通旅游图)内蒙古着力提升交通与旅游服务水平
- 15天前(冬日生活还没安排?上抖音一键打包北方花式过冬精彩)冬日生活还没安排?上抖音一键打包北方花式过冬精彩
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章