在上文介绍了ECDSA算法流程及模块划分,为了帮助一些小白弄懂啥是ECDSA,特此开一篇科普博文。

一、首先为啥要进行数字签名?

  假设Alice要将一份合同m传输给Bob,合同上附有Alice的电子纸质签名。这份合同关乎着Boss Bob跟打工人Alice谈好的打工加钱。Alice合同上表明我要月薪10个w不溜,而Alice有个黑客仇敌johor要搞Alice,

于是在合同m传输的过程中截获合同,并进行篡改,把10个w不溜改为1k。Boss Bob一看,好家伙,咋回事?请了一个免费的劳动力。

                       

  为啥会造成这样的局面?首先是合同在通过网络传输的过程中,容易遭受到第三方的截获;其次,Alice没有对这份合同做任何防护就签上了自己的电子纸质签名或着说盖上公章,不过这也没办法,Alice和Bob分居两地,

只能这样操作。

  那么数字签名就是要防止这种情况的发生,Alice通过自己的私钥对合同m进行加密,然后把公钥公开,这样可以使用公钥对合同m进行验签,查看合同是否被篡改,如果验签失败,那就说明合同被篡改了。也就是说,

数字签名不保护合同m的隐私性,只保护合同m自身的安全性,其最大的目的就是防篡改。

                

二、ECDSA是如何保护消息m的?

  首先先看我之前讲的ECDSA算法流程:

      

  一大堆东西,不看也罢。反正作为FPGAer,一定要有模块化的思想。就看Alice最后要输出什么东西就行了。

  Alice对合同m签名完,要给出(D,r,s,m,Q),其中D为椭圆曲线参数组,当然随机数种子不用给,不过给了也没事,反正第三方也不知道我用的啥方法产生随机数的(●'◡'●)

(r,s)为消息m的签名,m也合同,Q为公钥且Q=kG。k为私钥,也是Alice在区间0-n之间随便选的一个数,G为椭圆曲线基点。

  看完Alice的输出,再来看看Bob拿到这些信息做了啥。。。

  也是一大堆算法,还是看最后一步吧。Bob那边要计算到v = r才算验签成功,即合同m没有被篡改。

  即要证明v = r,在签名那里知道r = dG的x坐标,而验签那里v=X的x坐标,也就是要证明X = dG即可,

  而X=u1G+u2Q=u1G + u2kG=(u1+u2k)G。

  带入u1与 u2得:X =(ew+rwk)G=(e+rk) *wG。

  而w = s-1 mod n ,带入得:X = (e+rk)* s-1G。

  在签名部分,s=d-1(e+kr)mod n  带入之后,X = dG了。

  也就是一顿操作之后,只要v = r,就证明了X = dG,而消息m对于签名(r,s)及哈希值e特别敏感,只要有一点变动,这三种都随随之变动,那验签自然就失败了。

这样干说太抽象了,举个简单例子。Alice对合同m签名完,要给出(D,r,s,m,Q),johor对消息m篡改为m1,那么Bob得到得信息组为(D,r,s,m1,Q),当然其他参数也可以篡改,但是更容易被识破。

Bob拿着m1进行验签,首先生成的哈希值e1就对不上了签名生成的哈希值e,当然Bob得到的信息组没有提供哈希值,Bob在这一步还不知道消息被篡改。

验签第二步和第三步,计算w,u1,u2 ,这一步(r,s)没有被篡改,生成的w和u2没有问题,而因为消息被篡改,哈希值变为e1了,所以u1也跟着变了。

验签第四步,计算X,由于u1变了,那X自然也变了,也就会导致验签失败。

科普—为什么要用ECDSA加签及其数学上的验签证明的更多相关文章

  1. Java实现RSA密钥对并在加解密、加签验签中应用的实例

    一.项目结构 二.代码具体实现 1.密钥对生成的两种方式:一种生成公钥私文件,一种生成公钥私串 KeyPairGenUtil.java package com.wangjinxiang.genkey. ...

  2. php rsa 加密、解密、签名、验签

    由于对接第三方机构使用的是Java版本的rsa加解密方法,所有刚开始在网上搜到很多PHP版本的rsa加解密,但是对接java大多都不适用. 以下php版本是适用于对接java接口,java适用密钥再p ...

  3. java安全入门篇之接口验签

    文章大纲 一.加密与验签介绍二.接口验签实操三.项目源码下载   一.加密与验签介绍   大多数公共网络是不安全的,一切基于HTTP协议的请求/响应(Request or Response)都是可以被 ...

  4. 证书:数字签名和验签&加密和解密

    用的是湖北省数字证书认证管理中心的签名和加密 1.带私钥的证书,即p12格式证书(后缀为.pfx) 2.不带私钥的证书,有多种格式,通常我们使用的是cer格式证书(后缀为.cer) 一. 1.什么是对 ...

  5. js rsa sign使用笔记(加密,解密,签名,验签)

    你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...

  6. JAVA/PHP/C#版RSA验签--转

    本文是上一篇文章的兄弟篇,上篇文章介绍了客户端的sdk中如何基于JAVA/PHP/C#使用RSA私钥签名,然后服务端基于JAVA使用RSA公钥验签,客户端签名/服务端验签的模式只能帮助服务端检查客户端 ...

  7. 微信,支付宝,支付异步通知验签,notify_url

    在支付接口开发中 ,当用户支付完成之后,阿里或者微信会向我们服务器发送一个支付结果的通知,里边带有一系列参数:其中特殊的是签名类型,和签名(他们根据这些参数做出来的签名). 我们的得到这些参数之后要去 ...

  8. php 实现签名验签

    本人php菜鸟,主要使用php实现简单的签名验签功能 以下php代码使用的密钥格式为pem格式,其他证书格式可以使用openssl进行转换(未安装请实现安装): 以下是.p12文件导出pem格式公私钥 ...

  9. RSA体系 c++/java相互进行加签验签--转

    在web开发中,采用RSA公钥密钥体系自制ukey,文件证书登陆时,普遍的做法为:在浏览器端采用c++ activex控件,使用 c++的第三库openssl进行RAS加签操作,在服务器端采用java ...

随机推荐

  1. 动态路由协议与RIP配置

    一.动态路由的概述 二.RIP路由协议工作原理 三.水平分割 四.RIP路由协议v1与v2的区别 五.实验配置 一.动态路由的概述 1.定义 动态路由是指利用路由器上运行的动态路由协议定期和其他路由器 ...

  2. 海康威视摄像头入侵+fofa(CVE-2017-7921)

    海康威视摄像头入侵+fofa(CVE-2017-7921) By:Jesse 重保期间实在是太无聊,于是就找了个海康威视的摄像头日日玩,结果一玩就是一天呢哈哈哈. 1.漏洞编号 CVE-2017-79 ...

  3. release模式下打断点调试 配置选项

    最近调试一个离职的同事留下的工程,DEBUG模式下顺利,RELEASE的时候就崩溃了,显示为"帧不在模块中"--简直一头雾水 于是我修改配置,为了能够在Release模式中打断点调 ...

  4. Error in render: "TypeError: Cannot read property '' of undefined"

    描述 在用Vue的时候出现了一个令人窒息的错误 报错显示 "avatar" 未定义,但在postman中测试返回的数据确实有"avatar",可是为什么未找到? ...

  5. 探究国内CRM系统哪家公司做的最好?

    国内CRM系统哪家公司做的最好?相信这是很多人关心的话题.但这是一个伪命题,因为无论什么产品,都没有一个确定的结论来证明哪个产品最好.我们只能根据它的功能.适用性.价格等来判断哪个最合适.所以小编只能 ...

  6. 你会用哪些JavaScript循环遍历

    总结JavaScript中的循环遍历定义一个数组和对象 const arr = ['a', 'b', 'c', 'd', 'e', 'f']; const obj = { a: 1, b: 2, c: ...

  7. QT单进程下载

    QT    同步下载 #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNet ...

  8. 【笔记】Python编程 从入门到实践 第二版(基础部分)

    1 字符串相关函数 .title() # 将字符串每个单词的首字母大写 .upper() #不改变字符串变量的值 .lower() #不改变字符串变量的值 f"{var} ,字符串" ...

  9. Django 基础05篇 上下文管理和前端代码复用

    一.上下文管理器 在views中重复使用的代码,可以通过上下文管理器(在setting.py文件中的TEMPLATES中配置)中实现,减少代码冗余 上下文管理器的处理流程如下: 1.先走完views里 ...

  10. Django基础-04篇 Django开发前后端联动

    1. 写views views.py代码块 1.在前端以/article/{{ article.id }}这种方式请求后台, 参数配置在urls.py中path('category/<int:i ...