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

目录

10  ECDSA 算法

11  创建签名

12  验证签名

13  ECDSA 的安全性

14  随机 k 值的重要性

15  结语


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

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

10  ECDSA 算法

现在让我们来谈谈 ECDSA 签名算法。

对于 ECDSA,你首先需要知道你的曲线参数,即 a、b、p、N 和 G。你已经知道 a 和 b 是曲线函数的参数:

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

还知道 p 是模数,N 是曲线的点数。但还需要知道 G 是什么。G 代表一个 “参考点” 或者说一个 “原点”,参考点可以是曲线上的任何一点。

NIST(美国国家标准与技术研究院)和 SECG(高效加密标准组)提供了预先制作和标准化的曲线参数,这些参数被认为是有保障且高效的。

私钥是一个 160 位的随机数,而公钥是曲线上的一个点,它是私钥与参考点 G 的点乘结果。设 dA 为私钥,Qa 为公钥,则有:Qa = dA * G,其中 G 是曲线参数中的参考点。

不懂 dA 和 Qa 为什么要这样大小写 😇

11  创建签名

一个签名的长度是 40 个字节,它由两个 20 字节的值组成,第一个称为 R,第二个称为 S,所以 (R, S) 共同构成 ECDSA 签名。具体流程如下:

首先,您必须生成一个随机值 k(20 字节),并使用 “点乘法” 计算 P 点:

P=k*G

P 点的 x 坐标值即为 R,它的长度是 20 个字节。

为了计算 S,您必须对消息进行 SHA1 散列,得到一个长为 20 个字节的值,我们将称之为 z 。现在您可以使用以下方程计算 S:

S = k^{-1}(z + dA * R)\ \mathrm{mod}\ p

请注意 k^{-1},它是 k 的 “模乘逆”。虽然 k^{-1} 本质上是 k 的倒数,但由于我们处理的是整数,所以这是不可能的。因此要求 k^{-1} 是一个整数,它能够使得 (k^{-1} * k) mod p 等于 1

暂时还没有学 “模乘逆”,应该就是一个求模数的方法。

再次提醒您,k 是用于生成 R 的随机数,z 是要被签署的消息的散列,dA 是私钥,R 是 k*G 的 x 坐标值,其中 G 是曲线参数的参考点。

12  验证签名

既然您已经有了签名,您想要验证它,这也是相当简单的。

您使用这个方程来计算一个点 P:

P = S^{-1}*z*G + S^{-1} * R * Qa

只要 P 点的 x 坐标值等于 R,就意味着签名是有效的,否则它就不是。

按照上述方程把 P 点计算出来,只要这个 P 点的 x 坐标值等于 R,就说明签名有效。

很简单,对吧?现在让我们看看为什么成立,这需要一些数学来验证。

我们有:

P = S^{-1}*z*G + S^{-1} * R * Qa

可以看出,算 P 点的时候只需要使用一些公开的数据,而不会涉及私钥。

其中

Qa = dA*G

因此

P = S^{-1}*z*G + S^{-1} * R * dA*G = S^{-1}(z + dA* R) * G

我们代入 P 点的坐标值有:

k*G = S^{-1} (z + dA * R) *G

我们可以通过消除 G 来简化,得到:

k = S^{-1}(z + dA * R)

通过求 k 和 S 的逆,我们得到:

S = k^{-1}(z + dA *R)

这正是用于生成签名的方程,因此等号左右两边的式子是相等的。这就是为什么您可以使用上面的第一个方程来验证签名。

签名的时候会需要使用私钥 dA,验证的时候只需要使用公钥 Qa,这就是所谓的零知识证明吧。

13  ECDSA 的安全性

因为 Qa=dA*G、P=k*G,又因为 ECDSA 的 “点乘法” 是一个陷门函数 —— 在第 9 步中解释过 —— 所以我们不能根据 Qa 和 P 来倒推 dA 或 k,这使得 ECDSA 算法是安全的。

我们没有办法找到私钥,也没有办法在不知道私钥的情况下伪造签名。

为什么 “也没有办法在不知道私钥的情况下伪造签名”?

14  随机 k 值的重要性

现在让我们讨论一下索尼在 Playstation 3 上使用的 ECDSA 签名是如何出现缺陷的,以及这是如何允许黑客获取 PS3 的 ECDSA 私钥的。

生成签名所需的方程如下:

S = k^{-1}(z + dA*R)\ \mathrm{mod}\ p,\ \ R = k*G

S 方程的强度在于它一个方程含有两个未知数,即 k 和 dA,因此无法进行求解。

然而,算法的安全性基于其实现,即确保 “k 是随机生成的” 非常重要,确保没有任何人能够猜测、计算,或者使用时序攻击或其他任何类型的攻击来找到随机值 k 。

索尼

但是索尼在实现上犯了一个巨大的错误,他们在任何地方都使用相同的 k 值。

这意味着如果你有两个签名,它们都有相同的 k,那么它们都会有相同的 R 值。同时这意味着,只要你拥有同一个人的两个签名 S 和 S',就能计算出 k 值。

首先让 S 和 S' 相减:

S-S'= k^{-1} (z+dA*R)-k^{-1} (z'+ dA*R)

整理得到

S-S'= k^{-1}(z + dA*R -z'-dA*R)= k^{-1}(z-z')

从而有

k = (z - z') / (S - S')

其中,z 和 z'、S 和 S' 都是已知的。

一旦得到了 k,那么 S 方程就只含一个未知数了,从而可以很容易地解出 dA:

dA = (S*k - z) / R

一旦得到了私钥 dA,你可以用它来签署自己的文件,而 PS3 将会认为它是索尼签名的合法文件。这就是为什么确保用于生成签名的随机数实际上是 “密码学上随机” 的非常重要的原因。

比特币

另一个例子是当一些比特币客户端在某些浏览器和某些 Android 客户端上使用非密码学随机数生成器时,这导致它们用相同的 k 值签署交易,恶意人士能够找到他们的比特币钱包私钥并盗取他们的资金。

小结

这显示了每次制作签名时使用真正随机数的重要性,因为如果你签名对的 (R, S) 中的 R 值在两个不同的签名中相同,你就会暴露私钥。

理论上,ECDSA 算法非常安全,不可能找到私钥。当然,它的前提是 “算法实现是正确的”。如果有一种方法可以找到私钥,那么每个计算机、网站、系统的安全性都可能受到威胁。

15  结语

最后!我希望这能让很多人更清楚地理解这个算法。我知道这仍然非常复杂和难以理解。我通常试图让非技术人士更容易理解事物,但这个算法太复杂了,无法用更简单的术语来解释。

但是,如果您是一名开发人员或数学家,或者您对学习此内容感兴趣,因为您想帮助或简单地获取知识,那么我相信这为您提供了开始学习或至少理解这个被称为 “ECDSA” 的未知野兽的概念的信息。

附言:在本文中,我使用了 “160位” 来讨论 ECDSA 签名,因为它通常与 160 位的 SHA1 散列值(20 字节)匹配,而且 PS3 安全机制就是使用的这种组合。但是,该算法本身可以使用任何大小的数字。本文可能存在其他不准确之处,但就像我说的,我不是专家,而且我已经尽可能地将内容简化,同时没有删除关于算法的任何信息。

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

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

相关文章

C++设计模式|创建型 2.工厂模式

1.简单工厂思想 简单工厂模式不属于23种设计模式之⼀,更多的是⼀种编程习惯。它的核心思想是将产品的创建过程封装在⼀个⼯⼚类中,把创建对象的流程集中在这个⼯⼚类⾥⾯。卡码网将其结构描述为下图所示的情况: 简单⼯⼚模式包括三个主要⻆⾊…

鸿蒙端云一体化开发--调用云函数--适合小白体制

如何实现在端侧调用云函数? 观看前,友情提示: 不知道《如何一键创建端云一体化模板》的小白同学,请看: 鸿蒙端云一体化开发--开发云函数--适合小白体制-CSDN博客 实现方法: 第一步:添加依赖 …

3D视觉引导麻袋拆垛破包 | 某大型化工厂

客户需求 此项目为大型化工厂,客户现场每日有大量麻袋拆垛破包需求,麻袋软包由于自身易变形、码放垛型不规则、运输后松散等情况,无法依靠机器人示教位置完成拆垛。客户遂引入3D视觉进行自动化改造。 工作流程: 3D视觉对紧密贴合…

libcurl 简单使用

LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP、FTP、SMTP、POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发送HTTP请求、下载文件、发送电子邮件等…

服务器数据恢复—V7000存储raid5数据恢复案例

服务器数据恢复环境: P740AIXSybaseV7000存储阵列柜,阵列柜上有12块SAS机械硬盘(包括1块热备盘)。 服务器故障: 管理员在日常巡检过程中发现阵列柜中有一块磁盘发生故障,于是更换磁盘并同步数据&#xff0…

HTTP协议安全传输教程

HTTP协议有多个版本,包括但不限于HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2和HTTP/3。这些版本各自具有不同的特点和改进,以适应网络技术的发展和满足不同的需求。例如,HTTP/1.0使用文本格式传输数据,简单易用且兼容性好,…

电路笔记 : esp32pico-d4最小系统原理图

ESP32-PICO-D4 ESP32-PICO-D4是一款基于ESP32的系统级封装(SiP)模组,可提供完整的Wi-Fi和蓝牙功能。该模组的外观尺寸仅(7.0000.100)mm(7.0000.100)mm(0.9400.100)mm,整体占用的PCB面积最小,已集成1个4MB串行外围设备接口(SPI) flash。 ESP3…

网络层协议——IP协议

目录 IP协议 IP协议格式 分片与组装 网段划分 特殊IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 路由表生成算法 IP协议 IP协议全称为“网际互连协议(Internet Protocol)”,IP协议是TCP/IP体系中的网络层协议。 在应用层我…

外卖小程序实战-接单后小票机自动打印订单

1、导入小票机的sdk https://www.feieyun.com/api/API-JAVA.zip public static String addprinter(String snlist){//通过POST请求,发送打印信息到服务器RequestConfig requestConfig RequestConfig.custom() .setSocketTimeout(30000)//读取超时 .setConnectTi…

DePIN打猎之旅:AI算力作饵,道阻且长

出品|OKG Research 作者|Hedy Bi 香港Web3嘉年华已告一段落,然而Web3自由的脉搏还在跳动,并不断向其他行业渗透。和上一轮周期相比,本轮牛市开启的逻辑是由“原生创新叙事”转变成“主流认可,资金驱动”的…

C语言详解指针

目录 一、指针的概念 1.1内存与地址 例子: 二、变量的指针与指针变量 2.1、指针变量的定义及使用 1、指针变量的定义 2、指针变量的使用 2.2 指针变量的大小 2.3、指针-整数 2.4、void*指针 三、指针的运算 1、指针- 整数 2、指针-指针 3、指针的关系运…

一套3种风格经典的wordpress免费主题模板

wordpress免费企业主题 https://www.wpniu.com/themes/39.html 免费wordpress企业模板 https://www.wpniu.com/themes/43.html 免费wordpress企业主题 https://www.wpniu.com/themes/44.html

使用docker部署数据可视化平台Metabase

目前公司没有人力开发数据可视化看板,因此考虑自己搭建开源可视化平台MetaBase。在此记录下部署过程~ 一、镜像下载 docker pull metabase/metabase:latest 运行结果如下: 二、创建容器 docker run -dit --name matebase -p 3000:3000\ -v /home/loc…

Python编程之旅:深入探索强大的容器——列表

在Python编程的世界中,容器(Containers)是一种用于存储多个项目的数据结构。其中,列表(List)是最常用且功能强大的容器之一。无论是初学者还是资深开发者,掌握列表的使用方法和技巧都是提升Pyth…

四.吊打面试官系列-数据库优化-Mysql锁和事务原理

前言 本篇文章主要讲解两块内容:Mysql中的锁和ACID原理,这2个部分是面试的时候被问的蛮多的看完本篇文章之后相信你对Mysql事务会有更深层次的理解,如果文章对你有所帮助请记得好评 一.Mysql中的锁 1.锁的分类 在Mysql中锁也分为很多种&a…

揭秘AI精准输出:如何构建完美的AIGC提示词?

揭秘AI精准输出:如何构建完美的AIGC提示词?🤖 文章目录 揭秘AI精准输出:如何构建完美的AIGC提示词?🤖摘要引言正文📘 提示词的基本概念1. 什么是提示词?2. 提示词的作用 &#x1f4d…

Redis安装和使用(Ubuntu系统)

本节内容包括Redis简介、安装Redis和Redis实例演示等,Redis在Window系统安装教程可参考Redis安装与运行_厦大数据库实验室博客 Redis是一个键值(key-value)存储系统,即键值对非关系型数据库。Redis提供了Python、Ruby、Erlang、P…

【面试八股总结】排序算法(二)

参考资料 :阿秀 一、堆排序 堆排序基本思想是先把数组构造成一个大顶堆(父亲节点大于其子节点),然后把堆顶(数组最大值,数组第一个元素)和数组最后一个元素交换,这样就把最大值放到了数组最后边。把数组长度n-1,再进行构造堆把剩…

开源AI聊天机器人应用程序模板; WrenAI用AI从数据中获取洞见;模拟多个代理人(agents)之间语言互动的仿真系统;语音数据集标注

✨ 1: gemini-chatbot 使用Next.js构建的开源AI聊天机器人应用程序模板 Gemini-chatbot是一个使用Next.js构建的开源AI聊天机器人应用程序模板。它利用了Vercel AI SDK、Google Gemini以及Vercel KV来提供一个功能丰富、可定制的聊天体验。这个聊天机器人可以支持多种不同的A…

GitHub repository - commits - branches - releases - contributors

GitHub repository - commits - branches - releases - contributors 1. commits2. branches3. releases4. contributorsReferences 1. commits 在这里可以查看当前分支的提交历史。左侧的数字表示提交数。 2. branches 可以查看仓库的分支列表。左侧的数字表示当前拥有的分…