iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
Security

網路安全基礎概念與實作系列 第 7

Day 7: 使用Python來實作AES加密與解密

  • 分享至 

  • xImage
  •  

安裝pycryptodome

在終端或命令提示字元中輸入pip install pycryptodome,輸入執行完後再輸入 pip --version來檢查是否安裝成功。
https://ithelp.ithome.com.tw/upload/images/20240921/20169199QQgnam0ZrO.png

AES 加密與解密程式碼

以下程式會輸出加密前後的Happy Birthday!

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
import base64

def aes_encrypt(plain_text, key):
    iv = get_random_bytes(16)  # 生成隨機初始化向量
    cipher = AES.new(key, AES.MODE_CBC, iv)  # 創建加密對象
    encrypted = cipher.encrypt(pad(plain_text.encode('utf-8'), AES.block_size))  # 加密並補位
    return base64.b64encode(iv + encrypted).decode('utf-8')  # 返回加密後的資料(含IV)

def aes_decrypt(encrypted_text, key):
    encrypted_bytes = base64.b64decode(encrypted_text)  # 解碼
    iv = encrypted_bytes[:16]  # 提取IV
    encrypted_data = encrypted_bytes[16:]  # 提取加密資料
    cipher = AES.new(key, AES.MODE_CBC, iv)  # 創建解密對象
    decrypted = unpad(cipher.decrypt(encrypted_data), AES.block_size).decode('utf-8')  # 解密並去補位
    return decrypted

def main():
    key = get_random_bytes(16)  # 128位元密鑰
    plain_text = "Happy Birthday!"  # 要加密的明文
    
    print(f"明文: {plain_text}")
    
    encrypted = aes_encrypt(plain_text, key)  # 加密
    print(f"加密後: {encrypted}")
    
    decrypted = aes_decrypt(encrypted, key)  # 解密
    print(f"解密後: {decrypted}")

if __name__ == "__main__":
    main()

輸出結果:

明文: Happy Birthday!
加密後: iVbUUOO1ybX9pwtf64pynLbQ1vzuKb+47zm9W0+wK1U=
解密後: Happy Birthday!

程式碼說明

  • Crypto.Cipher.AES
    用於AES對資料進行加密和解密。
  • Crypto.Util.Padding
    在 AES 加密中,明文的長度必須是16字元的整數倍。如果明文不是這個長度,需要進行補位。
    補位(Padding):將明文擴展到符合 AES 塊大小的長度,通常使用 PKCS7 標準進行補位。
    去補位(Unpadding):在解密後去除多餘的補位,用來還原原始的明文。
  • Crypto.Random.get_random_bytes
    生成安全的隨機位元組,通常用於生成密鑰和初始化向量(IV),防止攻擊者猜測密鑰或 IV,提高加密的安全性。
  • base64
    將二進制資料編碼為 ASCII 字串,方便儲存和傳輸。
  • 加密函數 aes_encrypt
    生成隨機的初始化向量(IV),並創建 AES 加密對象,使用 CBC 模式。接下來將明文進行 PKCS7 補位後加密,將 IV 與加密後的資料結合,並進行 base64 編碼。
  • 解密函數 aes_decrypt
    將 base64 編碼的加密資料解碼,分離出 IV 和加密後的資料,創建 AES 解密對象,使用 CBC 模式,接著解密後去除補位,得到原始明文。
  • 主函數 main
    生成一個 128 位元 的隨機密鑰,定義要加密的明文,執行加密並顯示加密後的資料,執行解密並顯示解密後的明文。

上一篇
Day 6: 常用的對稱加密標準 : AES
下一篇
Day 8: 常用的非對稱加密 : RSA
系列文
網路安全基礎概念與實作26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言