【應用密碼學】實驗五 公鑰密碼2——ECC

一、實驗要求與目的

1.復習CCC基本概念,并根據實驗平臺提供的資料完成驗證性實驗。

2.編程練習:以書上例題小模數p為例編程實現ECC的基本運算規則。

二、實驗內容與步驟記錄(只記錄關鍵步驟與結果,可截圖,但注意排版與圖片大小)

ECC的設計思路

ECC(橢圓曲線密碼學)是一種基于橢圓曲線數學的現代加密技術,其設計思路主要圍繞橢圓曲線的代數結構和有限域上的運算特性展開。以下是詳細的設計思路:

1.橢圓曲線的選擇與點的尋找

ECC 的基礎是橢圓曲線,通常表示為 y2=x3+ax+b 的形式,其中 ab 是曲線參數。為了在有限域 Fp? 上實現 ECC,我們需要選擇一個素數 p 作為模數,并在該有限域上找到所有滿足橢圓曲線方程的整數點。這些點構成了橢圓曲線上的一個有限群,是 ECC 運算的基礎。通過遍歷 x 的所有可能值,計算對應的 y 值,并驗證其是否為二次剩余,可以準確地找到所有整數點。

2.橢圓曲線上的運算規則設計

在找到橢圓曲線上的所有點之后,需要設計橢圓曲線上的基本運算規則,這些規則是 ECC 的核心。主要包括:

點加法:定義了如何將兩個點 PQ 相加,得到一個新的點 R。點加法的計算涉及到斜率的計算和新的坐標公式,需要考慮點是否相同、是否為無窮遠點等特殊情況。

點乘法:定義了如何將一個點 P 乘以一個標量 k,即計算 kP。點乘法可以通過重復的點加法實現,通常使用雙倍和加算法來提高效率。

點的逆元求解:定義了如何找到一個點 P 的逆元 ?P。在橢圓曲線上,點 P=(x,y) 的逆元是 ?P=(x,?y),這在有限域中表示為 (x,p?y)。

3.加密與解密的實現

在主函數中,利用上述運算規則實現 ECC 的加密和解密過程。具體步驟如下:

密鑰生成:用戶輸入一個基點 G(生成元)和一個私鑰 d,計算公鑰 Q=dG

加密:用戶輸入一個隨機數 k,計算 C1?=kGC2?=M+kQ,其中 M 是明文點。

解密:使用私鑰 d 恢復明文點 M=C2??dC1?。

通過上述設計思路,ECC 能夠在較小的密鑰長度下提供高強度的安全性,同時保持高效的計算性能。這種設計不僅確保了加密和解密過程的正確性,還通過有限域上的運算特性提供了強大的安全性保障。

實驗結果如下:

三、源代碼記錄(關鍵代碼需備注)

def findsolution(p, a, b):"""找到橢圓曲線 y^2 = x^3 + ax + b 在有限域 F_p 上的所有點"""s = []cnt = 0for i in range(p):z = (i**3 + a * i + b) % pif pow(z, (p - 1) // 2, p) == 1:y1 = pow(z, (p + 1) // 4, p)s.append((i, y1))cnt += 1y2 = p - y1if y1 != y2:s.append((i, y2))cnt += 1s.append((0, 0))  # 添加無窮遠點cnt += 1s.sort()return s, cntdef point_addition(p, a, P, Q):"""橢圓曲線上的點加法"""if P == (0, 0):return Qif Q == (0, 0):return Pif P == Q:if P[1] == 0:return (0, 0)  # 無窮遠點numerator = (3 * P[0]**2 + a) % pdenominator = (2 * P[1]) % pelse:if P[0] == Q[0] and P[1] != Q[1]:return (0, 0)  # 無窮遠點numerator = (Q[1] - P[1]) % pdenominator = (Q[0] - P[0]) % p# 計算斜率 lambdalambda_ = (numerator * pow(denominator, p - 2, p)) % p# 計算新的點x3 = (lambda_**2 - P[0] - Q[0]) % py3 = (lambda_ * (P[0] - x3) - P[1]) % preturn (x3, y3)def point_negation(p, P):"""計算點的逆點"""return (P[0], p - P[1])def point_multiplication(p, a, P, k):"""橢圓曲線上的點乘法"""result = (0, 0)temp = Pwhile k > 0:if k % 2 == 1:result = point_addition(p, a, result, temp)temp = point_addition(p, a, temp, temp)k //= 2return result# 輸入參數
p = int(input("請輸入模數p:"))
a = int(input("請輸入橢圓曲線的參數a:"))
b = int(input("請輸入橢圓曲線的參數b:"))# 找到橢圓曲線上的所有點
points, point_count = findsolution(p, a, b)
print(f"橢圓曲線上的點:{points}")
print(f"點的總數:{point_count}")# 輸入生成元G和私鑰d
generator = tuple(map(int, input("請輸入生成元G(x,y) 中間需要英文逗號隔開x和y:").strip("()").split(",")))
private_key = int(input("請輸入私鑰d:"))# 驗證生成元是否在橢圓曲線上
if generator not in points:raise ValueError("輸入的生成元G不在橢圓曲線上!")# 生成公鑰
public_key = point_multiplication(p, a, generator, private_key)
print(f"公鑰Q = dG = {public_key}")# 加密
plaintext_point = tuple(map(int, input("請輸入明文點M(x,y) 中間需要英文逗號隔開x和y:").strip("()").split(",")))
k = int(input("請輸入隨機數k:"))  # 用于加密過程# 計算C1 = kG
C1 = point_multiplication(p, a, generator, k)
# 計算C2 = M + k * d * G
C2 = point_addition(p, a, plaintext_point, point_multiplication(p, a, generator, k * private_key))
print(f"加密后的密文:C1 = {C1}, C2 = {C2}")# 解密
# 計算M = C2 - k * d * G
decrypted_point = point_addition(p, a, C2, point_negation(p, point_multiplication(p, a, C1, private_key)))
print(f"解密后的明文點:{decrypted_point}")

四、實驗思考

ECC密碼算法的安全性在于什么?

答: ECC(橢圓曲線密碼學)的安全性主要基于橢圓曲線離散對數問題的計算困難性。

橢圓曲線離散對數問題(ECDLP)

ECC 的安全性依賴于橢圓曲線離散對數問題的計算難度。具體來說,給定橢圓曲線上的兩個點 PQ,其中 Q=kPk 是一個標量),在已知 PQ 的情況下,計算標量 k 是非常困難的。這種計算困難性使得 ECC 在面對攻擊時具有很高的安全性。

計算難度:與傳統的離散對數問題(如在有限域中)相比,橢圓曲線上的離散對數問題被認為更加難以解決。目前,已知的最有效的算法(如 Pollard's rho 算法)在計算復雜度上仍然非常高,這使得 ECC 在較小的密鑰長度下就能提供與傳統加密算法(如 RSA)相當的安全性。

密鑰長度優勢:由于 ECDLP 的計算難度,ECC 可以使用較短的密鑰長度來實現相同的安全級別。例如,一個 256 位的 ECC 密鑰可以提供與 3072 位 RSA 密鑰相當的安全性。這使得 ECC 在計算資源有限的環境中(如移動設備和物聯網設備)具有顯著的優勢。

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

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

相關文章

rust-candle學習筆記9-使用tokenizers加載qwen3分詞,使用分詞器處理文本

參考:about-pytorch, about-tokenizers 在魔搭社區鏈接下載qwen3的tokenizer.json文件 添加依賴庫: cargo add tokenizers tokenizers庫初體驗: use tokenizers::tokenizer::{self, Result, Tokenizer};fn main() -> Resu…

【MySQL】存儲引擎 - ARCHIVE、BLACKHOLE、MERGE詳解

📢博客主頁:https://blog.csdn.net/2301_779549673 📢博客倉庫:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正! &…

5.Redission

5.1 前文鎖問題 基于 setnx 實現的分布式鎖存在下面的問題: 重入問題:重入問題是指 獲得鎖的線程可以再次進入到相同的鎖的代碼塊中,可重入鎖的意義在于防止死鎖,比如 HashTable 這樣的代碼中,他的方法都是使用 sync…

C語言主要標準版本的演進與核心區別的對比分析

以下是C語言主要標準版本的演進與核心區別的對比分析 K&R C(1978年) 定位?:非標準化的原始版本,由Brian Kernighan和Dennis Ritchie定義 特性?: 基礎語法:函數聲明無參數列表(如int func…

【C++設計模式之Template Method Pattern】

C設計模式之Template Method Pattern 模式定義核心思想動機(Motivation)結構(Structure)實現步驟應用場景要點總結 模式定義 模式定義: 定義一個操作中的算法的骨架(穩定),而將一些步驟延遲(變化)到子類中。Template Method使得子…

【動態導通電阻】p-GaN HEMTs正向和反向導通下的動態導通電阻

2024 年,浙江大學的 Zonglun Xie 等人基于多組雙脈沖測試方法,研究了兩種不同技術的商用 p-GaN 柵極 HEMTs 在正向和反向導通模式以及硬開關和軟開關條件下的動態導通電阻(RON)特性。實驗結果表明,對于肖特基型 p-GaN 柵極 HEMTs,反向導通時動態 RON 比正向導通高 3%-5%;…

PDFMathTranslate:科學 PDF 文件翻譯及雙語對照工具

PDFMathTranslate:科學 PDF 文件翻譯及雙語對照工具 在科研和學習過程中,我們經常會遇到大量的英文 PDF 文獻,翻譯這些文獻成為了一項繁瑣且耗時的工作。PDFMathTranslate 是一款強大的科學 PDF 文件翻譯及雙語對照工具,它能夠保…

Flutter PIP 插件 ---- 為iOS 重構PipController, Demo界面,更好的體驗

接上文 Flutter PIP 插件 ---- 新增PipActivity,Android 11以下支持自動進入PIP Mode 項目地址 PIP, pub.dev也已經同步發布 pip 0.0.3,你的加星和點贊,將是我繼續改進最大的動力 在之前的界面設計中,還原動畫等體驗一…

【Ansible】之inventory主機清單

前言 本篇博客主要解釋Ansible主機清單的相關配置知識 一、inventory 主機清單 Inventory支持對主機進行分組,每個組內可以定義多個主機,每個主機都可以定義在任何一個或多個主機組內。 如果是名稱類似的主機,可以使用列表的方式表示各個主機…

基于幾何布朗運動的股價預測模型構建與分析

基于幾何布朗運動的股價預測模型構建與分析 摘要 本文建立基于幾何布朗運動的股價預測模型,結合極大似然估計與蒙特卡洛模擬,推導股價條件概率密度函數并構建動態預測區間。實證分析顯示模型在標普500指數預測中取得89%的覆蓋概率,波動率估…

【前端】【JavaScript】【總復習】四萬字詳解JavaScript知識體系

JavaScript 前端知識體系 📌 說明:本大綱從基礎到高級、從語法到應用、從面試到實戰,分層級講解 JavaScript 的核心內容。 一、JavaScript 基礎語法 1.1 基本概念 1.1.1 JavaScript 的發展史與用途 1. 發展簡史 1995 年:JavaS…

[Java實戰]Spring Boot 3 整合 Apache Shiro(二十一)

[Java實戰]Spring Boot 3 整合 Apache Shiro(二十一) 引言 在復雜的業務系統中,安全控制(認證、授權、加密)是核心需求。相比于 Spring Security 的重量級設計,Apache Shiro 憑借其簡潔的 API 和靈活的擴…

PyTorch API 6 - 編譯、fft、fx、函數轉換、調試、符號追蹤

文章目錄 torch.compiler延伸閱讀 torch.fft快速傅里葉變換輔助函數 torch.func什么是可組合的函數變換?為什么需要可組合的函數變換?延伸閱讀 torch.futurestorch.fx概述編寫轉換函數圖結構快速入門圖操作直接操作計算圖使用 replace_pattern() 進行子圖…

可觀測性方案怎么選?SelectDB vs Elasticsearch vs ClickHouse

可觀測性(Observability)是指通過系統的外部輸出數據,推斷其內部狀態的能力。可觀測性平臺通過采集、存儲、可視化分析三大可觀測性數據:日志(Logging)、鏈路追蹤(Tracing)和指標&am…

機器人廚師上崗!AI在餐飲界掀起新風潮!

想要了解人工智能在其他各個領域的應用,可以查看下面一篇文章 《AI在各領域的應用》 餐飲業是與我們日常生活息息相關的行業,而人工智能(AI)正在迅速改變這個傳統行業的面貌。從智能點餐到食材管理,再到個性化推薦&a…

Linux動態庫靜態庫總結

靜態庫生成 g -c mylib.cpp -o mylib.o ar rcs libmylib.a mylib.o 動態庫生成 g -fPIC -shared mylib.cpp -o libmylib.so -fPIC:生成位置無關代碼(Position-Independent Code),對動態庫必需。 庫文件使用: 靜態庫&…

通過user-agent來源判斷阻止爬蟲訪問網站,并防止生成[ error ] NULL日志

一、TP5.0通過行為&#xff08;Behavior&#xff09;攔截爬蟲并避免生成 [ error ] NULL 錯誤日志 1. 創建行為類&#xff08;攔截爬蟲&#xff09; 在 application/common/behavior 目錄下新建BlockBot.php &#xff0c;用于識別并攔截爬蟲請求&#xff1a; <?php name…

OpenHarmony平臺驅動開發(十五),SDIO

OpenHarmony平臺驅動開發&#xff08;十五&#xff09; SDIO 概述 功能簡介 SDIO&#xff08;Secure Digital Input and Output&#xff09;由SD卡發展而來&#xff0c;與SD卡統稱為MMC&#xff08;MultiMediaCard&#xff09;&#xff0c;二者使用相同的通信協議。SDIO接口…

使用FastAPI和React以及MongoDB構建全棧Web應用03 全棧開發快速入門

一、什么是全棧開發 A full-stack web application is a complete software application that encompasses both the frontend and backend components. It’s designed to interact with users through a web browser and perform actions that involve data processing and …

Coco AI 開源應用程序 - 搜索、連接、協作、您的個人 AI 搜索和助手,都在一個空間中。

一、軟件介紹 文末提供程序和源碼下載 Coco AI 是一個統一的搜索平臺&#xff0c;可將您的所有企業應用程序和數據&#xff08;Google Workspace、Dropbox、Confluent Wiki、GitHub 等&#xff09;連接到一個功能強大的搜索界面中。此存儲庫包含為桌面和移動設備構建的 Coco 應…