要求
使用公钥与私钥的目的就是实现安全信息传输,必须实现如下目的:
-
我发送给你的内容必须加密,在信息的传输过程中不能被别人看到。
-
必须保证是我发送的信息,不是别人冒充我的。
-
信息不能被修改。
公钥密码体制
公钥密码体制最重要的有两点:
-
它的签名的应用是比较重要的,因为对于签名来说公钥密码体制使得签名者和验证者的密钥是不同的,通过公钥对数据加密所得到的值是和私钥对数据加密所得到的值相等就可以证明,私钥可以不传输,也就在很大程度上避免了签名被伪造的可能,
-
另一个优势在于,它和对称密码体制相比较,密钥传输可以在公开信道上传输,并不害怕被攻击者看到。
它的劣势就是速度问题,因为公钥密码体制一般的操作都是模指数运算,模指数运算耗费的时间就要比对称密码体制长好多,所以说速度上的限制导致了公钥密码体制主要的运用在于加密密钥和数字签名。
如果加/解密的对象是信息,这种公钥的思想可以简单概括为:“寻找一种方法,他的正向过程(用于加密)非常简单,但逆向过程(用于解密)非常困难。”
最经典的是公开密钥密码体制RSA:求两个大数的乘积很容易,但将乘积分解为两个乘数很困难,RSA密钥长度随着保密级别提高,增加很快。
相比于RSA,椭圆曲线更在的节省内存的情况下能够提高计算量,使得更难破解。
椭圆曲线定义
由一个具有两个变量x和y的维尔斯特拉斯方程:
y^2+axy+by = x^3+cx^2+dx+e
所确定的所有点的集合外加一个无穷远点O。
(其实这个和椭圆没什么关系,叫椭圆曲线只是因为其标准式和求椭圆周长的公式相似)
在密码学中,用简化式:
y^2=x^3+ax+b P=?(p要大因为点要够多)(点相当于钥匙)
这里P是有限域,就是x和y的取值范围,P取多少,x和y的取值范围就是0到P值,(只能取正整数)
一些基本概念
取模运算(取余)
无穷远点(是定义的)(p如果有q作为p的逆原,p+q就是无穷远点)就是单位元
单位元(一个数加他等于本身)
乘法的单位元是1(任何数乘1=本身)
加法逆原(x不变,y取反)
椭圆曲线内任意两点相加的计算
P(x1,y1)、q(x2,y2)(都满足式子)
p+q=m(算m的公式拍了)
先算还是先模p是一样的
p(a,b)的点,可以算出2p,3p,10p
当p+9p=o是,10p称做阶,无穷远点
比特币用的是p=q的时候
公钥和私钥产生算法
-
选择一个椭圆曲线,构造一个椭圆曲线Abel群;
-
在群中挑选生成元点G,G应满足nG=O的最小n是一个非常大的素数。
-
选择一个小于n的整数n'作为私钥,然后产生其公钥P=n'G,则用户的公钥为(E,n,G,P),私钥为n'。
基础变量
- <t,T>是支付用户的秘钥对,其中小写t是私钥(随机生成的256bit的数),大写T是公钥(坐标)(私钥,和G运算=公钥)
- <k,K>是随机的秘钥对,其中小写k是私钥,大写K是公钥(每次签名都随机生成一次,不储存)
- G 是椭圆曲线的基点(定死了的)
- K 的坐标为 (x,y)
- n 是最大阈值
- data 是加解密数据
则签名的生成过程
- 令 r = x % n
- 令 e = SHA-1(data)
- 令 s = (1/k)(e + t·r) % n
- 则对数据data的签名为(r,s)
- r是大k的x坐标
- s=k的逆
接收者验证签名的正确性
- 计算 e = SHA-1(data)
- 计算 w = 1/s % n
- 计算 u1 = e·w % n, u2 = r·w % n
- 计算 X = u1·G + u2·T
- 令 v = X的横坐标 % n
- 如果 v == r,则签名有效,否则签名无效
证明过程:
- 因为 X = u1·G + u2·T
- => X = (e·w % n) * G + (r·w % n) * t * G
- => X = (e·w + r·w·t) * G % n
- => X = w * (e + r·t) * G % n
- => X = (1/s) * (e + r·t) * G % n
- 因为 s = (1/k)(e + t·r) % n 因此 k = (1/s) * (e + r·t) 代入上式
- => X = k·G % n = K % n
因此如果签名正确, X 的横坐标 % n 的值 等于 K 的横坐标 % n 的值,即等于 r的值
签名生成方,只需要将签名(s、r)、数据data、和自己的公钥T,告诉验证方,无需告知私钥,验证方既可以验证签名是否正确了