」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用 PyCrypto AES-256 進行安全加密和解密?

如何使用 PyCrypto AES-256 進行安全加密和解密?

發佈於2024-11-13
瀏覽:684

How Can PyCrypto AES-256 Be Used for Secure Encryption and Decryption?

使用 PyCrypto AES-256 進行安全加密和解密

PyCrypto 是一個強大的 Python 加密操作庫。一項常見任務是使用 AES-256 加密和解密數據,AES-256 是一種用於敏感資料保護的業界標準加密演算法。

問題定義:

建構可靠的加密使用 PyCrypto的解密功能需要解決幾個潛在問題:

  • 確保適當的金鑰長度
  • 選擇合適的加密模式
  • 了解初始化向量(IV)的作用和使用

增強安全性和功能性:

為了解決這些問題,開發了使用PyCrypto 的實作:

import base64
import hashlib
from Crypto import Random
from Crypto.Cipher import AES

class AESCipher(object):

    def __init__(self, key):
        self.bs = AES.block_size
        self.key = hashlib.sha256(key.encode()).digest()

    def encrypt(self, raw):
        raw = self._pad(raw)
        iv = Random.new().read(AES.block_size)
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return base64.b64encode(iv   cipher.encrypt(raw.encode()))

    def decrypt(self, enc):
        enc = base64.b64decode(enc)
        iv = enc[:AES.block_size]
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return AESCipher._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')

    def _pad(self, s):
        return s   (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)

    @staticmethod
    def _unpad(s):
        return s[:-ord(s[len(s)-1:])]

金鑰與IV 增強功能:

  • 金鑰使用以下方式進行雜湊處理SHA-256 確保32 位元組長度。
  • 為每個加密操作產生一個新的 IV,提供額外的保護攻擊。

加密模式

此實作在 CBC(密碼區塊連結)模式下使用 AES-256。建議使用 CBC 模式對區塊中的資料進行加密,並使用 IV 來確保每個區塊都是唯一加密的。

IV 注意事項:

IV 是一個重要值必須安全地產生。使用不同的IV進行加密和解密不會影響結果,但IV必須與加密時使用的IV配對才能解密成功。

最新教學 更多>
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    程式設計 發佈於2024-11-19
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-11-19
  • 如何有效率地檢索 Go 字串的最後一個字元?
    如何有效率地檢索 Go 字串的最後一個字元?
    檢索Go 字符串的最後一個字符在Go 中,處理字符串時會出現一個常見的需求:從Go 字符串中檢索最後X 個字元給定的字串。雖然 string 套件沒有為此任務提供特定函數,但有一些有效的方法可以使用切片表達式來完成此任務。 要取得字串的最後 N 個字符,請使用以下切片表達式語法:stringVari...
    程式設計 發佈於2024-11-19
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-19
  • FastAPI:如何使用 Pydantic 宣告查詢參數
    FastAPI:如何使用 Pydantic 宣告查詢參數
    它大約三週前發布,是 FastAPI 最受期待的功能之一。至少當我們談論 Pydantic Models FastAPI 時。 是的,我說的是使用 Pydantic 模型來繪製查詢參數的能力。 所以在這篇文章中,我將盡力向您展示一切?可以和?無法解決這個問題? : ?映射查詢參數...
    程式設計 發佈於2024-11-19
  • 測試自動化工具:綜合指南
    測試自動化工具:綜合指南
    测试自动化工具简介 测试自动化工具已成为现代软件开发的重要组成部分,使团队能够简化测试流程并确保高质量的发布。在当今快节奏的开发环境中,手动测试已经跟不上持续集成和交付的速度。测试自动化工具允许团队自动执行重复任务,减少人为错误并腾出时间进行更复杂的测试工作。 为什么使用测试自动化工具? 自动化工...
    程式設計 發佈於2024-11-19
  • 為什麼在 AngularJS 中使用“controller as”語法?
    為什麼在 AngularJS 中使用“controller as”語法?
    理解AngularJS的“controller as”語法簡介AngularJS引入了定義控制器的新語法“controller as”,這引起了一些關注關於其目的的問題。本文旨在闡明此語法背後的基本原則及其優點。 Controller as 語法「controller as」語法可讓您實例化控制器並...
    程式設計 發佈於2024-11-19
  • 如何為單一 Go 專案定義 GOPATH?
    如何為單一 Go 專案定義 GOPATH?
    自動為各個項目定義GOPATH自動為各個項目定義GOPATH簡介:在Go中管理依賴項和項目需要設定GOPATH 環境變量,但使用單一GOPATH 的預設方法可能會導致衝突和冗餘。本討論探討了在每個專案的基礎上定義 GOPATH 的潛在解決方案。 為每個專案定義 GOPATH:傳統方法需要使用匯出 G...
    程式設計 發佈於2024-11-19
  • Google 財經小工具 API 棄用後如何擷取股票行情?
    Google 財經小工具 API 棄用後如何擷取股票行情?
    使用 Google Finance API 檢索股票報價正如您所提到的,Google Finance Gadget API 不再可用。因此,透過這種方法存取股票報價不再可行。 但是,還有其他資源提供類似的功能。一種替代方案是 Google Cloud Platform 的財務資料 API。此 API...
    程式設計 發佈於2024-11-19
  • 如何使用CSS在顯示圖像時有效隱藏文字?
    如何使用CSS在顯示圖像時有效隱藏文字?
    使用 CSS 隱藏文字使用 CSS 隱藏文字元素可用於各種設計目的。常見的情況是用圖像替換文字作為徽標。本文解決了一個具體問題:如何在顯示圖像時有效地去除原始文字。 隱藏文字的解決方案有多種方法可以使文字在顯示影像時不可見保留影像放置的元素尺寸。 方法 1:文字縮排一種技巧涉及使用文字縮排將文字推出...
    程式設計 發佈於2024-11-19
  • Selenium如何與Scrapy整合來抓取動態頁面?
    Selenium如何與Scrapy整合來抓取動態頁面?
    將Selenium 與Scrapy 整合以實現動態頁面當抓取具有動態內容的複雜網站時,Selenium(Web 自動化框架)可以與Scrapy,一個網頁抓取框架,用於克服挑戰。 將 Selenium 整合到 Scrapy 中Spider要將 Selenium 整合到 Scrapy 蜘蛛中,請在蜘蛛的...
    程式設計 發佈於2024-11-19
  • 如何在 Go 中為派生標量類型實作自訂 JSON 解組?
    如何在 Go 中為派生標量類型實作自訂 JSON 解組?
    在Go 中匯出用於JSON 解組的自訂類型在Go 中使用自訂類型時,通常需要實作UnmarshalJSON函數來啟用自動從JSON 轉換為所需類型。然而,當類型源自於標量值時,就會出現挑戰。本文探討了解決此問題的解決方案。 考慮 PersonID 類型的範例,該類型表示用於識別個人的子類型整數常數。...
    程式設計 發佈於2024-11-19
  • 為什麼在 PHP PDO 中的錯誤處理中,try {} catch {} 優於 if {} else {}?
    為什麼在 PHP PDO 中的錯誤處理中,try {} catch {} 優於 if {} else {}?
    在錯誤處理方面,try {} catch {} 相對於if {} else {} 的優點從普通MySQL 遷移到PHP PDO 時開發者經常觀察到使用try {} catch {} 區塊而非if {} else {} 組合來進行錯誤處理的轉變。這種偏好源自於以下幾個優點:全面的錯誤處理try {} ...
    程式設計 發佈於2024-11-19
  • 如何計算兩個 Joda-Time 日期時間之間的時差(以分鐘為單位)?
    如何計算兩個 Joda-Time 日期時間之間的時差(以分鐘為單位)?
    計算兩個Joda-Time DateTimes 之間的時間差(以分鐘為單位)在確定兩個Joda-Time DateTime 對象之間的時間差的過程中,讓我們深入研究提供的解決方案:答案建議使用Duration 類,它是時間量的抽象表示。透過將 Duration 物件初始化為 Durationurat...
    程式設計 發佈於2024-11-19
  • os.FileMode 在設定標誌之前如何轉換權限?
    os.FileMode 在設定標誌之前如何轉換權限?
    設定Flags之前os.FileMode如何轉換權限最初關注使用時使用時使用八進位或十進制數的os.FileMode 函數,產生的檔案權限似乎並不總是與預期行為相符。具體來說,傳遞十進制數(不含前導零)會導致與傳遞八進制等效值不同的檔案屬性。 轉換邏輯os.FileMode 接受整數作為輸入並在內部...
    程式設計 發佈於2024-11-19

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3