python實(shí)現(xiàn)aes加密及pycryptodome庫使用
在Python中,使用pycryptodome庫可以輕松地實(shí)現(xiàn)AES加密。本文將介紹如何使用Python實(shí)現(xiàn)AES加密以及如何使用pycryptodome庫來進(jìn)行加密。
什么是AES加密?
AES(Advanced Encryption Standard)是一種對(duì)稱密鑰加密算法,被廣泛用于保護(hù)數(shù)據(jù)的安全。它是目前最常用的加密算法之一,被廣泛應(yīng)用于數(shù)據(jù)通信、數(shù)據(jù)存儲(chǔ)和計(jì)算機(jī)安全領(lǐng)域。
在AES加密中,加密和解密使用相同的密鑰。它支持128位、192位和256位密鑰長度,并可以使用不同的加密模式(如ECB、CBC、CFB、OFB等)進(jìn)行加密。在加密過程中,明文被劃分為若干個(gè)塊,然后每個(gè)塊使用密鑰進(jìn)行加密,最終生成密文。在解密時(shí),密文被解密成明文塊,并使用相同的密鑰進(jìn)行還原。
如何使用Python實(shí)現(xiàn)AES加密?
Python是一種高級(jí)編程語言,廣泛應(yīng)用于數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、人工智能等領(lǐng)域。使用Python實(shí)現(xiàn)AES加密非常容易,只需要安裝pycryptodome庫即可。
以下是一個(gè)簡單的AES加密示例:
from Crypto.Cipher import AES import base64 # 需要加密的明文 plain_text = "Hello World!" # 密鑰,長度必須是16、24或32字節(jié) key = "This is a key123".encode() # 加密模式,可以是CBC、CFB、ECB、OFB等模式 mode = AES.MODE_CBC # 填充字符 padding = b" " # 創(chuàng)建一個(gè)AES對(duì)象 cipher = AES.new(key, mode) # 對(duì)明文進(jìn)行填充 pad_len = AES.block_size - len(plain_text) % AES.block_size padding_str = padding * pad_len plain_text = plain_text.encode() + padding_str # 加密 cipher_text = cipher.encrypt(plain_text) # 使用Base64編碼轉(zhuǎn)換成字符串 cipher_text_str = base64.b64encode(cipher_text).decode() print(cipher_text_str)
以上代碼中,key表示密鑰,長度必須是16、24或32字節(jié);mode表示加密模式,可以是CBC、CFB、ECB、OFB等模式;padding表示填充字符,通常使用空格。
plain_text是需要加密的明文,首先需要進(jìn)行填充,然后使用AES.new()方法創(chuàng)建一個(gè)AES對(duì)象。接著調(diào)用encrypt()方法進(jìn)行加密,最后使用base64模塊將加密結(jié)果轉(zhuǎn)換成字符串。
需要注意的是,在使用CBC模式時(shí),需要指定一個(gè)初始化向量(IV),可以使用Random.new().read(AES.block_size)來生成一個(gè)隨機(jī)的IV。在解密時(shí),需要使用相同的密鑰和IV才能還原明文本,以下是一個(gè)使用CBC模式和隨機(jī)IV的AES加密示例:
from Crypto.Cipher import AES from Crypto import Random import base64 # 需要加密的明文 plain_text = "Hello World!" # 密鑰,長度必須是16、24或32字節(jié) key = "This is a key123".encode() # 加密模式,使用CBC模式 mode = AES.MODE_CBC # 填充字符 padding = b" " # 隨機(jī)生成IV iv = Random.new().read(AES.block_size) # 創(chuàng)建一個(gè)AES對(duì)象 cipher = AES.new(key, mode, iv) # 對(duì)明文進(jìn)行填充 pad_len = AES.block_size - len(plain_text) % AES.block_size padding_str = padding * pad_len plain_text = plain_text.encode() + padding_str # 加密 cipher_text = cipher.encrypt(plain_text) # 將IV和密文拼接成一個(gè)字節(jié)串 cipher_text_bytes = iv + cipher_text # 使用Base64編碼轉(zhuǎn)換成字符串 cipher_text_str = base64.b64encode(cipher_text_bytes).decode() print(cipher_text_str)
在以上代碼中,使用Random.new().read(AES.block_size)方法生成一個(gè)隨機(jī)的IV,然后在創(chuàng)建AES對(duì)象時(shí)將其傳入。在加密時(shí),將生成的IV和密文拼接成一個(gè)字節(jié)串。在解密時(shí),需要先將密文解碼為字節(jié)串,然后將字節(jié)串的前16個(gè)字節(jié)作為IV,剩余的字節(jié)作為加密后的數(shù)據(jù)進(jìn)行解密。
如何使用pycryptodome庫實(shí)現(xiàn)AES加密?
pycryptodome是一個(gè)Python密碼學(xué)庫,是pycrypto庫的加強(qiáng)版。它提供了多種加密算法和加密模式的實(shí)現(xiàn),包括AES、RSA、DSA、DH等算法。
以下是一個(gè)使用pycryptodome庫實(shí)現(xiàn)AES加密的示例:
from Crypto.Cipher import AES from Crypto.Util.Padding import pad import base64 # 需要加密的明文 plain_text = "Hello World!" # 密鑰,長度必須是16、24或32字節(jié) key = "This is a key123".encode() # 加密模式,使用CBC模式 mode = AES.MODE_CBC # 填充字符 padding = b" " # 隨機(jī)生成IV iv = Random.new().read(AES.block_size) # 創(chuàng)建一個(gè)AES對(duì)象 cipher = AES.new(key, mode, iv) # 對(duì)明文進(jìn)行填充 plain_text = pad(plain_text.encode(), AES.block_size, style='pkcs7') # 加密 cipher_text = cipher.encrypt(plain_text) # 將IV和密文拼接成一個(gè)字節(jié)串 cipher_text_bytes = iv + cipher_text # 使用Base64編碼轉(zhuǎn)換成字符串 cipher_text_str = base64.b64encode(cipher_text_bytes).decode() print(cipher_text_str)
與前面的示例不同,這里使用了Crypto.Util.Padding模塊中的pad()方法對(duì)明文進(jìn)行填充,使用pkcs7填充模式,這樣可以保證加密和解密時(shí)都能夠正確處理填充。
如何使用cryptography庫實(shí)現(xiàn)AES加密?
cryptography是一個(gè)現(xiàn)代化的Python密碼學(xué)庫,提供了一種更安全、更易用的API。它支持的加密算法包括AES、RSA、DSA、ECC等。
以下是一個(gè)使用cryptography庫實(shí)現(xiàn)AES加密的示例:
from cryptography.fernet import Fernet # 需要加密的明文 plain_text = "Hello World!" # 密鑰,長度必須是32字節(jié) key = b"This is a key123456789012345678901234567890" # 創(chuàng)建一個(gè)Fernet對(duì)象 cipher = Fernet(key) # 加密 cipher_text = cipher.encrypt(plain_text.encode()) # 解密 plain_text = cipher.decrypt(cipher_text).decode() print(cipher_text) print(plain_text)
在以上示例中,首先需要生成一個(gè)32字節(jié)的密鑰。然后,創(chuàng)建一個(gè)Fernet對(duì)象,使用密鑰對(duì)明文進(jìn)行加密,得到密文。解密時(shí),使用相同的密鑰對(duì)密文進(jìn)行解密,得到明文。
與前面兩個(gè)示例不同,cryptography庫并沒有提供AES加密的直接接口,而是使用了更高層次的封裝。這種封裝方式可以簡化加密操作,但可能會(huì)影響加密的靈活性。
本文介紹了三種常用的Python庫實(shí)現(xiàn)AES加密的方法,分別是pycrypto、pycryptodome和cryptography。這些庫提供了不同層次的API,使用者可以根據(jù)實(shí)際需求選擇適合自己的庫。
總結(jié)
到此這篇關(guān)于python實(shí)現(xiàn)aes加密及pycryptodome庫使用的文章就介紹到這了,更多相關(guān)python aes加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python操作Mongodb數(shù)據(jù)庫的方法小結(jié)
這篇文章主要介紹了Python操作Mongodb數(shù)據(jù)庫的方法,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)MongoDB數(shù)據(jù)庫的基本模塊導(dǎo)入、連接、增刪改查及排序等相關(guān)操作技巧,需要的朋友可以參考下2019-09-09Python根據(jù)輸入?yún)?shù)計(jì)算結(jié)果的實(shí)例方法
在本篇文章里小編個(gè)大家整理了一篇關(guān)于Python根據(jù)輸入?yún)?shù)計(jì)算結(jié)果的實(shí)例方法,有興趣的朋友們可以跟著學(xué)習(xí)參考下。2021-08-08使用python將時(shí)間轉(zhuǎn)換為指定的格式方法
今天小編就為大家分享一篇使用python將時(shí)間轉(zhuǎn)換為指定的格式方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11python 實(shí)現(xiàn)識(shí)別圖片上的數(shù)字
這篇文章主要介紹了python 識(shí)別圖片上的數(shù)字,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07python實(shí)現(xiàn)將字符串中的數(shù)字提取出來然后求和
這篇文章主要介紹了python實(shí)現(xiàn)將字符串中的數(shù)字提取出來然后求和,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python中try用法、內(nèi)置異常類型與自定義異常類型拓展案例詳解
在?Python?里,try?語句主要用于異常處理,其作用是捕獲并處理代碼運(yùn)行期間可能出現(xiàn)的異常,避免程序因異常而意外終止,這篇文章主要介紹了Python中try用法、內(nèi)置異常類型與自定義異常類型拓展,需要的朋友可以參考下2025-04-04