1. 程式人生 > 實用技巧 >Python實現AES的CBC模式加密和解密過程詳解 和 chr() 函式 和 s[a:b:c] 和函式lambda

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