密碼學實驗

密碼學實驗二

一、實驗目的(本次實驗所涉及并要求掌握的知識點)

  1. 掌握RSA算法的基本原理并根據給出的RSA算法簡單的實現代碼源程序,以及能夠使用RSA對文件進行加密。
  2. 掌握素性測試的基本原理,并且會使用Python進行簡單的素性測試以及初步理解Solovag-Strassen檢測,Lehmam檢測,Rabin-Miller檢測算法。

二、實驗原理和技術路線

(一)RSA編碼實驗

  1. 非對稱密碼
    對稱密碼算法要求通信雙方通過交換密鑰實現使用同一個密鑰,這在密鑰管理、發布和安全性方面存在很多問題,而非對稱密碼算法解決了這個問題。非對稱密碼算法是指一個加密系統的加密密鑰和解密密鑰是不相同,或者說不能從其中一個推導出另一個。在非對稱密碼算法的兩個密鑰中,一個是用于加密的密鑰,可以公開的稱為公鑰;另一個是用于解密的密鑰,是保密的稱為私鑰。非對稱密碼算法解決了對稱密碼體制中密鑰管理難題,并提供對信息發送人的身份進行驗證的手段,是現代密碼學的最重要的發明和進展。
  2. RSA編碼密碼原理
    RSA算法基于一個十分簡單的數論事實:將兩個大素數相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。RSA算法是第一個能同時用于加密和數字簽名的算法,也易于理解和操作。RSA是被研究得最廣泛的公鑰算法,從提出到現今的三十多年里,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。由于進行的都是大數計算,使得RSA最快的情況也比DES慢上好幾倍,無論是軟件還是硬件實現,速度一直是RSA的缺陷,一般來說只用于少量數據加密,RSA的速度比對應同樣安全級別的對稱密碼算法要慢1000倍左右。
  • 公鑰:選擇兩個互異的大素數p和q,n是二者的乘積,即n=pq使Φ(n)=(p-1)(q-1),Φ(n)為歐拉函數,隨機選取正整數e使其滿足gcd(e,Φ(n))=1即e和Φ(n)互質,則將(n,e)作為公鑰。
  • 私鑰:求出正數d使其滿足e×d=1modΦ(n)則將(n,d)作為私鑰。
  • 加密算法:對于明文M由C=Memodn得到密文C。
  • 解密算法:對于密文C由M=Cdmodn得到明文M如果竊密者獲得了n,e和密文C為了破解密文必須計算出私鑰d為此需要先分解n為p和q為了提高破解難度,達到更高的安全性,一般商業應用要求n的長度不小于1024bit,更重要的場合不小于2048bit。
    加密解密算法的數學表達式為:
    加密: c i = m i e m o d n ( 1 ≤ i ≤ t ) c_i=m_i^emodn(1≤i≤t) ci?=mie?modn(1it)
    解密: m i = c i d m o d n ( 1 ≤ i ≤ t ) m_i=c_i^dmodn(1≤i≤t) mi?=cid?modn(1it)
  1. RSA算法缺點
    1)產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密。
    2)安全性,RSA的安全性依賴于大數的因子分解,但并沒有從理論上證明破譯RSA的難度與大數分解難度等價,而且密碼學界多數人士傾向于因子分解不是NP問題。
    3)速度太慢,由于RSA的分組長度太大,為保證安全性,n至少也要600bits以上,使運算代價很高,尤其是速度較慢,較對稱密碼算法慢幾個數量級;且隨著大數分解技術的發展,這個長度還在增加,不利于數據格式的標準化。

(二)素性測試編碼實驗

  1. 素數(質數):質數又稱素數。一個大于1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。(質數和合數中不包括負數)
  2. 素性檢測:在以往判斷一個數a是不是素數時,都是采用i從2到sqrt(a)能否整除a。如果能整除,則a是合數;否則是素數。但是該算法的時間復雜度為O(sqrt(a)),當a較大時,時間性能很差,特別是在網絡安全和密碼學上一般都需要很大的素數。而從目前來看,確定性算法判斷素數的性能都不好,所以可以用MC(蒙特卡洛)概率算法來解決,其中MillerRabin算法就是其中的很經典的解決方法。下面首先介紹下相關的數學理論。
  3. 理論基礎:Fermat小定理:若a是素數,則對所有1≤n≤a-1的整數a,有n(a-1)moda=1;該定理的逆否命題也成立,即n(a-1)moda!=1,則n為合數。但是如果a是素數,就不一定成立了,比如當n=4,a=15時,4^14mod15=1,但是4不是素數而是合數。
  4. Fermat素性測試:算法Fermat(n,t),其中n>2為奇數,t為測試次數。
    1)對i從1到t做如下循環:
  • 隨機選擇m,1<m<n-1;
  • 計算d=gcd(m,n),如果d>1,則返回“合數”,否則反之;
  • 計算r≡m^(n-1)(modn);
  • 若r≠1,則返回“合數”。
    2)返回“素數”。
    算法主要應用了費馬小定理,但m^(p-1)≡1(modp)僅是素數的必要條件。
    上述算法將一個合數判斷為素數的出錯概率為1/2^t,但是返回合數的判定總是對的。只要增加測試次數t,就可以把出錯概率降至趨近于0。
  1. Lehmam素性測試
    1)對i從1到t做如下循環:
  • 選擇一個小于n的隨機數a;
  • 計算a^((n-1)/2)modn;
  • 如果a^((n-1)/2)≠1或-1,那么返回合數。(n肯定不是素數)
    2)返回素數。(n不是素數的可能性至多是50%)
    算法主要運用了上面提到的第一條定理,2是素數且是n-1的素因子,在這里代替了q。
  1. Solovay-Strassen素性測試
    1)對i從1到t做如下循環:
  • 選擇一個小于n的隨機數a;
  • 計算j≡a^((n-1)/2)modn;
  • 如果j≠1或-1,則返回n不是素數;
  • 計算Jacobi符號J(a,n)=(a/n);
  • 如果j≠(a/n),返回n不是素數。
    2)返回n是素數
    算法中的步驟3同樣使用了第一條定理判斷出合數。而后又用素數性質加強了判斷,所以這一測試準確度更高。

三、實驗方法和步驟(或程序代碼或操作流程)

(1)RSA編碼實驗

運行代碼RSA.py:
在系統中打開文檔進行代碼的查看,在Linux系統命令行中輸入vimcryptography/RSA/RSA.py,系統顯示出來代碼:

#!/usr/bin/env python
#-*-coding: utf-8-*-
import math
def isPrime(number):
i=2
sqrtNumber=int( math. sqrt(number))
for i in range( 2, sqrtNumber+1):
if number%i=0:
return False
i=i+1
return True
if
name_-"_main_":
print"*"*77
Flag =False
while Flag=False
p = int( raw_input( "Please input a prime(P):"))
Flag=isPrime(p)
if Flag=False
print "What you input is not a prime!"
print "The P is:", p
Flag =False
while Flag=False
q = int( raw_input( "Please input a prime(Q):"))
ifp=q
continue
Flag =isPrime(q)
if Flag=False
print "What you input is not a prime!"
print "The Q is:",q)while Flag =False
e =int(raw_input( "Please input a number(E):"))
if (e<1 or e>t):
continue
d=0
while (((e*d)%t)!=1):
d+=1
Flag =True
print "The E is: ", e
print "The D is: ", d
print "The Public Key(E, N) is:",e, n
print "The Private Key(D, N) is:", d, n
print "*"*77
Flag =False
while Flag =False:
plainText =int(raw_input("Please input a plaintext:"))
if (plainText < n):
Flag =True
print "The plaintext is: ", plainText
print "Encrypt"+","*7
cipherText =(plainText**e)%n
print "cipherText is: ", cipherText
print "Decrypt"+","*7
plain =(cipherText**d)%n
print "The plain is: ", plain
print "*"*77
if plainText =plain:
print "RSA Test success, "
else
print "RSA Test unsuccess!")

查看完畢后,輸入:q退出查看,之后對這段代碼進行驗證,輸入以下代碼查看到目錄下有一個RSA.py文件。

cd/root/cryptography/RSA/ls

在這里插入圖片描述

執行RSA.py來驗證加密過程。

在這里插入圖片描述

(2)素性測試編碼實驗

登錄系統后,查看到目錄"/root/cryptography/"下有個"zhishucs.py"文件。
在這里插入圖片描述

查看該文件的內容:
在這里插入圖片描述

執行zhishucs.py,判斷給定的數字是否為素數。

在這里插入圖片描述

四、實驗過程原始記錄(測試數據、圖表截圖、計算等)

(1)RSA編碼實驗測試數據

  1. 測試數據為:11,17,13,180 得到加密后的密文為130
    在這里插入圖片描述

  2. 測試數據為13 29 17 250 得到加密后的密文為113
    在這里插入圖片描述

(2)素性檢測實驗數據

  1. 16 檢測結果為非素數

在這里插入圖片描述

  1. 17 檢測結果為素數
    在這里插入圖片描述

  2. 331 檢測結果為素數

在這里插入圖片描述

五、實驗小結

  1. 實驗中遇到的問題及解決方式
  • 現象:在輸入素數 P 和 Q 時,系統提示 “輸入非素數”,但實際輸入的數字(如 11、17)應為素數,導致程序反復要求重新輸入。
  • 原因:根據實驗文檔描述,代碼中素數判斷函數isPrime的邏輯可能存在漏洞,例如未正確處理邊界值(如輸入 1 或 2 時的判斷),或循環條件錯誤導致漏檢因子。
  • 解決方式:根據提示輸入素數或非素數
  1. 實驗體會和收獲
  • 知識落地:通過代碼運行直觀理解 RSA 密鑰生成與加解密流程,驗證了歐拉函數、模逆元的數學關系。
  • 算法局限:試除法不適用于大素數判斷,認識到概率素性測試的必要性;RSA 效率受大數運算制約,需結合實際場景選擇算法。
  • 編程細節:調試中發現邊界條件處理和模運算的重要性,提升了代碼邏輯嚴謹性。

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

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

相關文章

力扣面試150題-- 從中序與后序遍歷序列構造二叉樹

Day 44 題目描述 思路 這題類似與昨天那題&#xff0c;首先來復習一下&#xff0c;后序遍歷&#xff0c;對于后序遍歷每一個元素都滿足以下規律&#xff1a; &#xff08;左子樹&#xff09;&#xff08;右子樹&#xff09;&#xff08;根&#xff09;&#xff0c;那么我們直…

2區組的2水平析因實驗的混區設計

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著傅玨生譯)第7章2k析因的區組化和混區設計第7.4節的python解決方案。本文盡量避免重復書中的理論&#xff0c;著于提供python解決方案&#xff0c;并與原書的運算結果進行對比。您可以從Detail 下載實驗設計與分析…

反向傳播算法——矩陣形式遞推公式——ReLU傳遞函數

總結反向傳播算法。 來源于https://udlbook.github.io/udlbook/&#xff0c;我不明白初始不從 x 0 \boldsymbol{x}_0 x0?開始&#xff0c;而是從 z 0 \boldsymbol{z}_0 z0?開始&#xff0c;不知道怎么想的。 考慮一個深度神經網絡 g [ x i , ? ] g[\boldsymbol{x}_i, \bold…

2025年PMP 學習二十三 16章 高級項目管理

2025年PMP 學習二十三 16章 高級項目管理 文章目錄 2025年PMP 學習二十三 16章 高級項目管理高級項目管理戰略管理戰略管理的組成要素&#xff1a;企業戰略轉化為戰略行動的階段&#xff1a; 組織戰略類型戰略組織類型組織級項目管理OPM&#xff08;公司項目管理&#xff09; 組…

Journal of Real-Time Image Processing 投稿過程

投稿要求雙欄12頁以內(包括參考文獻)&#xff0c;這個排版要求感覺不是很嚴格&#xff0c;我當時就是用普通的雙欄的格式去拍的版&#xff0c;然后就提交了&#xff0c;也沒單獨去下載模版。 投稿過程 12.12 Submission received 12.12 Submission is under technical check 1…

t檢驗詳解:原理、類型與應用指南

t檢驗詳解&#xff1a;原理、類型與應用指南 t檢驗&#xff08;t-test&#xff09;是一種用于比較兩組數據均值是否存在顯著差異的統計方法&#xff0c;適用于數據近似正態分布且滿足方差齊性的場景。以下從核心原理、檢驗類型、實施步驟到實際應用進行系統解析。 一、t檢驗的…

Web4X·AI實業未來家庭普及產品矩陣

Web4XAI實業未來家庭普及產品矩陣 > 打造一個“AI能干活、人更自由”的超級生活系統&#xff08;web4-web4.0&#xff09; 一、AI生活服務類 1、代表產品&#xff1a; ? AI語音助手&#xff08;對話、提醒、天氣、家庭調度&#xff09; ? AI陪護機器人&#xff08;老…

Centos上搭建 OpenResty

一、OpenResty簡介 OpenResty 是基于 Nginx 的擴展平臺&#xff0c;完全兼容 Nginx 的核心功能&#xff08;如 HTTP 服務和反向代理&#xff09;&#xff0c;同時通過內嵌 LuaJIT 支持&#xff0c;允許開發者用 Lua 腳本靈活擴展業務邏輯。它簡化了動態邏輯的實現。 二、安裝…

項目管理進階:基于IPD流程的項目管理部分問題及建議書【附全文閱讀】

該文檔主要探討了研發項目管理中存在的問題及改進建議。指出項目組織、項目計劃、項目監控等方面存在的問題&#xff0c;并給出了相應的設計要點。建議建立跨部門、全流程的項目計劃體系&#xff0c;加強風險管理&#xff0c;引入科學的估計方法&#xff0c;建立項目歷史數據積…

JVM之GC常見的垃圾回收器

收集器適用區域特點適用場景Serial新生代單線程&#xff0c;STW&#xff08;Stop-The-World&#xff09;客戶端小應用Parallel Scavenge新生代多線程&#xff0c;吞吐量優先后臺計算任務ParNew新生代Serial 的多線程版配合 CMS 使用CMS老年代并發標記&#xff0c;低延遲響應優先…

免費私有化部署! PawSQL社區版,超越EverSQL的企業級SQL優化工具面向個人開發者開放使用了

1. 概覽 1.1 快速了解 PawSQL PawSQL是專注于數據庫性能優化的企業級工具&#xff0c;解決方案覆蓋SQL開發、測試、運維的整個流程&#xff0c;提供智能SQL審核、查詢重寫優化及自動化巡檢功能&#xff0c;支持MySQL、PostgreSQL、Oracle、SQL Server等主流數據庫及達夢、金倉…

HTTP/HTTPS與SOCKS5協議在隧道代理中的兼容性設計解析

目錄 引言 一、協議特性深度對比 1.1 協議工作模型差異 1.2 隧道代理適配難點 二、兼容性架構設計 2.1 雙協議接入層設計 2.2 統一隧道內核 三、關鍵技術實現 3.1 協議轉換引擎 3.1.1 HTTP→SOCKS5轉換 3.1.2 SOCKS5→HTTP轉換 3.2 連接管理策略 3.2.1 智能連接池 …

3DGS——基礎知識學習筆記

1.什么是3D高斯潑濺&#xff08;3D Gaussian Splatting&#xff09;&#xff1f; 目標&#xff1a;從一組稀疏的3D點&#xff08;比如通過相機或激光雷達采集的點云&#xff09;重建出高質量的3D場景&#xff0c;并支持實時渲染。 核心思想&#xff1a;用許多“3D高斯分布”&…

【C++】不推薦使用的std::allocator<void>

文章目錄 不推薦使用的std::allocator<void>1. 核心區別2. 成員函數對比(1) allocate 和 deallocate(2) construct 和 destroy 3. 設計動機(1) std::allocator<T>(2) std::allocator<void> 4. 使用場景示例(1) std::allocator<int>(2) std::allocator&…

Go 語言云原生微服務全棧實戰:Docker 鏡像優化、K8s 編排與 Istio 流量治理

本系列文章將以 Go 語言為主導開發語言&#xff0c;系統性地講解如何從零構建一個基于微服務架構的應用系統&#xff0c;涵蓋以下核心模塊&#xff1a; 使用 Go 構建高性能微服務構建精簡且高效的 Docker 鏡像利用 Kubernetes 進行微服務編排與部署通過 Istio 實現微服務的流量…

windows下authas調試tomcat

一般情況下&#xff0c;我們只需要輸入以下代碼 java -jar authas.jar調試tomcat時需要加上進程號 java -jar authas.jar <PID> 此外&#xff0c;如果你使用的是 Java 11 或更高版本&#xff0c;你需要添加 --add-opens 參數&#xff0c;以便 Arthas 能夠訪問 JVM 的內…

01_springboot中bean的生命周期

文章目錄 bean的生命周期1. Bean定義階段2. Bean實例化階段3. 屬性賦值階段4. 初始化階段5. 使用階段6. 銷毀階段 bean的生命周期 在Spring Boot中&#xff0c;Bean的生命周期包括定義、實例化、屬性賦值、初始化、使用和銷毀等階段。下面我將詳細解釋這些階段&#xff0c;并提…

Oracle基礎知識

目錄 1.別名的使用 2.AND的優先級高于OR 3.where后面可以接別名&#xff0c;order by后面不可以 4.Oracle中SQL的執行順序(重點) 5.dual萬用表 6.是否區分大小寫 7.Oracle常用數據類型 8.Oracle常用函數 (1)length字符、lengthb字節和cast強制類型轉換 (2)數據類型轉…

React 播客專欄 Vol.13|樣式不難搞,Tailwind CSS 與 SVG 實戰入門

&#x1f44b; 歡迎回到《前端達人 React 播客書單》第 13 期&#xff08;正文內容為學習筆記摘要&#xff0c;音頻內容是詳細的解讀&#xff0c;方便你理解&#xff09;&#xff0c;請點擊下方收聽 視頻版&#xff1a; 文字版&#xff1a; 今天我們進入樣式化的實戰環節&…

matlab慕課學習3.5

于20250520 3.5 用while 語句實現循環結構 3.5.1while語句 多用于循環次數不確定的情況&#xff0c;循環次數確定的時候用for更為方便。 3.5.2break語句和continue語句 break用來跳出循環體&#xff0c;結束整個循環。 continue用來結束本次循環&#xff0c;接著執行下一次…