科普—为什么要用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 ...
随机推荐
- centos 8.3系统调优参数配置
临时设置 最大虚拟内存 [root@Sonnarqube-dev ~]# sysctl -w vm.max_map_count=262144 执行结果 vm.max_map_count = 26214 ...
- 重新整理 .net core 实践篇————缓存相关[四十二]
前言 简单整理一下缓存. 正文 缓存是什么? 缓存是计算结果的"临时"存储和重复使用 缓存本质是用空间换取时间 缓存的场景: 计算结果,如:反射对象缓存 请求结果,如:DNS 缓存 ...
- CentOS-GitLab迁移(yum至Docker)
yum备份迁移Docker版的GitLab 注:确保版本一致 1.yum备份 $ gitlab-rake gitlab:backup:create 2.执行完成后,在/var/opt/gitlab/b ...
- SpringBoot:Service层使用@Autowired 注解 mapper对象爆红问题
问题点 这个报错可能导致程序运行大面积爆红 这个报错会逼疯强迫症 解决方法 为避免程序运行报错 ,需要在Application.class添加注解@MapperScan(mapper包位置) @Spr ...
- jenkins send files or publish
1.创建一个自由风格项目 2.添加用户凭据 3.配置git 4.配置构建方式 这里选择 send files or execute command over SSH 5.配置远程发布脚本 6.构建 7 ...
- log4j和log4j2的配置部分
log4j和log4j2的功能及形式对比 http://blog.csdn.net/fangaohua200/article/details/53561718 log4j2的proptise配置 ht ...
- [zebra源码]分片语句ShardPreparedStatement执行过程
主要过程包括: 分库分表的路由定位 sql语句的 ast 抽象语法树的解析 通过自定义 SQLASTVisitor (MySQLSelectASTVisitor) 遍历sql ast,解析出逻辑表名 ...
- 脱离OBDeploy工具,手工部署OceanBase方法
[简介] OBDeploy是OceanBase集群部署的工具,可以通过简单的几行命令,就能快速的进行OceanBase部署.但对于初学者来讲,可能会比较困惑,Deploy到底做了哪些事情?里面的具体步 ...
- SDN开发环境搭建以及Mininet编程
一.实验内容 搭建如下网络拓扑,并熟悉相关指令. 二.搭建开发环境 2.1 开发环境搭建 2.1.1下载ubuntu镜像文件 镜像下载地址 https://www.ubuntu.com/downl ...
- Java基础00-内部类23
1. 内部类 内部类 1.1 内部类概述 代码示例: 1.2 成员内部类 代码示例: 创建一个成员内部类:定义时没有小括号是因为类是没有形参的.在类的成员位置,就是成员内部类了 创建测试类:这里发现不 ...