密码学学习笔记(十五):ECDSA - 椭圆曲线数字签名算法

news2024/10/7 10:19:25

椭圆曲线数字签名算法是DSA的一种椭圆曲线变体,它发明的初衷只是避免使用Schnorr签名的专利。椭圆曲线数字签名算法依赖于验证器中的私钥和主机用于验证验证器的公钥。它的缺点和DSA一样,它也没有提供安全性证明。

椭圆曲线算法

DSS(数字签名标准)定义了两种用于ECC(椭圆曲线密码学)的椭圆曲线:伪随机曲线,其系数由种子密码散列函数的输出生成;以及特殊曲线,其系数和下伏场已被选择以优化椭圆曲线运算的效率。伪随机曲线可以定义在素域GF(p)以及二进制域GF(2m)上。

素数域是包含素数p个元素的域GF(p)。这个字段的元素是以p为模的整数;场运算是根据整数模p的运算来实现的。适用的椭圆曲线的形式为y²=x³+ax+b。

密钥对生成

在ECDSA验证器能够工作之前,它需要知道自己的私钥。公钥是从私钥和域参数派生而来的。密钥对必须位于验证器的内存中。顾名思义,私钥是无法从外部世界访问的。相比之下,公钥必须是可公开读取和访问的。

启动一个随机数生成器,当其操作完成时,它会传递成为私钥d(标量)的数值。

签名计算

数字签名允许消息的接收者使用验证器的公钥验证消息的真实性。首先,使用安全散列算法将可变长度消息转换为固定长度消息摘要h(m)。

安全散列具有以下独特的特性:

1)不可逆性——从摘要中确定消息在计算上是不可行的;

2) 抗冲突-找到一个以上的消息来生成给定的摘要是不切实际的;

3)高雪崩效应消息中的任何变化都会在摘要中产生显著变化。在计算消息摘要之后,激活随机数生成器以提供用于椭圆曲线计算的值k。

k永远不能重复使用,它必须是不可预测的。否则,恢复私钥将变得十分简单。通常nonce(k值)会由密码学库在后台生成,但有时也会有算法调用方来提供。

另一种不易察觉的风险是,如果nonce(k值)不是均匀随机选取的,那么仍然存在能够立即恢复私钥的有效攻击(格攻击算法)。理论上,我们称这些类型的密钥检索攻击为完全攻破攻击。

签名由两个整数r和s组成。

以下等式表示了根据随机数k和基点G(x,y)计算r:

(x1, y1) = k × G(x, y) mod p
r = x1 mod n

若要有效,r必须不同于零。在r为0的罕见情况下,必须生成一个新的随机数k,并且需要再次计算r。
在成功计算r之后,根据等式3使用标量运算来计算s。输入是消息摘要h(m);私钥d;r以及随机数k:

s = (k^{-1} (h(m) + d * r) mod n

若要有效,s必须不同于零。如果s为0,则必须生成新的随机数k,并且需要再次计算r和s。

签名验证

签名验证是签名计算的对应部分。其目的是使用验证器的公钥验证消息的真实性。使用与签名步骤中相同的安全散列算法,计算由认证器签名的消息摘要,该消息摘要与公钥Q(x,y)以及数字签名分量r和s一起产生结果。

输入是消息摘要h(m)、公钥Q(x,y)、签名分量r和s以及基点G(x,y):

w = s-1 mod n
u1 = (h(m) * w) mod n
u2 = (r * w) mod n
(x2, y2) = (u1 × G(x, y) + u2 × Q(x, y)) mod n

如果x2等于r,则验证成功(“通过”),从而确认签名确实是使用私钥计算的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/767671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工作空间内各文件夹解析

src文件夹用来存放源代码 launch文件夹用来存放一个或多个ros节点启动文件 msg文件夹包含用户定制化消息的定义 srv文件夹包含各种服务的定义 action文件夹包含动作文件 package.xml是软件包清单文件 Cmakelists.txt文件包含编译软件包的各类指令

面试官: 说一下你做过哪些性能优化?

前言 如果你已经有 2 - 3 年以上开发经验还不懂的怎么去优化自己的项目,那就有点说不过去了,下面是我自己总结的一套通用级别的 Android 性能优化。 如果你正在找工作, 那么你需要一份 Android 高级开发面试宝典 1、 你对 APP 的启动有过研究吗? 有做过…

Spring解决数据乱码问题-spring21

乱码数据实际情况: 都出现了?????? 怎么解决: 第一步,找到web.xml配置文件。 改成name控制台就不出来了 如何解决地址方法与Controller业务参数名称不一致的情况&#xf…

Linux 之 基本工具(一)

一、粘滞位 1.背景 在现实生活中,有很多人会在同一台云服务器上共同工作,会出现这些人的某些文件需要保存但又不想保存在各自的家目录下且这些文件需要共给其他一同工作的同事共享(可查阅)的情况,则需要将这些文件保…

Mysql表锁与行锁

Mysql锁实战 前言:什么是锁一:全局锁1.1 概念1.2 作用1.3 使用1.4 特点 二:表级锁2.1 概念2.2 分类2.2.1 表锁2.2.2 元数据锁 MDL2.2.3 意向锁 三:行级锁3.1 行锁(Record Lock)3.2 间隙锁(Gap Lock)3.3 临键锁(Next-Key Lock): 四…

redis乐观锁概念

乐观锁(又名乐观并发控制,Optimistic Concurrency Control,缩写“OCC”),是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。…

Ubuntu下安装、配置及重装CUDA教程

安装CUDA 前往Nvidia CUDA Tools官网选择对应的架构和版本下载CUDA 以如下架构和版本为例: 查看显卡驱动 nvidia-smi如果显卡驱动已经装了,那么在CUDA安装过程中不用再勾选安装driver 下载并安装CUDA wget https://developer.download.nvidia.co…

如何设计一个完美的复杂业务系统架构?

1 什么是复杂系统 我们经常提到复杂系统,那么到底什么是复杂系统。我们看下维基的定义:复杂系统(英语:complex system),又称复合系统,是指由许多可能相互作用的组成成分所组成的系统。强调了两…

字幕切分视频

Whisper 仓库地址: https://github.com/openai/whisper 可用模型信息: 测试视频:18段,总共447S视频(11段前:有11段开头有停顿的视频) Tiny: 跑完:142S ,11段前&#xf…

微服务sleuth+zipkin——链路追踪

一、链路追踪🍉 1.什么是链路追踪?🥝 在大型系统的微服务化构建中,一个系统被拆分成了许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要…

深入理解Java虚拟机(二)Java内存区域与内存溢出异常

一、前言 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是因为Java程序…

IEC 103/104

IEC101 串口通信 串口远动协议 控制区和数据区,(信息体地址,装置地址等) IEC102 电量采集 IEC103 保护设备的通信 串口 实时监测 各种故障 103协议就是用来保护装置和后台监控进行通信的。 IEC104 调度自动化系统、厂站之间的通讯 网络 帧里面多了…

Ansible Playbook剧本配置文件

一、执行文件 Playbook配置文件使用YAML语法,具有简 洁明了,结构清晰等特点。Playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表,前面介绍的ansible命令虽然可以完成各种任务&a…

学习记录——SAM、SPM

Segment Anything Model(SAM) 能分割一切的模型 2023 SAM是一个提示型模型,其在1100万张图像上训练了超过10亿个掩码,实现了强大的零样本泛化。许多研究人员认为「这是 CV 的 GPT-3 时刻,因为 SAM 已经学会了物体是什…

EFLFK——ELK日志分析系统+kafka+filebeat架构(有乌云的天反而是最美的)

文章目录 1.修改filebeat配置文件filebeat.yml收集日志转发(生产)给kafka2.修改logstash配置从kafka中消费日志,并输出到kibana前端展示 在ELFK的基础上,添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志&am…

appium自动化测试中控件坐标及控件属性获取

在appium有时会遇到content-desc中存在内容的情况,有时需要校验它的值,那么它是怎么获取的呢? driver.find_element_by_XX().get_attribute("contentDescription") 使用上边的方式可以获取到content-desc中的值。 像上图中我们其…

《3.linux应用编程和网络编程-第9部分-3.9.linux网络编程实践》3.9.6_7.soekct实践编程1_2

概念:端口号,实质就是一个数字编号,用来在我们一台主机中(主机的操作系统中)唯一的标识一个能上网的进程。端口号和IP地址一起会被打包到当前进程发出或者接收到的每一个数据包中。每一个数据包将来在网络上传递的时候…

人工智能顶会投稿截止时间汇总

一、NeurIPS 1. 会议名称及等级 Annual Conference on Neural Information Processing Systems(CCF-A)https://dblp.uni-trier.de/db/conf/nips/index.html 2. 投稿时间及接收率 https://neurips.cc/Conferences/2023/CallForPapers#OpenReview 一般…

(Linux)基础命令

帮助文档 公式功能man 命令名访问Linux手册页命令名 – helpinfo 命令名查看命令的功能,来源,选项等whatis 命令名 ls 公式功能ls [选项][目录或文件]对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及…

linux kernel单独编译某项驱动

linux内核经常涉及编译某一项驱动代码的场景,本次以网卡驱动e1000为例说明整个步骤流程。 首先编译内核驱动不必要编译整个内核,但编译的驱动代码必须要和要安装的内核版本保持一致,否则经常会出现无法加载模块。 在编译驱动前,最…