国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python學習筆記——AES 加密/解密

這篇具有很好參考價值的文章主要介紹了Python學習筆記——AES 加密/解密。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言:

AES,高級加密標準。目前比較流行的對稱加密算法。是一種對稱加密算法,即加密和解密都用相同的密鑰。

AES只是個基本算法,實現(xiàn)AES有幾種模式,主要有ECB、CBC、CFB等幾種模式。CBC模式中還有一個偏移量參數(shù)IV。

AES加密有AES-128、AES-192和AES-256三種,分別對應三種密鑰長度128位(16字節(jié))、192位(24字節(jié))和256位(32字節(jié))。密鑰越長,安全性越高,加密和解密時間也會更長。一般默認是128位,其安全性完全夠用。

一、加密/解密時,字節(jié)數(shù)不夠時的處理:

加密時:

因為密鑰是16字節(jié),所以明文加密時,字符串不足16字節(jié)的倍數(shù),則要補充個數(shù),例如:少4個,要補chr(4)chr(4)chr(4)chr(4),少2個,要補chr(2)chr(2)。chr(參數(shù))中的參數(shù)是缺少的字節(jié),要補全。這里為什么要補充chr(缺少位的ASCII碼作為參數(shù))。是因為這樣能更好的讀取字符串最后字符時,知道有幾個填充字符,從而能采用字符串切片操作而逆向清除填充字符,為自己理解這點,興奮。

實現(xiàn)方法:明文字符串 + chr(16-len(明文字符串)%16) * (16 - len(明文字符串)%16)?

1、自定義函數(shù)實現(xiàn):

def pad(data):
    text = data + chr(16 - len(data) % 16) * (16 - len(data) % 16)
    return text

?2、?用lambda匿名函數(shù):(因為只有一個表達式,lambda語法自行查閱)?

pad = lambda s: s + chr(16 - len(s) % 16) * (16 - len(s) % 16)

解密時:

加密時字符串不足16字節(jié)倍數(shù)時,填充的字符是chr(缺少的字節(jié)數(shù)作為參數(shù)的),所以逆向清除填充的字符串,利用最后字符的ASCII碼進行切片得出所需字符串。

1、自定義函數(shù)實現(xiàn):

def unpad(s):
    last_num = s[-1]
    text = s[:-last_num]
    return text
    

2、?用lambda匿名函數(shù):

unpad = lambda s: s[:-s[-1]]

二、加密、解密用到的庫函數(shù)

Cryptodome和base64庫,聽爬蟲課時,UP說的Crytodo庫安裝出現(xiàn)了問題,查了建議用Cryptodome庫,安裝方法:pip install Cryptodome 安裝正常,base64為內(nèi)置。

base64在這里起什么作用呢?

Base64是網(wǎng)絡上最常見的用于傳輸8Bit字節(jié)碼的編碼方式,能實現(xiàn)二進制與字符之間編碼的互轉(zhuǎn)。所以說Base64就是把字符串以二進制編碼/解碼。其中,b64encode為編碼,b64decode為解碼

三、加密/解密的實現(xiàn)

ECB模式加密:

def aes_ECB_Encrypt(data,key):   # ECB模式的加密函數(shù),data為明文,key為16字節(jié)密鑰
    key = key.encode('utf-8')
    data = pad(data)             # 補位
    data = data.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_ECB)  #創(chuàng)建加密對象
    #encrypt AES加密  B64encode為base64轉(zhuǎn)二進制編碼
    result = base64.b64encode(aes.encrypt(data))
    return str(result,'utf-8')        # 以字符串的形式返回

CBC模式加密:

def aes_CBC_Encrypt(data,key,iv):   # CBC模式的加密函數(shù),data為明文,key為16字節(jié)密鑰,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)  #創(chuàng)建加密對象
    #encrypt AES加密  B64encode為base64轉(zhuǎn)二進制編碼
    result = base64.b64encode(aes.encrypt(data))
    return str(result,'utf-8')        # 以字符串的形式返回

解密為逆向:

def aes_ECB_Decrypt(data,key):   # ECB模式的解密函數(shù),data為密文,key為16字節(jié)密鑰
    key = key.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_ECB)  # 創(chuàng)建解密對象

    #decrypt AES解密  B64decode為base64 轉(zhuǎn)碼
    result = aes.decrypt(base64.b64decode(data))
    result = unpad(result)            # 除去補16字節(jié)的多余字符
    return str(result,'utf-8')        # 以字符串的形式返回

def aes_CBC_Decrypt(data,key,iv):   # CBC模式的解密函數(shù),data為密文,key為16字節(jié)密鑰
    key = key.encode('utf-8')
    iv = iv.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)  # 創(chuàng)建解密對象

    #decrypt AES解密  B64decode為base64 轉(zhuǎn)碼
    result = aes.decrypt(base64.b64decode(data))
    result = unpad(result)            # 除去補16字節(jié)的多余字符
    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模式的加密函數(shù),data為明文,key為16字節(jié)密鑰
    key = key.encode('utf-8')
    data = pad(data)             # 補位
    data = data.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_ECB)  #創(chuàng)建加密對象

    #encrypt AES加密  B64encode為base64轉(zhuǎn)二進制編碼
    result = base64.b64encode(aes.encrypt(data))
    return str(result,'utf-8')        # 以字符串的形式返回

def aes_CBC_Encrypt(data,key,iv):   # CBC模式的加密函數(shù),data為明文,key為16字節(jié)密鑰,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)  #創(chuàng)建加密對象

    #encrypt AES加密  B64encode為base64轉(zhuǎn)二進制編碼
    result = base64.b64encode(aes.encrypt(data))
    return str(result,'utf-8')        # 以字符串的形式返回

def aes_ECB_Decrypt(data,key):   # ECB模式的解密函數(shù),data為密文,key為16字節(jié)密鑰
    key = key.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_ECB)  # 創(chuàng)建解密對象

    #decrypt AES解密  B64decode為base64 轉(zhuǎn)碼
    result = aes.decrypt(base64.b64decode(data))
    result = unpad(result)            # 除去補16字節(jié)的多余字符
    return str(result,'utf-8')        # 以字符串的形式返回

def aes_CBC_Decrypt(data,key,iv):   # CBC模式的解密函數(shù),data為密文,key為16字節(jié)密鑰
    key = key.encode('utf-8')
    iv = iv.encode('utf-8')
    aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)  # 創(chuàng)建解密對象

    #decrypt AES解密  B64decode為base64 轉(zhuǎn)碼
    result = aes.decrypt(base64.b64decode(data))
    result = unpad(result)            # 除去補16字節(jié)的多余字符
    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))

運行結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-414102.html


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> 

到了這里,關(guān)于Python學習筆記——AES 加密/解密的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 前端使用AES密碼加密、解密,使用詳細(crypto加密解密,前后端分離,AES加密解密)

    1、 首先安裝?crypto-js插件,安裝命令如下:? ? -S等同于--save,保存在package.json文件中,是在dependencies 下, --save安裝包信息將加入到dependencies(生產(chǎn)環(huán)境)中,生產(chǎn)階段的依賴,也就是項目運行時的依賴,就是程序上線后仍然需要依賴; -D等同于--save-dev,也保存在package.j

    2024年02月11日
    瀏覽(23)
  • php對稱加密AES加密解密

    php對稱加密AES加密解密

    AES-128-ECB和AES-256-CBC是兩種常見的AES加密模式,它們在加密方式和安全性上有以下區(qū)別: 加密方式: AES-128-ECB:ECB(Electronic Codebook)模式是最簡單的AES加密模式,它將數(shù)據(jù)分成固定大小的塊,每個塊獨立加密。這意味著相同的明文塊將始終加密為相同的密文塊,因此ECB模式不

    2024年02月09日
    瀏覽(25)
  • 前端AES加密解密

    前端經(jīng)常會遇到這種接口和參數(shù)需要加密的情況,目前用的最多的就是aes加密了。以下就是操作步驟。以下方式適用各個前端框架,請自行根據(jù)框架修改對應語法 1.安裝 CryptoJS 這個庫就是用來加密的核心,直接打開項目終端,輸入 npm install crypto-js --save 2. 新建 crypto.js 在 @/

    2024年02月13日
    瀏覽(34)
  • Golang里的AES加密、解密

    CBC/ECB/CFB 解密方法 輸出結(jié)果: 輸出結(jié)果: 輸出結(jié)果: 首先使用openssl生成公私鑰

    2024年02月11日
    瀏覽(23)
  • uniapp AES加密解密

    uniapp里我知道的有兩種aes加密解密方式。 一、引入crypto-js 1.需要在uniapp項目根目錄里,打開命令行,執(zhí)行如下命令: 2.在項目根目錄,創(chuàng)建一個utils文件夾,并創(chuàng)建一個aes_endecrypt.js文件 ?3.在main.js文件中,引入方法,并注冊為全局方法 4.在頁面中使用aes加密,解密 二、第二

    2024年02月13日
    瀏覽(26)
  • Android AES加密解密

    Android AES加密解密

    ?AES算法全稱Advanced Encryption Standard。它是典型的“對稱加密算法”,主要作用是保證私密信息不被泄露。 一、密鑰 密鑰是AES算法實現(xiàn)加密和解密的根本,因為 它對明文的加密和解密需要使用同一個密鑰 。 AES支持三種長度的密鑰:128位,192位,256位。 二、填充 AES算法在對明

    2024年02月04日
    瀏覽(19)
  • kotlin aes 加密解密

    aes算法對key的字節(jié)數(shù)有要求 所以對輸入的key要做填充處理

    2024年02月07日
    瀏覽(15)
  • java:AES加密和解密

    java:AES加密和解密

    1 前言 對稱加密,即單秘鑰加密,指加密和解密的過程中,使用相同的秘鑰,相比于非對稱加密,因僅有一把鑰匙,故而速度更快,更適合解密大文件(常見于如視頻文件的加密解密中)。AES算法就屬于對稱加密中的一種。 2 使用 依賴引入: AES加密與解密的工具類封裝: 執(zhí)

    2024年02月11日
    瀏覽(22)
  • 在線AES加密/解密工具

    在線AES加密/解密工具

    在線AES加密/解密工具 http://lzltool.com/AES http://lzltool.com/AES

    2024年02月12日
    瀏覽(33)
  • AES與DES加密解密算法

    AES與DES加密解密算法

    AES(Advanced Encryption Standard,高級加密標準)的出現(xiàn),是因為以前使用的DES算法密鑰長度較短,已經(jīng)不適應當今數(shù)據(jù)加密安 全性的要求,因此2000年10月2日,美國政府宣布將比利時密碼學家Joan Daemen和Vincent Rijmen提出的密碼算法RIJNDAEL作為高級加密標準。2001年11月26日,美國政府

    2024年04月28日
    瀏覽(41)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包