密码学 | 椭圆曲线数字签名方法 ECDSA(上)

目录

1  ECDSA 是什么?

2  理解基础知识

3  为什么使用 ECDSA?

4  基础数学和二进制

5  哈希

6  ECDSA 方程

7  点加法

8  点乘法

9  陷阱门函数!


⚠️ 原文:Understanding How ECDSA Protects Your Data.

⚠️ 写在前面:本文属于搬运博客,自己留着学习。同时,经过几天的折磨后,我对椭圆曲线已经有点基础了,因此删除了一些我认为无关紧要的原文。

1  ECDSA 是什么?

ECDSA 代表 “椭圆曲线数字签名算法”,它用于对数据(例如文件)进行签名,以便让您验证其真实性,同时不损害其安全性。ECDSA 签名与真实签名之间的区别在于,伪造 ECDSA 签名是不可能的。

您不应该将 ECDSA 与 AES(高级加密标准)混淆,后者是用来加密数据的。ECDSA不加密或阻止他人查看或访问您的数据,但它保护的是确保数据未被篡改

😽 加密是用来加密数据以防泄漏的,签名是用来验证数据是否被篡改的。在第 3 节会再次进行说明。

ECDSA 这一短语中的两个词值得注意,那就是 “曲线” 和 “算法”,因此 ECDSA 本质上都是关于数学的。这些数学知识相当复杂,所以尽管我会尝试使其易于理解,您可能仍然需要一些数学知识才能真正理解它。

2  理解基础知识

原理很简单,假设你有一个数学方程,并在图上画出它的曲线,然后你在曲线上选择一个随机点作为起点。接着你生成一个 随机数,这就是你的 私钥,你用这个 随机数和 “起点” 进行一些神秘的数学运算,你在曲线上得到第二个点,那就是你的 公钥

可以看出,公钥是由私钥决定的。

当你想要签名一个文件时,你会使用这个私钥和文件的哈希(表示文件的独特数字)进行一个神秘的方程,这将为你生成签名。签名本身分为两部分,称为 RS

为了验证签名是否正确,你只需要公钥和签名的一部分(S),将其放入另一个神秘的方程中。如果这个数学方程给了你 R,那么签名是有效的。

我们没有办法知道别人的私钥,也没有办法使用公钥创建签名。

3  为什么使用 ECDSA?

ECDSA 的应用:假设有一个 APP 不希望其数据被用户篡改或修改,比如一个只允许你加载官方地图的游戏,或者一个只允许你安装官方应用程序的手机。

在这些情况下,文件(游戏地图、数据)将使用 ECDSA 签名进行签名,公钥将与 APP /设备捆绑在一起,通过验证签名来确保数据没有被修改,而私钥则被锁在某个安全的地方。

由于你可以使用公钥验证签名,但无法使用它创建/伪造新签名,因此可以将公钥与 APP /设备一起分发而无需担心。这与 AES 加密系统形成对比,后者允许你加密数据,但你需要密钥来解密,这样的 APP 需要捆绑密钥,这就失去了目的。

4  基础数学和二进制

ECDSA 只使用 整数,不使用浮点数。

此外,数字的范围受签名中使用的 位数 的限制。正如你所知,计算机使用 “位” 来表示数据。每次你增加一位,可以表示的最大数字就会翻倍。通常 ECDSA 会使用 160 位总数,所以它能一个非常大的数字,有 49 位数字。

位数越多,可以表示的数字就越大,这意味着更高的安全性,因为很难 “猜测” 到方程中使用的关键数字。

另一个你需要知道的数学结构是 模数,它可以简单地被描述为整数除法的结果。例如,x mod 10 意味着 x 除以 10 的余数。

5  哈希

哈希是一个你应用于数据每个字节的数学方程,它会给你一个独特于你数据的数字。例如,所有字节值的总和可能被认为是一个非常简单的哈希函数。所以如果文件(消息)中的任何东西发生变化,哈希也会完全不同。

SHA1 哈希算法 的情况下,结果总是 20 字节(160 位)。它非常有用,可以验证文件是否被修改或损坏,你为任何大小的文件获得 20 字节的哈希,你可以轻松地重新计算这个哈希以确保它匹配。ECDSA 签名的是实际的哈希,所以如果数据发生变化,哈希发生变化,签名就不再有效。

签名是由私钥和文件的哈希值生成的,因此可以说签名是在对文件的哈希值进行签名。

假设有一个简单的哈希函数,它计算对所有数据求和并在结果上使用模数 10 。

文本文件是一系列字节,把文件中的每个字节加起来,然后对结果进行10的模运算,我们最终会得到一个 0 到 9 之间的数字作为最终的哈希值。对于相同的数据,我们总是得到相同的哈希,如果你改变了文件中的一个字节,结果可能就不同了。

改变文件内容后,得到相同哈希的机会是十之一。

事实上,SHA1 算法比我们简单的 “模数10” 哈希函数复杂得多,它会给出一个非常大的数字并且有一个特点,即如果文件中的单个数据位被修改,它会大大改变。

SHA1 算法的结果有 160 位,即是一个有 49 位数字的十进制数。

这使得 SHA1 成为一个非常难以预测、非常安全的哈希算法,发生 “碰撞”(即两个不同文件具有相同的哈希值)的几率非常低,几乎不可能通过伪造数据来得到特定的哈希值。

6  ECDSA 方程

ECDSA 是如何工作的呢?椭圆曲线密码学基于如下形式的方程:

y^2=(x^3+ax+b)\ \mathrm{mod}\ p

首先你注意到的是有一个模运算。模运算是一个素数(p),它确保所有的值都在 160 位范围内,并允许使用 “模平方根” 和 “模乘法逆元” 数学,这使得计算变得更加容易。

暂时还没学 “模平方根” 和 “模乘法逆元”,应该就是实现小数、负数模运算的方法 😇

由于我们的模数是 p,这意味着上述 y^2 的可能值仅在 0 到 p-1 之间,即我们一共只有 p 个可能值。此外,由于 ECDSA 只处理整数,并且只有一些数字是 “完全平方数”,即是两个整数的平方值,因此假设曲线上满足条件的点有 N 个,那么有 N < p,其中 N 是 0 到 p-1 之间完全平方数的数量。

由于 ECDSA 只处理整数,因此要求 y^2 开方后的结果必须是整数,不能带根号。又因为 y^2 开方后会得到两个结果,即一正一负且绝对值相等的数,因此原文说是 “两个” 整数。针对 “满足条件的点”,假设其坐标为 (x, y),那么 y^2 应该是一个完全平方数且其值落在 0 到 p-1 之间。

由于椭圆曲线是关于 x 轴对称的,即每个 x 对应有两个 y,因此有 N/2 个可能的 x 坐标是有效的。由上述分析可知,ECDSA 中的椭圆曲线上只有有限数量的点,这都是因为 “整数计算” 和 “模数”。

总结一下:ECDSA 方程给了我们一条包含有限个(N 个)有效点的曲线。这是因为 y 的取值受到模数(p)的限制,即 y^2 需要是一个完全平方数。又因为该曲线关于 x 轴对称,所以总共有 N/2 个可能的、有效的 x 坐标。别忘了 N < p!

7  点加法

别问我为什么要这样定义!

“点加法” 被定义为:将一个点 P 加到另一个点 Q 上,将得到一个点 S 。

当你从 P 画一条线到 Q 时,它会与曲线在第三个点 R 相交,S 是 R 的负值。

S 点就是图中 P+Q 那个点,只是没有标出来。如果你做 P+P,那么 R 点将是通过点 P 的切线与曲线相交的点。

8  点乘法

P+P+P 可以写成 (P+P)+P,即 P+P+P 是 P+P 的结果点与点 P 的加法,如下图所示。这就定义了 “点乘法”,其中 k*P 是将点 P 加到它自己的 k-1 次和上。

在上图中,你从 P 点作切线,它与曲线相交于第三个点,其对称点是 2P 点。然后,你从 2P 点画线到 P 点,它会与曲线相交于第三个点,其对称点是 3P 点。以此类推,你可以继续进行点乘法。

这就解释了为什么我们每次都要取对称点。因为如果每次都直接取交点,即所谓的 “第三个点”,那么你会发现不管怎么加来加去,得到的点始终在同一条直线上反复横跳,甚至始终都是那两个点(即 P 和 2P 的位置)。

9  陷阱门函数!

“点乘法” 的一个特点是:假设你有一个点 R=k*P,并且你知道 R 和 P 的值,你将无法找出 k 的值。这是由于没有 “点减法” 或 “点除法”,因此你不能轻松地解出 k=R/P 。

或者说,你进行数百万次 “点加法” 后到达曲线上的一个点,但反过来你是很难知道是 “如何” 到达那里的。你不能反转这个操作,也不能找到与点 P 相乘得到结果点 R 的 k 值。

这种即使知道原始点和目标点也无法找到乘数的特性,是 ECDSA 算法安全性的整个基础,这个原则被称为 “陷阱门函数”

陷阱门函数的进一步介绍可以参考:密码学 | 椭圆曲线 ECC 密码学入门(一)

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

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

相关文章

测出Bug就完了?从4个方面教你Bug根因分析

01 现状及场景 &#x1f3af; 1.缺失bug根因分析环节 工作10年&#xff0c;虽然不是一线城市&#xff0c;也经历过几家公司&#xff0c;规模大的、规模小的都有&#xff0c;针对于测试行业很少有Bug根因环节&#xff0c;主流程基本上都是测试提交bug-开发修改-测试验证-发送报…

STM32标准库+HAL库 | CPU片内FLASH存储器数据掉电读写

一、片内FLASH 在STM32芯片内部有一个FLASH存储器&#xff0c;它主要用于存储代码&#xff0c;我们在电脑上编写好应用程序后&#xff0c;使用下载器把编译后的代码文件烧录到该内部FLASH中&#xff0c; 由于FLASH存储器的内容在掉电后不会丢失&#xff0c;芯片重新上电复位后&…

ArduPilot开源飞控之ROS系统简介

ArduPilot开源飞控之ROS系统简介 1. 源由2. ROS系统3. 安装2.1 安装Docker2.2 安装ROS2 4. 总结5. 补充资料 1. 源由 之前在ArduPilot开源飞控之硬件SBC分析中讨论过&#xff0c;个人角度最推荐其中两个系统是&#xff1a; Rpanion-server【推荐&#xff0c;简单】BlueOS【推…

Unity之Unity面试题(四)

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之Unity面试题&#xff08;四&#xff09; TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取…

什么是并行通信、串行通信?什么是全双工、半双工、单工? 什么是异步通信、同步通信? 什么是RS232、RS485?什么是pwm?

什么是并行通信、串行通信&#xff1f; 嵌入式系统中的通信是指两个或两个以上的主机之间的数据互交&#xff0c;这里的主机可以是计算机也可以是嵌入式主机&#xff0c;甚至可以是芯片。主机间通信的方式一般可以分为两类&#xff1a;并行通信和串行通信。并行通信是指多个比特…

华为配置静态ARP示例

华为配置静态ARP示例 组网图形 图1 配置静态ARP组网图 静态ARP简介配置注意事项组网需求配置思路操作步骤配置文件相关信息 静态ARP简介 静态ARP表项是指网络管理员手工建立IP地址和MAC地址之间固定的映射关系。 正常情况下网络中设备可以通过ARP协议进行ARP表项的动态学习&…

论文略读:Window Attention is Bugged: How not to Interpolate Position Embeddings

iclr 2024 reviewer 打分 6666 窗口注意力、位置嵌入以及高分辨率微调是现代Transformer X CV 时代的核心概念。论文发现&#xff0c;将这些几乎无处不在的组件简单地结合在一起&#xff0c;可能会对性能产生不利影响问题很简单&#xff1a;在使用窗口注意力时对位置嵌入进行插…

华为再次布局新行业:合作伙伴已超前谋划,该领域将大有可为

华为布局新行业 华为向外界公布了一个重要信息&#xff1a;在过去的三年里&#xff0c;尽管受到美国的制裁&#xff0c;华为仍然成功地完成了超过13000个元器件的国产替代研发&#xff0c;以及4000多块电路板的迭代开发。 不仅在硬件领域取得了显著成就&#xff0c;在软件和生…

oracle 19c数据库W00n进程使用很多PGA内存资源的分析

今天&#xff0c;客户反馈测试环境的数据库PGA资源不足&#xff0c;报错ORA-04036: 实例使用的 PGA 内存超出 PGA_AGGREGATE_LIMIT&#xff1b;分析是多个W00n进程使用大量PGA-触发了BUG&#xff0c;对应解决办法就是打补丁。&#xff08;民间办法就是KILL进程、重启数据库&…

3d视图模型乱了怎么调?---模大狮模型网

在进行3D建模时&#xff0c;有时候您可能会遇到视图模型混乱的情况。这可能是由于模型结构问题、导入导出错误或编辑操作不当等原因造成的。混乱的模型不仅影响工作效率&#xff0c;还可能导致渲染结果不理想。本文将介绍六种有效的方法来调整混乱的3D视图模型&#xff0c;帮助…

【数据可视化包Matplotlib】Matplotlib基本绘图方法

目录 一、Matplotlib绘图的基本流程&#xff08;一&#xff09;最简单的绘图&#xff08;仅指定y的值&#xff09;&#xff08;二&#xff09;更一般的绘图&#xff08;同时指定x和y的值&#xff09;&#xff08;三&#xff09;增加更多的绘图元素 二、布局相关的对象——Figur…

Python 物联网入门指南(四)

原文&#xff1a;zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第九章&#xff1a;构建光学字符识别的神经网络模块 本章介绍以下主题&#xff1a; 使用光学字符识别&#xff08;OCR&#xff09;系统 使…

多种方式打开SOLIDWORKS文件

在 SOLIDWORKS 中有多种打开文件的方法。一些最常用的方法包括双击文件资源管理器中的文件或拖放到 SOLIDWORKS 窗口中。当然&#xff0c;还有一种传统的方法&#xff0c;就是在SOLIDWORKS软件上方单击打开。 使用SOLIDWORKS“打开“命令 SOLIDWORKS 中的“打开“命令与任何其…

基于springboot实现在线考试系统设计【项目源码+论文说明】

基于springboot实现在线考试管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于JavaWeb技术的在线考试系统设计与实现的开发全过程。通过分析基于Java Web技术的在线考试系统设计与实现管理的不…

Python不可变序列类型--字符串

🥇作者简介:CSDN内容合伙人、新星计划第三季Python赛道Top1 🔥本文已收录于Python系列专栏: 零基础学Python 💬订阅专栏后可私信博主进入Python学习交流群,进群可领取Python视频教程以及Python相关电子书合集 私信未回可以加V:hacker0327 备注零基础学Python 订阅专…

ObjectMapper的具体介绍与使用

文章目录 声明一、前言二、ObjectMapper与JSONObject比较1、核心主要有三个部分&#xff1a;依赖包不同 2、ObjectMapper使用概述2.1、工程的pom.xml导包信息2.2、创建案例中的测试对象2.3、对象和JSON相互转化2.3.1、测试代码2.3.2、测试结果展示 2.4、集合和JSON像话转化2.4.…

Matlab|电价型负荷需求响应(考虑电价变化)

程序复现来源于《计及需求响应消纳风电的电-热综合能源系统经济调度 》第四章内容。 一、原理 需求响应的基本原理是需求侧根据电力市场价格和电网要求改变其负荷需求以 获取一定的利益回报。其中 PDR 可通过直观的电价变化信号引导用户调节用电方式&#xff0c; 从而达到优…

Qt for Android 开发环境

在搭建环境时开始感觉还挺顺利的&#xff0c;从 Qt 配置的环境里面看并没有什么问题&#xff0c;可真正编译程序的时候发现全是错误。 最开始的时候安装了 JDK21 最新版本&#xff0c;然后根据 JDK21 安装 ndk, build-tools, Platform-Tools 和 Gradle&#xff0c;但是不管这么…

零基础自学Python,啃透这五本书就够了!

选择合适的学习资源 在自学Python的前期&#xff0c;选择一本适合初学者的Python入门书籍或在线教程&#xff0c;从基础开始学习&#xff0c;好的入门书籍或在线教程会按照逻辑顺序组织知识&#xff0c;从基础概念开始&#xff0c;逐步引导你深入学习Python编程语言。这种系统…

如何在深度学习中调用CAME

1、介绍 CAME&#xff1a;一种以置信度为导向的策略&#xff0c;以减少现有内存高效优化器的不稳定性。基于此策略&#xff0c;我们提出CAME同时实现两个目标:传统自适应方法的快速收敛和内存高效方法的低内存使用。大量的实验证明了CAME在各种NLP任务(如BERT和GPT-2训练)中的…