Python实现AES的CBC模式加密和解密过程详解 和 chr() 函数 和 s[a:b:c] 和函数lambda
1、chr()函数
chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
2、s[a:b:c]
s=(1,2,3,4,5)
1>、 s[a]下标访问s列表内内容
列表下标从0开始,即
s[0]=1
s[1]=2
s[4]=5
s[-1]=5
s[-2]=4
2>、s[a:b]
这是一个左闭右开区间,即
s[0:2]=(1,2)
s[0:3]=(1,2,3)
s[0:-1]=(1, 2, 3, 4)
s[0:-2]=(1,2,3)
3>、s[a:b:c]即s[起始位置:终止位置:步长]
line = "abcde" line[::-1] # 结果为:"edcba" # line[::-1]其实就是反转字符串。
a='python' b=a[::-1] print(b) #nohtyp c=a[::-2] print(c) #nhy a[i:j:s] #表示:i,j与上面的一样,但s表示步进,缺省为1. #所以a[i:j:1]相当于a[i:j] #当s<0时,i缺省时,默认为-1. j缺省时,默认为-len(a)-1 #所以a[::-1]相当于 a[-1:-len(a)-1:-1],也就是从最后一个元素到第一个元素复制一遍,即倒序。
3、匿名函数lambda
#-*- coding:utf-8 -*- #__author__ = "www.iplaypy.com" # 普通python函数 def func(a,b,c): return a+b+c print func(1,2,3) # 返回值为6 # lambda匿名函数 f = lambda a,b,c:a+b+c print f(1,2,3) # 返回结果为6 ''' f = lambda a,b,c:a+b+c 中的关键字lambda表示匿名函数, 冒号:之前的a,b,c表示它们是这个函数的参数。 匿名函数不需要return来返回值,表达式本身结果就是返回值。 '''
4、Python实现AES加密和解密
这里采用CBC模式:CBC模式对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。第一个明文块与一个叫初始化向量的数据块异或。
更多其它模式见(只有解释,无代码):https://blog.csdn.net/zhchs2012/article/details/79032656
代码(代码参考自:https://www.cnblogs.com/frank-shen/p/10281708.html):
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) #定义一个函数,这个函数的名字pad,这个函数需要一个参数,也就是s。 data = pad(data) #因为CBC模式AES加密需要满足加密数据长度是密钥长度的整数倍,所以如果长度不是整数倍,要加数据 #下面两行就调用函数完成了加密 cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8')) # 加密后得到的是bytes类型的数据 encryptedbytes = cipher.encrypt(data.encode('utf8')) # 使用Base64进行编码,返回byte字符串 encodestrs = base64.b64encode(encryptedbytes) # 对byte字符串按utf-8进行解码 enctext = encodestrs.decode('utf8') return enctext def AES_Decrypt(key, data): #解密过程也就是加密过程的逆过程 vi = '0102030405060708' #密钥偏移量 #转成byte字符串 data = data.encode('utf8') # 使用base64解码,将加密数据转换位bytes类型数据 encodebytes = base64.decodebytes(data) #下面两行代码对数据解密操作 cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8')) text_decrypted = cipher.decrypt(encodebytes) #因为CBC模式AES加密需要满足加密数据长度是密钥长度的整数倍,所以数据后面可能有不需要的后来添加的数据,所以我们就去掉 #因为添加后缀的时候按照“16 - len(s)%16”,那么后面那个字符的码值也就是原串原来长度差了多少是16整数倍 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