【应用密码学】实验五 公钥密码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,py)。

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.mzph.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 应…