现代密码学 | 椭圆曲线密码学—附py代码

article/2025/6/7 23:08:46

Elliptic Curve Cryptography

椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。

椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签名算法(ECDSA)。这些签名对于确保数据的真实性和完整性至关重要。椭圆曲线迪菲-赫尔曼(ECDH)之类的协议能够在不安全的信道上实现安全的密钥交换,从而在没有预先共享密钥的情况下实现安全通信。

ECC 的吸引力在于其高效性以及使用较短密钥即可提供高级别的保护,这使其非常适合计算能力、存储和带宽有限的系统。

  • 椭圆曲线密码学能够以比RSA小得多的密钥尺寸提供相当的安全性。例如,256位的椭圆曲线密码学密钥所提供的安全性相当于3072位的RSA密钥。这使得计算速度更快,功耗更低。

  • 由于密钥尺寸较小使得椭圆曲线密码学特别适合计算能力和内存有限的设备,例如移动设备和物联网设备。也减少了加密操作期间传输的数据量,从而在带宽受限的环境中显著提升了性能。

ECC 建立在椭圆曲线理论的基础上,椭圆曲线由方程 y² = x³ + ax + b 定义,其中 a 和 b 是系数,满足 4a³ + 27b² ≠ 0 的条件以确保曲线是非奇异的。密码学中使用的椭圆曲线通常定义在有限域上(要么是素数域 Fp,要么是二进制域 F₂^m),从而曲线上的点数是有限的。

ECC 的核心原理在于椭圆曲线离散对数问题(ECDLP)的难度。简单来说,给定曲线上的两个点 A 和 B,找到满足 A = k × B 的整数 k 在计算上是不可行的。其中,× 表示椭圆曲线点乘法。正是这种难以解决性使得椭圆曲线密码学成为密码学中一种强大的工具。

py代码示例,包含密钥生成、ECDSA签名和验证功能(仅供参考)

import random
import hashlib
from typing import Tuple# 定义椭圆曲线参数(使用secp256k1曲线 - 比特币使用的曲线)
class EllipticCurve:def __init__(self):# 曲线参数:y² = x³ + a*x + b mod pself.p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2Fself.a = 0self.b = 7# 基点(生成元)self.G = (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)# 基点的阶(素数)self.n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141self.h = 1  # 余因子# 椭圆曲线点运算
class ECPoint:def __init__(self, curve: EllipticCurve, x: int = None, y: int = None):self.curve = curveself.x = xself.y = y# 检查点是否在曲线上(无穷远点除外)if x is not None and y is not None and not self.is_infinity():if (y * y) % curve.p != (x*x*x + curve.a*x + curve.b) % curve.p:raise ValueError(f"点 ({x}, {y}) 不在曲线上")def is_infinity(self) -> bool:"""检查是否为无穷远点"""return self.x is None and self.y is Nonedef __eq__(self, other) -> bool:"""检查两点是否相等"""if not isinstance(other, ECPoint):return Falsereturn self.x == other.x and self.y == other.ydef __add__(self, other):"""点加法"""curve = self.curve# 处理无穷远点if self.is_infinity():return otherif other.is_infinity():return self# 处理点与自身的加法(切线)if self == other:# 计算斜率:m = (3x₁² + a) / (2y₁) mod pif self.y == 0:  # 垂直线return ECPoint(curve)  # 返回无穷远点numerator = (3 * self.x * self.x + curve.a) % curve.pdenominator = (2 * self.y) % curve.pm = (numerator * mod_inverse(denominator, curve.p)) % curve.pelse:# 不同点的加法if self.x == other.x:  # 垂直线return ECPoint(curve)  # 返回无穷远点# 计算斜率:m = (y₂ - y₁) / (x₂ - x₁) mod pnumerator = (other.y - self.y) % curve.pdenominator = (other.x - self.x) % curve.pm = (numerator * mod_inverse(denominator, curve.p)) % curve.p# 计算新点坐标x3 = (m * m - self.x - other.x) % curve.py3 = (m * (self.x - x3) - self.y) % curve.preturn ECPoint(curve, x3, y3)def __rmul__(self, scalar: int):"""标量乘法(快速幂算法)"""# 处理无穷远点if scalar == 0 or self.is_infinity():return ECPoint(self.curve)# 使用快速幂算法result = ECPoint(self.curve)  # 无穷远点addend = selfwhile scalar:if scalar & 1:result += addendaddend += addendscalar >>= 1return resultdef __repr__(self):return f"ECPoint({self.x}, {self.y})" if not self.is_infinity() else "ECPoint(Inf)"def mod_inverse(a: int, p: int) -> int:"""使用扩展欧几里得算法计算模逆元"""# 处理特殊情况if a == 0:raise ValueError("0没有逆元")if a < 0:a = a % p# 扩展欧几里得算法t0, t1 = 0, 1r0, r1 = p, awhile r1 != 0:q = r0 // r1t0, t1 = t1, t0 - q * t1r0, r1 = r1, r0 - q * r1if r0 != 1:raise ValueError(f"{a} 在模 {p} 下没有逆元")return t0 % p# ECC密钥生成
def generate_ecc_keypair(curve: EllipticCurve) -> Tuple[int, ECPoint]:"""生成ECC密钥对"""# 随机生成私钥 (1 <= d < n)private_key = random.randint(1, curve.n - 1)# 计算公钥:公钥 = 私钥 * 基点GG = ECPoint(curve, curve.G[0], curve.G[1])public_key = private_key * Greturn private_key, public_key# ECDSA签名
def ecdsa_sign(curve: EllipticCurve, private_key: int, message: bytes) -> Tuple[int, int]:"""ECDSA签名算法"""# 计算消息哈希h = int.from_bytes(hashlib.sha256(message).digest(), 'big')h = h % curve.n  # 确保在[0, n-1]范围内if h == 0:h = 1# 生成临时密钥对k = random.randint(1, curve.n - 1)G = ECPoint(curve, curve.G[0], curve.G[1])R = k * G# 计算签名r = R.x % curve.nif r == 0:return ecdsa_sign(curve, private_key, message)  # 重新选择ks = (mod_inverse(k, curve.n) * (h + private_key * r)) % curve.nif s == 0:return ecdsa_sign(curve, private_key, message)  # 重新选择kreturn r, s# ECDSA验证
def ecdsa_verify(curve: EllipticCurve, public_key: ECPoint, message: bytes, signature: Tuple[int, int]) -> bool:"""ECDSA验证算法"""r, s = signature# 验证签名值范围if r < 1 or r >= curve.n or s < 1 or s >= curve.n:return False# 计算消息哈希h = int.from_bytes(hashlib.sha256(message).digest(), 'big')h = h % curve.nif h == 0:h = 1# 计算中间值w = mod_inverse(s, curve.n)u1 = (h * w) % curve.nu2 = (r * w) % curve.n# 计算点G = ECPoint(curve, curve.G[0], curve.G[1])P = u1 * G + u2 * public_key# 验证签名if P.is_infinity():return Falsereturn r == (P.x % curve.n)# 示例测试
if __name__ == "__main__":# 创建椭圆曲线curve = EllipticCurve()# 生成密钥对private_key, public_key = generate_ecc_keypair(curve)print(f"私钥: {private_key}")print(f"公钥: {public_key}")# 签名消息message = b"Hello, Elliptic Curve Cryptography!"signature = ecdsa_sign(curve, private_key, message)print(f"\n消息: '{message.decode()}'")print(f"签名: (r={signature[0]}, s={signature[1]})")# 验证签名is_valid = ecdsa_verify(curve, public_key, message, signature)print(f"\n签名验证结果: {'有效' if is_valid else '无效'}")# 尝试篡改消息tampered_message = b"Hello, Hacker!"is_valid_tampered = ecdsa_verify(curve, public_key, tampered_message, signature)print(f"篡改消息后验证结果: {'有效' if is_valid_tampered else '无效'} (应为无效)")# 尝试篡改签名tampered_signature = (signature[0], signature[1] + 1)is_valid_tampered_sig = ecdsa_verify(curve, public_key, message, tampered_signature)print(f"篡改签名后验证结果: {'有效' if is_valid_tampered_sig else '无效'} (应为无效)")

运行结果:

在这里插入图片描述
代码步骤:

  1. 创建椭圆曲线(secp256k1)
  2. 生成ECC密钥对
  3. 对消息"Hello, Elliptic Curve Cryptography!"进行签名
  4. 验证签名有效性
  5. 测试篡改消息和签名后的验证结果

核心功能:

  • generate_ecc_keypair:生成ECC密钥对

  • ecdsa_sign:使用私钥对消息签名

  • ecdsa_verify:使用公钥验证签名

辅助函数:

  • mod_inverse:计算模逆元(用于签名/验证)

  • 使用SHA-256作为哈希函数


http://www.hkcw.cn/article/eErijDanhs.shtml

相关文章

04 APP 自动化- Appium toast 元素定位列表滑动

文章目录 一、toast 元素的定位二、滑屏操作 一、toast 元素的定位 toast 元素就是简易的消息提示框&#xff0c;toast 显示窗口显示的时间有限&#xff0c;一般3秒左右 # -*- codingutf-8 -*- from time import sleep from appium import webdriver from appium.options.an…

C++ -- 继承

继承 1. 继承的概念及定义1.1 概念1.2 继承定义 1.2.1 格式1.2.2 继承基类成员访问方式的变化2. 基类和派生类对象赋值转换3. 继承中的作用域4. 派生类的默认成员函数5. 继承与友元6. 继承与静态成员7. 菱形继承7.1 单继承7.2 多继承7.3 菱形继承7.4 虚拟继承virtual 1. 继承的…

K8S上使用helm部署 Prometheus + Grafana

一、使用 Helm 安装 Prometheus 1. 配置源 地址&#xff1a;prometheus 27.19.0 prometheus/prometheus-community # 添加repo $ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts "prometheus-community" has been added…

湖北理元理律师事务所:系统性债务化解中的法律技术革新

一、打破债务困局的核心&#xff1a;精准责任切割 传统债务处理常陷入"全额偿还"或"逃废债"的二元对立。法律视角下的解决方案在于&#xff1a; 通过法定程序分离三类债务&#xff1a; 无效债务&#xff1a;年利率超LPR四倍部分&#xff08;《民法典》第…

Android Studio 向模拟器手机添加照片、视频、音乐

Android Studio 向模拟器手机添加照片、视频、音乐(其实都是一样的&#xff0c;只是添加到不同的文件夹&#xff09;&#xff0c;例如我们在很多程序中功能例如&#xff1a;选择头像&#xff0c;跳转到手机相册选择头像&#xff0c;此时相册为空&#xff0c;即模拟器没有图片资…

vscode使用“EIDE”和“Cortex-Debug”插件利用st-link插件实现程序烧写以及调试工作

第一步&#xff1a;安装vscode插件“EIDE”EIDE和“Cortex-Debug”。 第二步&#xff1a;配置EIDE 2.1安装“实用工具”&#xff1a; 2.2 EIDE插件配置&#xff1a;根据安装的keil C51 keil MDK IAR的相关路径设置 第三步&#xff1a;配置Cortex-Debug插件 点击settings.jso…

详解开漏输出和推挽输出

开漏输出和推挽输出 以上是 GPIO 配置为输出时的内部示意图&#xff0c;我们要关注的其实就是这两个 MOS 管的开关状态&#xff0c;可以组合出四种状态&#xff1a; 两个 MOS 管都关闭时&#xff0c;输出处于一个浮空状态&#xff0c;此时他对其他点的电阻是无穷大的&#xff…

问界M9五座零重力座椅版实车亮相 智慧出行新体验

5月31日,2025粤港澳大湾区国际汽车博览会正式开幕,问界携全系车型亮相,并举办了“问界M9大五座零重力座椅版交付仪式暨品牌挚友发布会”。赛力斯汽车总裁何利扬向五位车主交付了问界M9 2025款大五座零重力座椅版的钥匙,并宣布演员白敬亭成为问界品牌挚友及问界M8车主。何利…

【Linux】线程互斥

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲Linux——线程互斥 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C学习笔记&#xff0c;C语言入门基础&#xf…

「OC」初识runloop

「OC」初识runloop 简介 iOS中的RunLoop&#xff08;运行循环&#xff09;是事件处理的核心机制&#xff0c;负责管理线程的生命周期、事件调度及资源优化。其核心作用是通过循环处理输入事件、定时器任务和观察者回调&#xff0c;保持线程活跃且高效运行。 runloop的作用 R…

python学习打卡day43

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 浙大疏锦行 数据集使用猫狗数据集&#xff0c;训练集中包含猫图像4000张、狗图像4005张。测试集包含猫图像1012张&#xff0c;狗图像1013张。以下是数据集的下…

【AI学习从零至壹】基于深度学习的⽂本分类任务

基于深度学习的⽂本分类任务 文本分类任务的实现思路⽂本预处理文本分词Jieba分词文本分词器SentencePiece训练步骤⽂本结构化转换 语料转换为训练样本 文本分类任务的实现思路 ⽂本分类就是⼀个将⽂本分配到预定义类别的⼀个过程 整体流程包括&#xff1a; ⽂本语料的获取和…

sourcetree中的mercurial有什么用

1、安装SourceTree的过程中&#xff0c;有一个选项就是mercurial&#xff0c;&#xff0c;一直没搞明白他是干什么用的&#xff0c;直到今天 2、ai登场 3、总结 此软件无用&#xff0c;不需要安装

【Linux】linux基础指令

目录 管理用户相关useraddpaaswduserdelLinux中的用户文件结构 ls-aLinux目录中的.和..是什么&#xff1f; -l-d-FLinux指令使用多个选项 pwdcd绝对路径与相对路径 touchmkdir-p rmdir-p rm-r-i-f mancpmvecho输出重定向和追加重定向 cat-b-n-s moreless-N-i headtail管道文件搭…

Linux中shell介绍

一、脚本实践 脚本示例1 -- 直接编辑并创建一个文件 vim bak.sh-- 写入下面这句话 # 获取ip地址信息 ifconfig ens33 | grep -w inet | awk {print $2} | xargs echo "IP: "-- 运行bak文件 bash bak.sh或者-- 添加可执行权限 chmod ax bak.sh./bak.sh或者source ba…

【智能制造】精读57页智慧工厂MES 项目解决方案【附全文阅读】

本文概述了智慧工厂MES项目解决方案在工业4.0背景下的整体框架与应用。智慧工厂以企业管理运营中心为核心&#xff0c;融合战略绩效、集团管控、决策分析及大数据分析平台&#xff0c;实现C2M&#xff08;Consumer to Manufacturer&#xff09;个性化订单处理。通过信息化系统平…

Stable Diffusion 技术原理解析与代码实践

1. 引言 Stable Diffusion 是由 Stability AI 开发的开源文本到图像生成模型,自 2022 年发布以来在创意产业和研究领域引起了广泛关注。它基于潜在扩散模型架构,能够根据文本描述生成高质量的图像内容,为艺术创作、设计和内容生成提供了强大工具。 2. 技术原理详解 2.1 扩…

Cursor + Claude 4:海外工具网站开发变现实战案例

项目背景 在全球数字化浪潮中&#xff0c;海外工具网站市场蕴含着巨大的商业机会。本文将详细介绍如何使用Cursor编辑器结合Claude 4 AI助手&#xff0c;开发一个面向海外用户的多功能工具网站"ToolBox Pro"&#xff0c;并通过多元化策略实现有效变现。该项目在6个月…

AI 赋能名片设计:告别模板化,创造独特视觉风格

在商务社交与个人品牌传播中&#xff0c;名片是传递信息的重要载体&#xff0c;但千篇一律的模板设计往往让印象大打折扣。智能设计工具的出现&#xff0c;正以智能排版、创意生成和高效迭代的优势&#xff0c;颠覆传统名片设计范式。本文将推荐创客贴、Canva、Fotor 懒设计等多…

MCP:让AI工具协作变得像聊天一样简单 [特殊字符]

想象一下,你正在处理一个项目,需要从A平台查看团队讨论,从B平台获取客户信息,还要在GitHub上检查代码进度。传统做法是什么?打开三个不同的网页,在各个平台间来回切换,复制粘贴数据,最后还可能因为信息分散而遗漏重要细节。 听起来很熟悉?这正是当前工作流程的痛点所…