科普—为什么要用ECDSA加签及其数学上的验签证明
在上文介绍了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加签及其数学上的验签证明的更多相关文章
- Java实现RSA密钥对并在加解密、加签验签中应用的实例
一.项目结构 二.代码具体实现 1.密钥对生成的两种方式:一种生成公钥私文件,一种生成公钥私串 KeyPairGenUtil.java package com.wangjinxiang.genkey. ...
- php rsa 加密、解密、签名、验签
由于对接第三方机构使用的是Java版本的rsa加解密方法,所有刚开始在网上搜到很多PHP版本的rsa加解密,但是对接java大多都不适用. 以下php版本是适用于对接java接口,java适用密钥再p ...
- java安全入门篇之接口验签
文章大纲 一.加密与验签介绍二.接口验签实操三.项目源码下载 一.加密与验签介绍 大多数公共网络是不安全的,一切基于HTTP协议的请求/响应(Request or Response)都是可以被 ...
- 证书:数字签名和验签&加密和解密
用的是湖北省数字证书认证管理中心的签名和加密 1.带私钥的证书,即p12格式证书(后缀为.pfx) 2.不带私钥的证书,有多种格式,通常我们使用的是cer格式证书(后缀为.cer) 一. 1.什么是对 ...
- js rsa sign使用笔记(加密,解密,签名,验签)
你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...
- JAVA/PHP/C#版RSA验签--转
本文是上一篇文章的兄弟篇,上篇文章介绍了客户端的sdk中如何基于JAVA/PHP/C#使用RSA私钥签名,然后服务端基于JAVA使用RSA公钥验签,客户端签名/服务端验签的模式只能帮助服务端检查客户端 ...
- 微信,支付宝,支付异步通知验签,notify_url
在支付接口开发中 ,当用户支付完成之后,阿里或者微信会向我们服务器发送一个支付结果的通知,里边带有一系列参数:其中特殊的是签名类型,和签名(他们根据这些参数做出来的签名). 我们的得到这些参数之后要去 ...
- php 实现签名验签
本人php菜鸟,主要使用php实现简单的签名验签功能 以下php代码使用的密钥格式为pem格式,其他证书格式可以使用openssl进行转换(未安装请实现安装): 以下是.p12文件导出pem格式公私钥 ...
- RSA体系 c++/java相互进行加签验签--转
在web开发中,采用RSA公钥密钥体系自制ukey,文件证书登陆时,普遍的做法为:在浏览器端采用c++ activex控件,使用 c++的第三库openssl进行RAS加签操作,在服务器端采用java ...
随机推荐
- .Net Core 3.1简单搭建微服务
学如逆水行舟,不进则退!最近发现微服务真的是大势所趋,停留在公司所用框架里已经严重满足不了未来的项目需要了,所以抽空了解了一下微服务,并进行了代码落地. 虽然项目简单,但过程中确实也学到了不少东西. ...
- Spring学习日记03_IOC_属性注入_集合类型属性
Ioc操作Bean管理(xml注入集合属性) 注入数组类型属性 注入List集合类型属性 注入Map集合类型属性 Stu类 public class Stu { //1. 数组类型属性 private ...
- 7、resync实时备份
sersync+rsync(增量,无差异备份),resync支持多线程,效果比inotify更好,配置思想和inotify很相似 7.1.在备份服务器上安装并配置rsync服务,实现nfs共享目录,可 ...
- 9.11、mysql增量备份和增量恢复介绍
1.增量备份: 增量数据是从上次全量备份之后,更新的新数据,对于mysql来说,binlog日志就是mysql的增量数据: (1)按天进行备份: 周一00点全量备份 周二00点全量备份 ...... ...
- hdu 1540 Tunnel Warfare 线段树 区间合并
题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...
- 基于uni-app全端弹框组件uaPopup「兼容h5+小程序+app端|nvue」
uniapp兼容多端自定义模态弹框组件UAPopup ua-popup 一款轻量级的uniapp自定义弹窗组件.汇集了android.ios和微信弹窗效果(msg消息.alert提示框.dialog对 ...
- redis为什么那么快?
数据库有很多,为什么Redis能有如此突出的表现呢?一方面,因为它是内存数据库,所有操作都在内存上完成.另外一方面就要归功于他的数据结构.高效的数据结构是Redis快速处理的基础.今天我们就来聊聊了R ...
- log4j和log4j2的配置部分
log4j和log4j2的功能及形式对比 http://blog.csdn.net/fangaohua200/article/details/53561718 log4j2的proptise配置 ht ...
- jenkins报错The goal you specified requires a project to execute but there is no POM inthis directory
报错截图及详细: 15:30:29[ERROR]The goal you specified requires a project to execute but there is no POM i ...
- [网络流24题]最长k可重区间集[题解]
最长 \(k\) 可重区间集 题目大意 给定实心直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取开区间集 ...