AES加密
AES加密(Advanced Encryption Standard,高級加密標準)是目前全球公認的最安全、應用最廣泛的對稱加密算法之一,于2001年被美國國家標準與技術研究院(NIST)確定為替代DES的標準加密算法,目前在金融、通信、軍事等安全敏感領域被廣泛采用。
AES加密的核心特點:
-
對稱加密特性
加密和解密使用同一把密鑰,密鑰管理相對簡單(但需確保密鑰安全傳輸和存儲)。 -
密鑰長度可選
支持3種密鑰長度:128位、192位、256位(對應加密強度依次提升),其中128位AES已能滿足絕大多數場景的安全需求,256位則常用于高安全級別場景(如金融、軍事)。 -
分組加密模式
AES是分組加密算法,將明文按固定長度(128位,即16字節)分成若干組,逐組加密。實際應用中需結合加密模式(如CBC、GCM、ECB等)處理長文本,其中ECB模式因安全性缺陷(相同明文分組加密后結果相同)不推薦,GCM模式因支持認證加密(同時保證機密性和完整性)被廣泛使用。 -
安全性與效率平衡
至今未被發現有效的數學破解方法,且加密/解密速度快,適合處理大量數據(如文件加密、數據庫加密),兼顧安全性和性能。
加密流程(簡化):
- 將明文按128位分組(最后一組不足16字節時需填充,如PKCS#7填充)。
- 每組明文與密鑰通過多輪(128位密鑰10輪、192位12輪、256位14輪)復雜運算(替換、移位、混合、加密鑰)生成密文分組。
- 拼接所有密文分組,得到最終密文。
解密過程則是加密的逆操作,使用相同密鑰和模式還原明文。
應用場景:
- 數據加密存儲:如用戶敏感信息(身份證、銀行卡號)在數據庫中的加密。
- secure通信:如HTTPS協議中對稱加密階段(AES常作為數據傳輸的加密算法)、VPN加密通道。
- 文件加密:如壓縮包加密、本地文件加密(如加密硬盤)。
示例(加密):
"""
@File :03AES.py
@Editor : 百年
"""
'''
pip install pycrypto
pip install pycryptodome
對稱加密
所謂對稱加密就是加密和解密用的是同一個密鑰
條件:加密和解密用的是同一個密鑰,那么兩邊就必須擁有相同的鑰匙才可以打開
常見的對稱加密有aes,des,3des(3des)
'''
# AES'''
長度:
16:AES-128
24:AES-192
32:AES-256
'''
# 導入包 Cipher里邊是各種加密器
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad# step1:創建加密器
aes = AES.new(key=b'0123456789abcdef', mode=AES.MODE_CBC, iv=b'0123456789123456')
'''For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 16 bytes long.'''
'''
MODE_ECB 不需要IV
而MODE_CBC需要IV
IV長度為16
'''# step2:加密一段數據
s = '你好,世界,hello world'bs = s.encode('utf-8') # important:注意傳入的是字節
bs = pad(bs, 16) # 進行填充
bs = aes.encrypt(bs)
try:print(bs)# b' A\x84\x9dG\x02\xb5\xb1\xed\xc9\xb5jt\x85T}\xd9\x81{.tG\xf4Ag\xfam\xda\\\xb80\x01'# 加密后的結果是雜亂無章的字節
except BaseException as e:print(e)# ValueError: Data must be padded to 16 byte boundary in CBC mode# 數據必須是16的倍數,所以需要填充到16的倍數# 加密完的字節也是不能夠直接發送給服務器的,所以要將字節轉換為服務器能夠識別的字符串
# 也就用到了base64編碼
import base64res = base64.b64encode(bs).decode()
print(res)
# IEGEnUcCtbHtybVqdIVUfdmBey50R/RBZ/pt2ly4MAE=
示例(解密)
"""
@File :AES解密.py
@Editor : 百年
"""
#因為是對稱加密所以密鑰模式以及iv都得是一樣的
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad #有補長度就有反操作raw = 'IEGEnUcCtbHtybVqdIVUfdmBey50R/RBZ/pt2ly4MAE='#將數據還原成之前的字符串格式
aes = AES.new(key=b'0123456789abcdef',mode=AES.MODE_CBC,iv=b'0123456789123456')#注意如果想還原那么就得將其轉換為字節
import base64
b64s = base64.b64decode(raw)#解密之后unpaddecs = aes.decrypt(b64s)res = unpad(decs,16)
print(res.decode('utf-8'))
# 你好,世界,hello world
'''
解密和加密的步驟剛好是反著來的'''#important:
'''
有時候有的網頁會把IV寫成16進制的數字以0x開頭
例如0xadifeabb1aifuoaea2
這時候就需要
import binascii
a2b_hex()可以將16進制數字轉換為字節
binascii.a2b_hex(去掉0x的剩余段adifeabb1aifuoaea2)
b2a_hex()可以將字節轉換為16進制數字
binascii.b2a_hex()
其實區分iv到底是16進制還是base64字符串有很好的辦法
就是看組成,因為0x的字母是a-f,所以絕對不可能有大于f的出現'''