如何给小学生讲清楚ECC椭圆曲线加密
对于RSA这套公私钥加密的思路,我以为我挺明白的,运用的娴熟自如。
当然现在RSA用的不多,而是基于ECC曲线来做签名验签,最大名鼎鼎的莫过于比特币。
可是前两天和别人讲代码,被问了ECC为什么可以用来做验签,发现自己讲不清楚。
所以做了点功课,来把这个问题讲清楚。
首先我们跳过ECC曲线是个啥这个话题,这部分我觉得对理解这个逻辑,帮助并不大,黑盒掉就好了。
因为我们是程序员,有类型这样的表述神器,非常清晰,你一点都不用害怕。
只说原理,非伪代码,比如关于曲线阶数不说不影响理解原理,我就不说了。
ECC曲线加密核心原理
下面我们讲的,都在同一条曲线上,这条曲线上的点支持一种乘法运算
设 Q 为曲线上一点
若点R = Q * Q,也可以记为 R=2.Q
若点R =Q*Q*Q,可以记为 R =3.Q
若点R =Q*Q*……*Q ,一共n个Q,则可以记为R=n.Q
然后原理来了
给定n 和 Q 求 R 很容易,给定R 和 Q,则非常难求出n
就这一条原理,然后其他的都是证明出来的。
公钥和私钥
先复习一下原理
设Q为曲线上一点,k为一个整数
令点K = k.Q,若给定 k 和 Q,很容易求出 K
若给定 K 和 Q ,很难求出k
我换个说法给你看
设G为曲线上一点,k为私钥
令公钥K=k.G, 若给定私钥和G,很容易求出公钥
若给定公钥和G,很难求出私钥
是不是有点意思了,从这里我们也可以看出,ECC的私钥就是一个整数,一个很大很大的整数,Int64 别提了,常用的ECC算法,私钥是一个256bit的整数
而ECC的公钥是一个点,虽然平常看到他们不是字符串就是bytearray,但是私钥是整数,公钥是一个点(二维坐标)
ECC曲线有很多应用,最常用的是加密解密和签名验证
加密原理
加密步骤,先设 K=k.G,(公钥=约定点G阶乘私钥)。
1. 欲传递的数据m,先把他编码为一个坐标点M(怎么编码是你的事,比如一个字符串,你把他先bytes,然后变成大整数,当坐标的x坐标,纯属举例)
2. 整个随机整数r
3. 计算点 C1 = M+r.K看到这里肯定有点晕,这里出现了点的加法,还有r.K,r.K 就是 r 个 K相乘,K是公钥。就是 点C1 等于 r个公钥相乘加上坐标点M
4. 计算点C2 = r.G G是曲线上面约定好的一点,就是k=k.G(公钥=约定点G阶乘私钥)那个G,r是前面的随机整数
加密完成,可以看出加密需要公钥,加密将坐标点M 加密为 C1 C2 两个坐标点
加密者只需发送C1 C2 给对方
解密步骤
1. 由C1=M+r.K 可知 M =C1-r.K
2. 由K=k.G(公钥=私钥)将K代入上式可得 M=C1-r.k.G
3. 由C2=r.G 带入上式,可得 M=C1-k.(r.G)=C1-k.C2
4. 据上面推导的结论 M=C1-k.C2,则解密者根据收到的C1,C2,用自己的私钥,可以计算出加密坐标点M
签名验证原理
签名步骤,先设 K=k.G,(公钥=约定点G阶乘私钥),设欲签名数据为m,签名用私钥
1. 对欲签名数据进行处理 e=hash(m),e是一个巨大整数,Hash 算法不用解释了吧,m是必选,ECSDA实现中还把一个坐标放进去一起算hash,为了便于理解原理,我就不代入那些了,只说e
2. 整个随机整数r
3. 计算s=r-e*k,这个式子纯粹是整数运算,结果s当然也是整数 ,s=随机数减去 hash*私钥,就这个意思。
签名完成
通常说签名(signdata)就是指s和r两个整数。
签名者发送 s、r、公钥K,欲签名数据m,则任何人可以验签。
验签步骤,验签用公钥
1. 对欲签名数据进行处理 e=hash(m)
2. 计算点V1=r.G(就是算公钥那个点G 阶乘随机数 r)
3. 计算点V2=s.G+e.K ( 点G阶乘签名数据s 加上 公钥阶乘 )
4. 若V1=V2 则验签成功,接下来证明
5. 若数据都是对的,则s =r-e*k成立
6. 此时设s=r-e*k,V2=s.G+e.K 将s展开 得 V2=(r-e*k).G+e.K
7. V2 =r.G-e.k.G+e.K
8. 因为K=k.G,代入上式,可得V2 = r.G – e.(k.G)+e.K = r.G -e.K+e.K
9. 上式抵消e.K之后得V2=r.G,可知假设s=r-e*k时,V2=r.G =V1
10. 反之,当V1=V2时,s=r-e*k成立,数据正确
没有什么太深得东西,只是把这个原理表述出来,加深自己的理解,对得起区块链从业者这个身份
最后,2018结束,大家新年快乐
如何给小学生讲清楚ECC椭圆曲线加密的更多相关文章
- ECC椭圆曲线详解(有具体实例)
前言 ECC英文全称"Ellipse Curve Cryptography" 与传统的基于大质数因子分解困难性的加密方法不同,ECC通过椭圆曲线方程式的性质产生密钥 ECC164位 ...
- 关于ECDSA/ECC(密钥加密传输)和ECDSA/ECDH(密钥磋商)
关于ECDSA/ECC(密钥加密传输)和ECDSA/ECDH(密钥磋商) 来源: https://blog.csdn.net/xueyepiaoling/article/details/6243337 ...
- ECC椭圆曲线以及计算出公钥的过程(BTC为例)
ECC概念 全称 “ Ellipse Curve Cryptography ” means “ 椭圆 曲线 密码学 ”. 传统加密方法大多基于大质数因子分解困难性来实现,ECC则是通过椭圆曲线方程式 ...
- python实现的椭圆曲线加密
我也看得云里雾里, 但是ECC和RSA并列为非对称加密双雄, 还是很有必要了解一下的. RSA是用质数分解,ECC是用离散的椭圆方程解,安全度更高. 而且,这个ECC的加法乘法规则,和普通都不一样, ...
- 椭圆曲线加密和rsa对比
最近在导师的要求下接手了基于欧洲标准的车联网项目中的安全层,需要学习密码学,以及网络安全的相关内容,这里做一个总结 引用的大部分内容为一个西安的大佬(哈哈我老家也是西安的),大佬主页:https:// ...
- 椭圆曲线密码学ECC
椭圆曲线密码学(Elliptic curve cryptography),简称ECC,是一种建立公开密钥加密的算法,也就是非对称加密.类似的还有RSA,ElGamal算法等.ECC被公认为在给定密 ...
- 椭圆曲线密码体制(ECC)简介
一.椭圆曲线的基本概念 简单的说椭圆曲线并不是椭圆,之所以称为椭圆曲线是因为他们是用三次方程来表示,并且该方程与计算椭圆周长的方程相似. 对密码学比较有意义的是基于素数域GF(p)和基于二进制域(GF ...
- ECC(Ellipse Curve Cryptography)+AES(Advanced Encryption Standard)前端通讯加密模拟(使用eccrypto-js)
前置知识 不了解对称加密与非对称加密的小伙伴可以看看下面的文章,想详细学习与区块链有关的加密算法可以戳这里 对称与非对称加密 https://blog.csdn.net/u013320868/arti ...
- [转载] TLS协议分析 与 现代加密通信协议设计
https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...
随机推荐
- python的socket解析
1.实现一对一的进行沟通交流 (1).服务端代码如下: import socket server = socket.socket() server.bind(("localhost" ...
- redis---------AOF文件异常导致的redis无法载入
AOF损坏时的对策1.若在写AOF文件时Server崩溃则可能导致AOF文件损坏而不能被Redis载入.可通过如下步骤修复: 创建一个AOF文件的备份: cp appendonly.aof appen ...
- 【DirectX12】第六章-练习
练习3. (a) //LINELIST std::array<VPosData, > posData = { VPosData({ XMFLOAT3(-2.0f, -1.0f, +1.0f ...
- 命令行神器之argparse使用笔记
示例 废话不多说直接给例子: import argparse parser = argparse.ArgumentParser(description='Imbalanced Dataset Exam ...
- dba_segements 没有所有的表的信息
这是oracle11g新增的功能,假设一个一般的用户user新建了一张表user_table,这时切换到sys用户查看dba_segments 查看user_table的信息,发现dba_segmen ...
- JAVA_Sprint学习(一)
保存用户信息的编程思维 传统的思想,就是建立一个类之后,然后将用户的姓名和密码,以及添加用户等操作都放在一个main中, 按照抽象编程的思想而言, 首先建立一个类User,用来是表示用户的具体信息Us ...
- C语言尝试在不同源文件中调用程序段
基于Visual Studio 2015 将下面两个cpp文件置于同一源文件目录下即可 源.cpp #include <stdio.h> int main() { extern int s ...
- WPF 10天修炼 第二天- XAML语言
XAML是什么 XAML是一种与.NET CLR紧密集成的声明性UI标记语言.XAML中的对象元素对应到CLR中的类型或结构.XAML命名空间对应到CLR中类的命名空间,元素类型则对应到CLR中的类型 ...
- Java_面向对象
目录 一.封装 二.继承 三.多态 四.重载与重写 五.接口与抽象类 六.继承与组合 七.初始化块 面向对象的三大特征:封装.继承.多态. 一.封装 是指将对象的状态信息都隐藏在对象内部,不允许外部程 ...
- 4327: JSOI2012 玄武密码
4327: JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老 ...