Python 編碼與加密全解析:從字符編碼到 RSA 簽名驗證

在 Python 開發中,字符編碼(如 UTF-8、GBK)和?數據加密(如 Base64、MD5、RSA)是處理數據傳輸、存儲安全的核心技術。本文結合實戰代碼,從基礎的字符編解碼入手,逐步深入到加密算法的應用,覆蓋 “迅雷鏈接破解”“RSA 加解密”“數字簽名” 等實際場景,幫你系統掌握數據安全相關技能。


一、基礎:字符編解碼(encode/decode)

計算機只能識別二進制(0/1),而人類使用的是字符(如?a),字符編碼就是 “字符→二進制” 的映射規則,解碼則是反向過程。Python 中字符串(str)與字節流(bytes)的轉換,全靠?encode()?和?decode()?實現。

1. 核心原理

  • 編碼(encode)str?→?bytes,將字符串按指定規則轉為二進制字節流。
  • 解碼(decode)bytes?→?str,將二進制字節流按對應規則還原為字符串。
  • 常見編碼格式:UTF-8(通用,一個漢字占 3 字節)、GBK(中文專用,一個漢字占 2 字節)。

2. 實戰代碼

# 1. 英文編碼(UTF-8 下英文占 1 字節)
s = "hello"
# 編碼:str → bytes(指定 UTF-8 規則)
se = s.encode(encoding="utf-8")
print("UTF-8 編碼結果(字節流):", se)  # 輸出:b'hello'(b 表示 bytes 類型)
# 解碼:bytes → str
print("UTF-8 解碼結果(字符串):", se.decode(encoding="utf-8"))  # 輸出:hello# 2. 中文編碼(UTF-8 占 3 字節,GBK 占 2 字節)
s = "中"
# UTF-8 編碼
se_utf8 = s.encode(encoding="utf-8")
print("中文 UTF-8 編碼:", se_utf8)  # 輸出:b'\xe4\xb8\xad'(3 字節)
# GBK 編碼
se_gbk = s.encode(encoding="gbk")
print("中文 GBK 編碼:", se_gbk)    # 輸出:b'\xd6\xd0'(2 字節)# 解碼必須與編碼格式一致,否則亂碼
print("UTF-8 解碼:", se_utf8.decode("utf-8"))  # 輸出:中
print("GBK 解碼:", se_gbk.decode("gbk"))        # 輸出:中

3. 關鍵注意點

  • 編碼和解碼的?格式必須一致(如 UTF-8 編碼需用 UTF-8 解碼),否則會出現?UnicodeDecodeError?或亂碼。
  • 中文場景優先用?UTF-8,避免?GBK?跨平臺兼容性問題。

二、Base64 編碼:解決不可見字符傳輸問題

Base64 是一種 “二進制到字符串” 的編碼方式,將任意二進制數據轉為?A-Za-z0-9+/?組成的可見字符串,核心作用是?避免不可見字符(如 ASCII 128+)在傳輸中出錯

1. 應用場景

  • 郵件附件傳輸、下載鏈接加密(如迅雷、QQ 旋風);
  • 圖片轉字符串(如 HTML 中嵌入 Base64 圖片,減少 HTTP 請求);
  • 跨平臺數據傳輸(避免二進制解析差異)。

2. 實戰代碼(含迅雷 / 旋風鏈接破解)

Python 內置?base64?模塊,直接調用?b64encode()(編碼)和?b64decode()(解碼)即可。

(1)基礎編解碼
import base64# 1. 編碼:先將字符串轉為 bytes,再 Base64 編碼
s = "hello"
# 步驟:str → bytes(UTF-8)→ Base64 字符串(bytes 類型)
s64_encode = base64.b64encode(s.encode(encoding="utf-8"))
print("Base64 編碼結果:", s64_encode)  # 輸出:b'aGVsbG8='# 2. 解碼:Base64 字符串 → bytes → str
s64_decode = base64.b64decode(s64_encode)
print("Base64 解碼結果:", s64_decode.decode("utf-8"))  # 輸出:hello
(2)破解迅雷 / QQ 旋風鏈接

迅雷、旋風鏈接本質是 “自定義前綴 + Base64 編碼”,破解只需去掉前綴再解碼:

import base64
from urllib.parse import quote, unquote# 1. 破解迅雷鏈接(前綴:thunder://,中間需去掉 AA/ZZ 包裹)
thunder_url = "thunder://QUFodHRwczovL3d3dy5sdW9jaGVuemhpbXUuY29tL3VybC9aWg=="
# 步驟:去掉前綴 → Base64 解碼 → 去掉 AA/ZZ 包裹
pure_url = thunder_url.removeprefix("thunder://")  # 去掉 thunder://
decoded_url = base64.b64decode(pure_url).decode("utf-8")  # Base64 解碼
real_url = decoded_url.removeprefix("AA").removesuffix("ZZ")  # 去掉 AA/ZZ
print("破解后的迅雷鏈接:", real_url)  # 輸出:https://www.luochenzhimu.com/url/Z# 2. 破解 QQ 旋風鏈接(前綴:qqdl://)
qqdl_url = "qqdl://aHR0cHM6Ly93d3cubHVvY2hlbnpoaW11LmNvbS91cmwv"
pure_url = qqdl_url.removeprefix("qqdl://")  # 去掉 qqdl://
real_url = base64.b64decode(pure_url).decode("utf-8")
print("破解后的旋風鏈接:", real_url)  # 輸出:https://www.luochenzhimu.com/url/# 3. 生成迅雷鏈接(反向操作)
original_url = "https://www.luochenzhimu.com/url/"
# 步驟:AA + 原始鏈接 + ZZ → Base64 編碼 → 加 thunder:// 前綴
wrapped_url = "AA" + original_url + "ZZ"
base64_url = base64.b64encode(wrapped_url.encode()).decode()
thunder_new = "thunder://" + base64_url
print("生成的迅雷鏈接:", thunder_new)  # 輸出:thunder://QUFodHRwczovL3d3dy5sdW9jaGVuemhpbXUuY29tL3VybC8vWlo=

三、不可逆加密:MD5 與 SHA256(密碼存儲首選)

不可逆加密(哈希算法)的核心特點是?只能加密,不能解密,相同輸入永遠得到相同輸出,不同輸入大概率得到不同輸出(抗碰撞)。常用于密碼存儲、數據完整性校驗。

1. 應用場景

  • 密碼存儲:不存儲明文密碼,只存儲哈希值(如用戶登錄時,將輸入密碼哈希后與數據庫中的哈希值對比);
  • 文件校驗:下載文件時,對比 “官方哈希值” 與 “本地文件哈希值”,判斷文件是否被篡改。

2. 實戰代碼(Python 內置?hashlib?模塊)

from hashlib import md5, sha256# 待加密的字符串(如密碼)
pwd = "123456"
# 注意:哈希算法需傳入 bytes 類型,因此先 encode()# 1. MD5 加密(16 字節輸出,通常顯示為 32 位十六進制字符串)
md5_hash = md5(pwd.encode(encoding="utf-8")).hexdigest()
print("MD5 加密結果:", md5_hash)  # 輸出:e10adc3949ba59abbe56e057f20f883e# 2. SHA256 加密(256 位輸出,安全性高于 MD5)
sha256_hash = sha256(pwd.encode(encoding="utf-8")).hexdigest()
print("SHA256 加密結果:", sha256_hash)  # 輸出:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

3. 關鍵注意點

  • MD5 安全性較低(已被破解,存在碰撞案例),推薦用 SHA256 或更安全的 SHA512;
  • 實際項目中,密碼哈希需加鹽(salt),即添加隨機字符串后再哈希,避免 “彩虹表” 破解(如?md5((pwd + salt).encode()))。

四、非對稱加密:RSA(公鑰加密,私鑰解密)

非對稱加密有?兩把鑰匙:公鑰(公開,用于加密)和私鑰(保密,用于解密),核心優勢是 “無需傳遞密鑰,即可安全傳輸數據”,是 HTTPS、數字簽名的核心技術。

1. 應用場景

  • 安全通信(如 HTTPS 中服務器用公鑰加密,客戶端用私鑰解密);
  • 數字簽名(用私鑰簽名,公鑰驗證,確保數據未被篡改);
  • 敏感數據加密(如支付信息、個人隱私)。

2. 實戰代碼(需先安裝?rsa?庫)

Python 沒有內置 RSA 模塊,需先安裝第三方庫:

# 安裝 rsa 庫(國內鏡像加速)
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip install rsa
(1)生成公鑰與私鑰(保存到文件)
import rsa# 1. 生成 RSA 密鑰對(nbit 為密鑰長度,2048 或 4096,長度越長越安全)
pub_key, pri_key = rsa.newkeys(nbit=2048)# 2. 將密鑰轉為 bytes 格式(PKCS#1 標準,便于存儲)
pub_key_bytes = pub_key.save_pkcs1()  # 公鑰 bytes
pri_key_bytes = pri_key.save_pkcs1()  # 私鑰 bytes# 3. 保存到文件(公鑰可公開,私鑰需保密)
with open("./a/public.pem", "wb") as f:  # 公鑰文件f.write(pub_key_bytes)
with open("./a/private.pem", "wb") as f:  # 私鑰文件f.write(pri_key_bytes)
print("RSA 密鑰對已保存到 ./a 目錄")
(2)RSA 加解密(公鑰加密,私鑰解密)
import rsa
import base64# 1. 從文件加載密鑰(實際項目中,公鑰可能從服務器獲取,私鑰本地存儲)
pub_key_bytes = open("./a/public.pem", "rb").read()
pri_key_bytes = open("./a/private.pem", "rb").read()# 2. 解析密鑰為 RSA 格式
pub_key = rsa.PublicKey.load_pkcs1(pub_key_bytes)  # 加載公鑰
pri_key = rsa.PrivateKey.load_pkcs1(pri_key_bytes)  # 加載私鑰# 3. 加密(公鑰加密,只能加密短數據,長數據需分段)
plain_text = "hello, RSA!"  # 待加密的明文
# 步驟:明文 → bytes → RSA 加密(bytes)→ Base64 編碼(便于傳輸)
encrypted = rsa.encrypt(plain_text.encode("utf-8"), pub_key)
encrypted_base64 = base64.b64encode(encrypted).decode("utf-8")
print("RSA 加密后(Base64):", encrypted_base64)# 4. 解密(私鑰解密)
# 步驟:Base64 解碼 → RSA 解密(bytes)→ 明文(str)
decrypted_base64 = base64.b64decode(encrypted_base64.encode("utf-8"))
decrypted = rsa.decrypt(decrypted_base64, pri_key).decode("utf-8")
print("RSA 解密后:", decrypted)  # 輸出:hello, RSA!

五、數字簽名:RSA 簽名與驗證(確保數據完整性)

數字簽名是 “非對稱加密的反向應用”:用?私鑰簽名(生成簽名),用?公鑰驗證(判斷數據是否被篡改)。核心作用是 “確認數據來源合法 + 數據未被修改”。

1. 應用場景

  • 接口請求簽名(如 API 調用時,客戶端用私鑰簽名,服務器用公鑰驗證,防止請求被篡改);
  • 軟件安裝包簽名(如 Windows exe 簽名,確保軟件未被植入惡意代碼);
  • 電子合同、電子證書。

2. 實戰代碼(模擬 JD 鏈接簽名驗證)

import rsa
import base64
from urllib.parse import quote, unquote# 待簽名的數據(如 JD 商品鏈接)
original_url = "https://www.jd.com/?itemId=2"# 1. 加載 RSA 密鑰對
pub_key_bytes = open("./a/public.pem", "rb").read()
pri_key_bytes = open("./a/private.pem", "rb").read()
pub_key = rsa.PublicKey.load_pkcs1(pub_key_bytes)
pri_key = rsa.PrivateKey.load_pkcs1(pri_key_bytes)# 2. 私鑰簽名(生成簽名)
# 步驟:數據 → bytes → 私鑰簽名(MD5 哈希算法)→ Base64 編碼 → URL 編碼(處理特殊字符)
sign = rsa.sign(original_url.encode("utf-8"), pri_key, "MD5")  # MD5 為哈希算法
sign_base64 = base64.b64encode(sign).decode("utf-8")
sign_urlencoded = quote(sign_base64)  # URL 編碼,避免特殊字符(如 +、/)出錯
print("生成的簽名(URL 編碼后):", sign_urlencoded)# 3. 公鑰驗證(判斷數據是否被篡改)
# 模擬場景:服務器收到數據(可能被篡改)和簽名,驗證合法性
received_url = "https://www.jd.com/?itemId=3"  # 被篡改的鏈接
received_sign = sign_urlencoded  # 收到的簽名# 驗證步驟:URL 解碼 → Base64 解碼 → 公鑰驗證
sign_decoded = unquote(received_sign)  # URL 解碼
sign_bytes = base64.b64decode(sign_decoded.encode("utf-8"))  # Base64 解碼try:# 公鑰驗證:若驗證通過,返回簽名時用的哈希算法(如 'MD5');若失敗,拋出異常verify_result = rsa.verify(received_url.encode("utf-8"), sign_bytes, pub_key)print("驗證通過,哈希算法:", verify_result)
except rsa.VerificationError:print("驗證失敗!數據已被篡改或簽名無效")  # 此處會觸發,因為 received_url 被篡改

六、總結與工具清單

  1. 字符編碼UTF-8?優先,處理中文避免亂碼;
  2. Base64:用于不可見字符傳輸、鏈接加密,base64?模塊直接調用;
  3. 不可逆加密:MD5(簡單)、SHA256(安全),hashlib?模塊,適合密碼存儲;
  4. 非對稱加密:RSA(公鑰加密、私鑰解密),rsa?庫,適合安全通信;
  5. 數字簽名:RSA 私鑰簽名、公鑰驗證,確保數據完整性和合法性。

通過本文的代碼實戰,你可以輕松應對 “數據傳輸加密”“密碼存儲”“接口簽名” 等常見場景,為 Python 項目的安全性保駕護航。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97289.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97289.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97289.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于shell命令的擴展

目錄 一、邏輯運算符 1. &&(AND) 2. ||(OR) 3. 組合使用:A && B || C 二、輸出與重定向 1. echo 輸出 2. 標準文件描述符(FD) 3. 重定向操作符 4. 同時重定向 stdout 和…

MySQL EXPLAIN 查看執行計劃詳解

MySQL 的 EXPLAIN 命令。這是一個分析和優化 SQL 查詢性能不可或缺的強大工具。它展示了 MySQL 如何執行一條 SQL 語句,包括如何使用索引、表連接順序、估計的行數等關鍵信息。1. 如何使用 EXPLAIN在你要分析的 SELECT 語句前加上 EXPLAIN 或 EXPLAIN FORMATJSON&am…

TensorFlow 面試題及詳細答案 120道(51-60)-- 模型保存、加載與部署

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 51. TensorFlow中保存和加…

從零開始學Shell編程:從基礎到實戰案例

從零開始學Shell編程:從基礎到實戰案例 文章目錄從零開始學Shell編程:從基礎到實戰案例一、認識Shell:是什么與為什么學1.1 Shell的定義1.2 常用Shell解釋器二、Shell編程快速入門:編寫第一個腳本2.1 步驟1:創建腳本文…

機器學習算法全景解析:從理論到實踐

機器學習算法全景解析:從理論到實踐引言機器學習作為人工智能的核心組成部分,正在深刻地改變我們的世界。從推薦系統到自動駕駛,從醫療診斷到金融風控,機器學習算法無處不在。本文將全面系統地介紹機器學習的主要算法類別及其核心…

week5-[二維數組]對角線

week5-[二維數組]對角線 題目描述 給定一個 nnn\times nnn 的正方形二維數組,輸出它兩條對角線上元素的和。 輸入格式 輸入共 n1n 1n1 行。 第 111 行 111 個正整數 nnn。 接下來 nnn 行,每行 nnn 個正整數 aija_{ij}aij? 表示這個二維數組。 輸出格式…

GoogLeNet:深度學習中的“卷積網絡變形金剛“

大家好!今天我們要聊一個在深度學習領域掀起革命的經典網絡——GoogLeNet(又稱Inception v1)。這個由Google團隊在2014年提出的模型,不僅拿下了ImageNet競賽冠軍,更用"網絡中的網絡"設計理念徹底改變了卷積神…

筆記本電腦藍牙搜索不到設備-已解決

方法1打開疑難解答,選擇其他疑難解答,下劃選擇藍牙,點擊運行,電腦自行檢測并修復藍牙方法2右鍵此電腦,選擇管理,找到自己的藍牙設備。然后對箭頭指向的這個點擊右鍵,選擇《更新驅動程序》&#…

WPF 程序用戶權限模塊利用MarkupExtension實現控制控件顯示

工作記錄 ------------------------------------------------------------------------------------------------------- MarkupExtension:XAML標記擴展 實現了什么作用:通過擴展標記將一種輸入轉化為另一種類型的輸出 思路: 不直接設置控件的Visib…

SpringMVC相關梳理

SpringMVC 返回值類型(一)核心返回值類型分類視圖渲染類:用于跳轉并渲染頁面,如String(指定視圖名)、ModelAndView(視圖 數據)。數據返回類:用于返回數據(而…

Docker化性能監控平臺搭建:JMeter+InfluxDB+Grafana全攻略

你作為一名DevOps工程師或測試專家,正在監控一個高并發微服務系統:突發流量峰值導致響應延遲,服務器CPU飆升,但你只能手動查看日志,優化起來像大海撈針。這時,DockerJMeterInfluxDBGrafana的“夢幻四重奏”…

Adobe Acrobat 中通過 JavaScript 調用 Web 服務

強大的JavaScript支持,允許用戶通過腳本自動化處理PDF文檔。本文將詳細介紹如何在Adobe Acrobat環境中使用JavaScript調用Web服務,包括基礎概念、實現方法、代碼示例以及常見問題解決方案。 第一部分:基礎概念與技術背景 1.1 Acrobat JavaScr…

SpringCloud OpenFeign 遠程調用(RPC)(三)

目錄 1 概念導入 2 添加依賴 3 在啟動類上添加注解 4 編寫對應的接口 5 注入并調用 6 日志 7 超時控制 8 超時重試 9 攔截器 10 Fallback兜底 1 概念導入 Spring Cloud OpenFeign Features :: Spring Cloud Openfeign 2 添加依賴 <!-- 遠程調用 --><depen…

【Flask】測試平臺開發,登陸重構

概述我們在開篇的時候實現了簡單的登陸功能&#xff0c;也實現了一個前后端聯調的登陸功能&#xff0c;但是你有沒有發現&#xff0c;那個登陸只是一個簡單的登陸&#xff0c;且密碼在接口返回的過程中是銘文密碼&#xff0c;在生產環境中使用肯定是不行的&#xff0c;一般密碼…

【Bluedroid】A2DP Source設備音頻數據讀取機制分析(btif_a2dp_source_read_callback)

本文聚焦Android 藍牙 A2DP Source設備的音頻數據讀取核心邏輯,深入解析關鍵回調函數btif_a2dp_source_read_callback的功能實現,包括從 HAL(硬件抽象層,支持 HIDL/AIDL 兩種傳輸方式)或 UIPC(用戶空間進程間通信)獲取音頻數據的路徑選擇機制,以及數據下溢(Underflow)…

多方調研賦能AI+智慧消防 豪越科技人工智能創新獲認可

8月26日&#xff0c;中國職業安全健康協會城市及社區安全發展專業委員會秘書長汪衛國以及常務副秘書長黃強亮等諸位領導到訪委員單位豪越科技&#xff0c;展開了實地的調研活動并給予相關指導。此次調研著重于了解豪越科技自主研發的“AI消防救援一體化安全管控平臺”&#xff…

算法---字符串

一、算法說明 字符串是一種類型&#xff0c;他不是一種算法&#xff0c;所以我們在處理這方面的問題的時候&#xff0c;需要結合其他的算法 二、題目 最長公共前綴 1、題目 最長公共前綴 2、解題思路 解法一&#xff1a;我們可以先讓兩個相互比較&#xff0c;然后在將比較…

鴻蒙Next導航與路由指南:組件導航與頁面路由的完美協作

一次搞懂HarmonyOS NEXT中的兩種導航方式&#xff0c;打造流暢的應用內跳轉體驗在鴻蒙應用開發中&#xff0c;流暢的頁面導航和路由是提升用戶體驗的關鍵。HarmonyOS NEXT提供了組件導航&#xff08;Navigation&#xff09; 和頁面路由&#xff08;ohos.router&#xff09; 兩種…

JavaScript原型詳解——面試重點

一、原型的含義&#xff1a;JavaScript 中的“原型”既指 函數身上的 prototype 對象&#xff0c;也指 對象身上的 [[Prototype]] 隱藏鏈接&#xff1b;它倆共同構成了“原型鏈”&#xff0c;決定了“找不到屬性時去哪里繼續找”的規則。&#xff08;1&#xff09;原型對象(pro…

Vue3 全面介紹

Vue3&#xff08;正式名稱為 Vue.js 3&#xff09;是 Vue.js 前端框架的第三個主要版本&#xff0c;于 2020 年 9 月正式發布。作為對 Vue2 的重大升級&#xff0c;Vue3 在核心架構、性能優化、開發體驗等方面進行了全面重構&#xff0c;同時保持了 Vue 一貫的“漸進式框架”理…