速通python加密之RSA加密

RSA加密

RSA加密是一種非對稱加密算法(與AES等對稱加密不同),由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)于1977年提出,名字取自三人姓氏首字母。它通過一對密鑰(公鑰和私鑰) 實現加密和解密,是目前應用最廣泛的非對稱加密技術之一。

核心特點:

  1. 非對稱密鑰體系

    • 公鑰:可公開傳播,用于加密數據或驗證簽名。
    • 私鑰:必須保密,用于解密公鑰加密的數據,或生成簽名。
      核心邏輯:用公鑰加密的數據,只有對應的私鑰能解密;用私鑰加密的數據(簽名),只有對應的公鑰能驗證。
  2. 安全性基礎
    基于大數分解難題:將兩個大質數相乘容易,但要分解其乘積(得到原始質數)在計算上幾乎不可行。密鑰長度越長(如2048位、4096位),破解難度呈指數級增長,目前2048位及以上被認為足夠安全。

  3. 加密與解密效率
    因涉及復雜的大數運算,RSA加密速度遠慢于對稱加密(如AES),因此不適合加密大量數據,通常用于加密對稱加密的密鑰(即“混合加密”),或用于數字簽名。

典型應用場景:

  • 密鑰交換:在HTTPS、VPN等通信中,用對方公鑰加密對稱加密的密鑰,確保密鑰安全傳輸(如TLS握手階段)。
  • 數字簽名:發送方用私鑰對數據哈希值加密(生成簽名),接收方用公鑰驗證簽名,確認數據未被篡改且來自合法發送方(如軟件簽名、電子合同)。
  • 身份認證:通過驗證私鑰持有者的身份(如SSH登錄用公鑰認證)。

示例(生成公鑰和私鑰) :

"""
@File    : 非對稱加密RSA.py
@Editor  : 百年
"""
'''
非對稱加密,加密和解密的密鑰不是同一個密鑰,而是需要兩把密鑰
一個是公鑰,一個是私鑰,公鑰發送給客戶端,發送端用公鑰對數據進行加密,
再發送給接收端,接收端使用私鑰來對數據進行解密,
由于私鑰只存放在接收端這邊,
所以即使數據被截獲了,也是無法進行解密的
常見的非對稱加密算法:RSA,DSA
rsa是最常見的一種加密方案 
公鑰是用來加密的
私鑰是用來解密的
密鑰(私鑰)不能公開
公鑰和私鑰是成對的,是有一定的關聯的 
加密和解密用的不是同一個密鑰,私鑰放在服務器上不公開
'''
from Crypto.PublicKey import RSA  #這是處理密鑰的
from Crypto import Random
import base64
# 生成密鑰,默認生成的是私鑰
key = RSA.generate(2048)
print(key)
# Private RSA key at 0x1D92A324690  生成了私鑰,后面跟的是內存地址# print(key.export_key())
# print(key.exportKey()) #tips:這倆一樣的
private_key = key.export_key()
# print(private_key)
#直接這樣輸出的是base64字節而且帶有換行符
# 可以decode,將base64字節轉換為b64字符串
print(private_key.decode())# private_key_b = key.export_key(format='DER') #輸出純字節的私鑰
# print(private_key_b)#生成公鑰puiblic_key = key.public_key()
print(puiblic_key)
# Public RSA key at 0x227A7D9ADD0
print(puiblic_key.export_key())
#這樣打印也是有換行符的
print(puiblic_key.export_key().decode())
#還得decode
'''
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuTelupiUOptxRuq0HdXe
wvxw7mfpE45uxPGybbFWCykczUjthcsrnfe33zX6GikGN8O/h1Z2LGvslkupeGYB
mixLnTMTahL45P2o92szSb9xiixa50FrfFCwkkuCTcpHARkMDMawAIH+xt+bKjq9
DJKHXTaTpjrcaqXI38TYwMtGYRFJhOQr39B3P28UNAa03gKbajh4sRSA0WF6I8My
wdZZmmccW6q+rgZOs92UCwUTd4ZmzweU2FQeailhLrQWTbO9g/w9HLtFFgUWx6Vf
2WO8S5zEBPFHqbvh1Kjtvn9HK+w12uM7NDBdLgMg0PgU9AfGNzDj2pOU+drdPzbM
uwIDAQAB
-----END PUBLIC KEY-----
'''#這正使用過程中,服務器一開始就會直接寫入到文件當中去#important:注意寫入的是二進制
#寫出私鑰
with open('private.pem','wb') as f:f.write(key.export_key())#寫出公鑰
with open('public.pem','wb') as f1:f1.write(key.public_key().export_key())

示例(用公鑰加密)

"""
@File    : 使用自己的rsa密鑰加密.py
@Editor  : 百年
"""'''
加密流程是客戶端最有用的地方
解密流程是發生在服務器端的
'''from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64#step1 :加載密鑰,需要的是公鑰,公鑰是用來加密的
#這里用我們上一個文件中生成的公鑰
#export是導出,那么我們就可以用import進行導入
# tips: 可以讀字節import_key(b'b64密鑰',),也可以讀字符串
pub_k = RSA.import_key(open('public.pem','rb').read())
#step2 :創建加密器的流程和之前的AES,DES很像
rsa = PKCS1_v1_5.new(key=pub_k)#step3 :進入加密邏輯
s = 'hello,我叫hero,你是??'
enc_s = rsa.encrypt(s.encode('utf-8'))print(enc_s)
#打印出來是混亂字節
#step4 :為了傳輸,需要利用base64進行編碼enc_s = base64.b64encode(enc_s)
print(enc_s.decode())
#important:rsa加密后的東西,如果不是純數學算法,每次都是隨機的
'''
FfXEjq4Uy3zikwtTMVw+q9HqmhSyoMkUjI/VaA/JrKkp/gdLgqlKCg+0s+dttvtlDKdLE2L+WD0hseEFXhSo7hVo3aQyevtzOAokZY0ZM5Anq+hQSt4EyBxnco7ABe3iCYTJuUEqWIw0bnUB+Fq9tRshDwKsBwNCKQ2TBjM8QSUmcGa9Zvy/pdY4sPM9FGKe3vYcsejnmAbnp3llIcquSjO+clUrCI9/4HDB2bB5yxw4trxVtDukxtMWYZgyYDBvW1waL6i70h9F7/blTNSJiE5GSfktENHXY1tQsQuSpQx9N7N8sLLpIDMmmFfqv122GPncbA1zz7eoGU/Vncopkg=='''

示例(用私鑰解密):


"""
@File    : 使用私鑰進行解密.py
@Editor  : 百年
"""
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64#密文
miwen = 'FfXEjq4Uy3zikwtTMVw+q9HqmhSyoMkUjI/VaA/JrKkp/gdLgqlKCg+0s+dttvtlDKdLE2L+WD0hseEFXhSo7hVo3aQyevtzOAokZY0ZM5Anq+hQSt4EyBxnco7ABe3iCYTJuUEqWIw0bnUB+Fq9tRshDwKsBwNCKQ2TBjM8QSUmcGa9Zvy/pdY4sPM9FGKe3vYcsejnmAbnp3llIcquSjO+clUrCI9/4HDB2bB5yxw4trxVtDukxtMWYZgyYDBvW1waL6i70h9F7/blTNSJiE5GSfktENHXY1tQsQuSpQx9N7N8sLLpIDMmmFfqv122GPncbA1zz7eoGU/Vncopkg=='#step1:因為是base64字符串,先將其轉換為字節
b_s = base64.b64decode(miwen)
print(b_s)#構建解密器,對其進行解密
#step2:讀取自己的私鑰,但其實我們一般不考慮解密的事情,這是交給服務器端的pri_k = RSA.import_key(open('private.pem','rb').read())
# pri_k = RSA.import_key(k) 或者直接寫的話就導入字節格式的密鑰
rsa = PKCS1_v1_5.new(key=pri_k)
s = rsa.decrypt(b_s,sentinel='None') #important:注意這里要求要有一個位置參數表示報錯后該參數執行,是規定,雖然用不到但是也要強制指定
print(s)
# b'hello,\xe6\x88\x91\xe5\x8f\xabhero,\xe4\xbd\xa0\xe6\x98\xaf??'#step3:還原
print(s.decode()) #tips:因為默認是utf-8,這里就不指定了
# hello,我叫hero,你是??

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

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

相關文章

Java BeanUtils 類詳解:作用、語法與示例

一、BeanUtils 的核心作用BeanUtils 是 Apache Commons 和 Spring Framework 提供的工具類,主要用于簡化 JavaBean 的操作。核心功能包括:屬性拷貝:對象間同名屬性自動復制動態訪問:通過字符串名稱操作屬性類型轉換:自…

PyCharm高效開發全攻略

安裝與基礎配置下載PyCharm專業版或社區版(免費)并完成安裝。首次啟動時選擇默認設置或自定義主題、字體大小等界面偏好。配置Python解釋器路徑(推薦使用虛擬環境),確保項目依賴隔離。快捷鍵與導航熟悉核心快捷鍵能大幅…

Pycharm 給 python 程序打包EXE的配置和方法

前言: Python 語言的設計變得越來越簡單,它有很多可以使用的庫,所以尤其在人工智能時代,Python語言被廣泛應用。但是Python語言和windows系統的兼容性稍微偏弱,如何生成windows可以執行的exe文件。是要一個很復雜的配置過程,本文就會做一個介紹。 本文,通過一個Python…

【Linux | 網絡】傳輸層(UDP和TCP)

目錄一、再談端口號1.1 端口號1.2 端口號的范圍劃分1.3 常見知名端口號1.4 netstat 命令1.5 進程與端口號的關系1.6 pidof 命令二、UDP協議2.1 UDP協議段格式2.2 如何理解UDP報頭和UDP報文2.2.1 UDP報頭2.2.2 UDP報文和UDP報文的管理2.2.3 UDP封裝過程2.3 UDP的特點2.4 UDP的緩…

mybatisX的自定義模板生成

在idea中使用mybtais的自定義模板生成,可以幫我們省去很多重復的代碼。 打開一個項目,我們要修改的主要就兩個文件,一個是生成的mapper接口,另一個是xml文件: 相應的mapper接口模板為: package ${mapper…

miniz:一個輕量級、高性能的開源壓縮庫

目錄 1.簡介 2.核心特性 3.基本使用示例 4.與 ZLIB 的對比 5.使用場景 6.注意事項 1.簡介 miniz 是一個輕量級、高性能的開源壓縮庫,專注于提供 ZLIB/GZIP 兼容的壓縮和解壓縮功能。它的核心優勢在于體積小巧(單文件實現)、跨平臺支持和…

Jenkins接口自動化測試(構建)平臺搭建

Python接口自動化測試零基礎入門到精通(2025最新版)自動化測試流程 在進行平臺搭建前,我們首先要問自己:我需要搭建的平臺的功能是什么,要實現什么目標? 在我的理解中,自動化構建平臺的執行流…

Day 22: 復習

機器學習數據處理與降維技術復習總結 前言 經過6天的學習,我們系統地學習了從基礎的Numpy數組操作到高級的降維算法,這些內容構成了機器學習數據預處理的重要知識體系。本文將對這一系列學習內容進行全面復習和總結,幫助大家建立完整的知識…

力扣 hot100 Day56

46. 全排列 給定一個不含重復數字的數組 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 //抄的 class Solution { private:vector<vector<int>>result;vector<int> path; public:void backtracking(vector<int>& nu…

Android 編碼規范全指南

在 Android 開發領域&#xff0c;代碼不僅是功能實現的載體&#xff0c;更是團隊協作與項目迭代的基礎。一套完善的編碼規范&#xff0c;能讓代碼從 “可運行” 升級為 “易維護、可擴展、低風險”。本文基于 Google、Square 等頂尖團隊的實踐經驗&#xff0c;結合國內 Android…

[RPA] Excel中的字典處理

案例1一個Excel文件總共有2個Sheet頁&#xff0c;分別為總表和對照表通過對照表sheet頁&#xff0c;設置價格對照字典對照表循環總表sheet頁&#xff0c;根據循環到的商品名稱&#xff0c;找到對應字典中的價格&#xff0c;并計算出總價總表將總價寫入到Excel表中C列&#xff0…

基于NSGAII優化算法的車間生產調度matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.部分程序 4.算法理論概述 5.參考文獻 6.完整程序 1.程序功能描述 車間生產調度是制造業的核心環節&#xff0c;其目標是在滿足設備約束、工序優先級等條件下&#xff0c;優化多個相互沖突的生產指標&#xff08;如…

Cmake、VS2019、C++、openGLopenCV環境安裝

在 CMake 和 Visual Studio 2019 環境下安裝和配置 OpenGL、OpenCV 以及 CUDA 可能會有些復雜&#xff0c;因為涉及的組件多且相互依賴。以下是一個詳細的指南&#xff0c;幫助您逐步完成安裝和配置。 1. 前提條件 在開始之前&#xff0c;請確保您已安裝以下軟件&#xff1a; …

視頻二維碼在產品設備說明書中的應用

在當今數字化的時代&#xff0c;傳統的產品設備說明書正面臨著一場變革。文字和圖片雖然能提供基本信息&#xff0c;但在復雜設備的安裝、操作和故障排除方面&#xff0c;往往顯得力不從心。而視頻二維碼的出現&#xff0c;為這一困境提供了完美的解決方案&#xff0c;它將冰冷…

【Pytest 使用教程】

pytest 使用 test_basic.py Pytest 完全實戰手冊 一、核心概念與基礎 1、在pytest框架下運行測試用例&#xff0c;最基礎的一共有三點。導入pytest的包寫一個方法&#xff0c;或者類。后面運行的時候&#xff0c;相當于運行這個方法&#xff0c;或者類里的方法&#xff0c;無需…

基于OpenOCD 的 STM32CubeIDE 開發燒錄調試環境搭建 DAPLINK/STLINK

需要部署一個開發環境,實現h7的板子通過daplink功能給目標板燒寫程序(同事要將這個過程用fpga實現),需要通過openocd+gdb+daplink stm32; 總結:單條命令執行太麻煩,參考4寫成腳本文件: 獨立腳本使用Openocd ? 在**“在Stm32CubeIDE環境下使用DAP-Link仿真”**一文中…

嵌入式硬件篇---zigbee無線串口通信問題

使用 ZigBee 進行無線串口通信時&#xff0c;接收異常&#xff08;如丟包、亂碼、完全無法接收&#xff09;是常見問題&#xff0c;其原因涉及射頻通信特性、網絡機制、硬件配置、環境干擾等多個層面。以下從具體機制出發&#xff0c;詳細分析可能的原因&#xff1a;一、射頻層…

【AI周報】2025年7月26日

【AI周報】2025年7月第四周觀察&#xff1a;GitHub Spark重塑開發范式&#xff0c;中美AI政策對壘升級 省流版靜態頁面周報&#xff0c;為方便各位看官快速食用&#xff0c;我準備了摘要版周報&#xff0c;歡迎訪問&#xff1a;20250726周報 引言&#xff1a;本周焦點速覽 2…

HTML:從 “小白” 到 “標簽俠” 的修煉手冊

目錄 一、HTML&#xff1a;網頁的 “骨架” 不是骷髏架 二、文本標簽&#xff1a;文字的 “華麗變身” 術 1. 標題標簽&#xff1a;文字界的 “領導班子” 2. 段落標簽&#xff1a;文字的 “專屬保姆” 3. 文本格式化標簽&#xff1a;給文字 “穿花衣” 三、鏈接標簽&…

python3GUI--基于YOLO的火焰與煙霧檢測系統By:PyQt5(詳細圖文介紹)

文章目錄一&#xff0e;前言1.引言2.正文二&#xff0e;核心內容1.數據集2.模型訓練3.界面窗口1.登錄注冊界面2.核心功能界面3.檢測告警提示窗口三&#xff0e;.核心界面模塊介紹1.頂部信息區域2.數據輸入3.參數配置4.告警設置5.操作臺6.關于7.指標變化8.異常速覽9.日志輸出10.…