密码学基础--ECDSA算法入门

news2024/11/13 9:52:22

目录

1.ECDSA签名长度的疑惑

2.ECDSA原理

2.1 生成签名

2.2 验签过程

 2.3 签名编码问题

3.小结


1.ECDSA签名长度的疑惑

我们来看看ECDSA签名长什么样子,使用MuscleV02自动生成密钥对,并对message"0x11223344”进行签名,结果如下:

仔细看,这个签名的长度竟然来到了568bit,可是我们用的是SECP256R1,这个长度既不是256,也不是256的倍数,这里面到底有什么玄机?

今天我们就来了解一下:1)ECDSA原理;2)签名值的编码格式。

2.ECDSA原理

首先回顾下签名原理:

  • Bob 使用 Hash 函数对"Hello Alice"计算出摘要;
  • Bob 为了证明消息是自己发的,用自己的私钥对摘要进行加密,也即签名;并把消息和签名同时发送给 Alice;
  • Alice 拿到数据后,首先对"Hello Alice”使用同样 Hash 函数进行摘要计算,得到消息原始 Hash值;使用 Bob 对外公开的公钥,对签名进行解密得到待校验的 Hash 值;
  • 将上述 Hash 进行比对,如果值一致,则证明是 Bob 发送的消息。
  • 如果用其他的密钥进行签名会出现什么情况呢?
    • 如果 Bob 使用自己的公钥签名,那只有自己私钥才能验,Alice 不知道是谁发的;
    • 如果 Bob Alice 的公钥签名,虽然只有 Alice 能验证,但是由于只要是获得了 Alice 公钥的人都可以签名,不能证明是 Bob 发的。

ECDSA(Elliptic Curve Digital Signature Algorithm)就是基于椭圆曲线密码学的一种签名机制。

以SECP256R1(对应NIST P-256曲线)为例,它满足方程形如:

该方程我们用函数 T = (p,a,b,G,n,h)进行表示,其中 p 为素数,ab 为椭圆曲线参数,G为基点,n为G的阶(即多少个点),h是辅助计算因子。

根据SEC2标准定义,该曲线推荐参数如下:

在实际代码中,我们也可以看到上述参数均作为常数:

有了上述基础,我们接着看算法细节。

2.1 生成签名

ECDSA的签名总体流程一句话概括:对消息做Hash计算得到H,对H进行计算得到整数对(r,s),(r,s)根据不同编码格式输出S,作为最终签名。

我们主要讨论对H如何进行计算,具体如下:

  • 首先我们先基于曲线生成对应的公私钥对,如下:

原理也很简单,就是在上述推荐参数n中随机选择一个数d作为私钥(即上图P),然后利用基点G计算出公钥Q = d * G(xG,yG) ,故密钥对为(Q,dU)。

  • 然后继续在随机选择一个整数k(k<n),生成一个临时密钥对(Q1, k),Qt坐标为(x1,y1);
  • 令 r = x1 mod n,注意这个n不是模数,而是上述提到的固定参数n(阶),
  • 判断r是否为0,如果为0,就需要重新再次生成,

从mbedtls的示例中也可以看出这个判断过程;

  •  从上述消息摘要H中派生出整数e,来源于H的二进制表现形式下高log2n个bit,代码如下:

  •  然后套用公式

最终得到了签名(r,s),函数实现如下:

2.2 验签过程

接收者受到明文M、签名(r,s),

  • 计算M哈希值H,并根据生成过程派生出整数e;
  • 根据公式u1 = e / s mod n, u2 = r / s mod n,分别计算出u1,u2;
  • 使用发送方公钥Q,计算R = (xR,yR)= u1*G+u2*Q,如果R不是该曲线上的点,则认为签名无效;
  • 计算v = xR mod ;
  • 判断v 是否等于r,如果相等,则签名有效。

 2.3 签名编码问题

从上面签名生成过程,其实我们可以发现,不管是r还是s,它的长度都不会超过模数p,因此P-256签名(r,s)的长度最大理应为256*2 = 512bit.

但实际我们从第一节知道,该签名有568bit,总共多了56bit(7个字节)。

直觉告诉我这必然与编码格式有关。

我印象里就只记得ASN.1,所以就去翻了翻了文档,最终在DER(Distinguished Encoding Rules)里找到了答案。

DER叫做可辨别编码规则,采用TLV三元组格式进行编码,具体如下:

Tag表示真实数据结构,Length表示具体字节长度,Value则是真实数据;

它的构造可以如下图:

而我们开头看到的0x30, 刚好对应Sequence:

根据这个规则,我把刚才的签名做了如下分解:

为什么r会有前导字节00,这是因为(r,s)都是整数,r第一个字节99最高位为1,为了避免混淆,故需要添加前导字节。

为了验证正确性,我继续做了几次签名试验,分别如下:

可以初步判断,这个python库 ECDSA签名采用ASN,1 DER编码规则。

3.小结

这篇文章把ECDSA的原理讲述清楚,原理简单,难点主要是在这些计算公式的理解上;同时我们把针对数字签名的DER编码格式理了一遍。

就酱,中秋快乐!

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

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

相关文章

一款超级给力的DAW软件flstudio24.1.1.4285最新破解版!

嗨&#xff0c;音乐制作爱好者们&#xff01;今天要跟大家安利一款超级给力的DAW软件&#xff0c;它就是——fl studio24.1.1.4285最新破解版&#xff01; fl studio24.1.1.4285最新破解版简介&#xff1a;这款强大的数字音频工作站软件&#xff0c;是音乐人梦寐以求的工具。它…

Python+Pytest框架,“api_key.py文件怎么编写“?

1、在"api_keyword"文件夹下新增"api_key.py" import allure import requests import json import jsonpath from deepdiff import DeepDifffrom config import *allure.title("测试用例执行") class ApiKey:allure.step(">>>:开…

【win工具】win安装flameshot并设置截图快捷键

1.下载flameshot软件2.windows端配置flameshot快捷键3.取消win自带截图快捷键 1.下载flameshot软件 https://flameshot.org/#download installer版本为安装包 portable版本为免安装版 2.windows端配置flameshot快捷键 https://cloud.tencent.com/developer/article/2114952 W…

Java项目: 基于SpringBoot+mybatis+maven课程答疑系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven课程答疑系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

Pikachu靶场之csrf

CSRF 跨站请求伪造 CSRF入门及靶场实战 - FreeBuf网络安全行业门户 攻击者伪造恶意链接&#xff0c;诱使用户点击&#xff0c;这个链接附带了用户的认证凭据Cookie、Session等&#xff0c;执行操作如转账。 因为带了cookie、session&#xff0c;服务器认为是用户的行为。借用…

尚品汇-订单拆单、支付宝关闭交易、关闭过期订单整合(五十)

目录&#xff1a; &#xff08;1&#xff09;拆单接口 &#xff08;2&#xff09;取消订单业务补充关闭支付记录 &#xff08;3&#xff09;支付宝关闭交易 &#xff08;4&#xff09;查询支付交易记录 &#xff08;5&#xff09;PaymentFeignClient 远程接口 &#xff08…

玩转扩展库,温湿度传感器篇!—合宙Air201资产定位模组LuatOS快速入门05

随着LuatOS快速入门系列教程的推出&#xff0c;小伙伴们学习热情高涨。 合宙Air201不仅支持三种定位方式&#xff0c;还具有丰富的扩展功能&#xff0c;通过外扩BTB链接方案&#xff0c;最多可支持21个IO接口&#xff1a;SPI、I2C、UART等多种接口全部支持。 本期&#xff0c…

electron-vite vue3离线使用monaco-editor

目录 1.搭建一个 electron-vite 项目 2.安装monaco-editor和vite-plugin-monaco-editor 3.electron.vite.config.mjs配置 4.创建 worker.js并在main.js 引入 5.创建组件 MonacoVite.vue 组件 6. App.vue中引入组件 7.运行测试 1.搭建一个 electron-vite 项目 pnpm creat…

如何在算家云搭建TripoSR(三维重建)

一、模型介绍 TripoSR是由Tripo AI和Stability AI合作开发的先进开源模型&#xff0c;能在短时间内从单张图片生成高质量 3D 模型。 利用大型重建模型&#xff08;LRM&#xff09;的原理&#xff0c;TripoSR带来了关键的进步&#xff0c;大大提高了3D重建的速度和质量。模型的…

秒验HarmonyOS NEXT集成指南

开发工具&#xff1a;DevEco Studio 集成方式&#xff1a;在线集成 HarmonyOS API支持&#xff1a;> 12 集成前准备 注册账号 使用MobSDK之前&#xff0c;需要先在MobTech官网注册开发者账号&#xff0c;并获取MobTech提供的AppKey和AppSecret&#xff0c;详情可以点击查看…

基于SpringBoot+Vue的校内跑腿业务管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

使用 QEMU 模拟器运行 FreeRTOS 实时操作系统

文章目录 QEMU 官网QEMU 文档QEMU 简介QEMU 安装QEMU 命令启动虚拟机串口控制台监控命令行 FreeRTOS安装编译工具FreeRTOS 源码RISC-V-Qemu-virt_GCC 示例编译 RISC-V-Qemu-virt_GCC启动虚拟机运行 FreeRTOS QEMU 官网 https://www.qemu.org/ QEMU 文档 https://www.qemu.or…

爆品只是日百商家的表面“风光”

前不久&#xff0c;#大学生买爆台州商家的移动收纳筐#的话题上了热搜。现在的大学生相比以前讲究多了&#xff0c;虽然生活费没涨多少&#xff0c;但生活一定要精致。比如&#xff0c;在有限的预算内买各种收纳神器&#xff0c;把宿舍整理地井井有条。 爆品&#xff0c;往往成…

2024.9.14(RC和RS)

一、replicationcontroller &#xff08;RC&#xff09; 1、更改镜像站 [rootk8s-master ~]# vim /etc/docker/daemon.json {"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io",&…

windows远程桌面连接ubuntu

通过 Windows 远程连接到 Ubuntu 的桌面环境&#xff0c;可以使用 远程桌面协议&#xff08;RDP&#xff09; 来实现远程登录。 准备工作 一台安装了 Ubuntu 的服务器或计算机。一台 Windows 电脑&#xff08;安装远程桌面客户端&#xff09;。两台机器必须在同一网络中&…

M3U8是什么,如何解析下载

M3U8是什么&#xff1f;如何解析下载 M3U8是苹果公司推出的视频播放标准&#xff0c;准确来说是一种索引文件&#xff0c;使用M3U8文件实际上是通过它来解析对应的放在服务器上的视频网络地址&#xff0c;从而实现在线播放。M3U8文件使用UTF-8字符编码。M3U8是一种常见的流媒体…

基于SpringBoot的甜品店管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的蛋糕甜品店管理系…

下载docker镜像报错,dial tcp x.x.x.x:443: connect: connection refused

原因是:国外的连接超时了. 解决方案改为阿里云的数据源 打开阿里云 搜索&#xff1a;容器镜像服务 ACR 把你自己的这个直接复制在linux sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF { "registry-mirrors": ["你自己的"] }…

接口发送 xml 格式的数据如何测试?

什么是 xml &#xff1f; xml 是一种和 html 非常类似的语言&#xff0c;采取一定的格式展示数据。比如&#xff1a; 这个例子非常形象的指明&#xff1a; 这是一个便条 便条是给你的 便条是我写的 标题是&#xff1a;提醒 内容是&#xff1a;今晚八点&#xff0c;不见不散…

【docker】docker 关键技术 —— 镜像制作

docker 镜像制作 镜像制作及原因Docker 镜像制作方式快照方式制作镜像制作命令 Dockerfile 制作镜像Dockerfile 是什么Dockerfile 格式为什么需要 Dockerfilegitee 详细使用 Dockerfile 教程 镜像制作及原因 镜像制作是因为某种需求&#xff0c;官方的镜像无法满足需求&#x…