数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
数字签名涉及到区块链的认证机制,它有两个作用
1、证明消息确实是由信息发送方签名并发送出来的
2、确定消息的完整性。
通过数字签名我们主要实现了:
1、接收方能通过发送方的公钥认证发送方的身份
2、通过私钥方式签名,别人伪造不了信息的签名
3、发送方也通过私钥签名抵赖不了对信息的签名
4、通过数字摘要技术保证了数据的完整性
5、哈希函数也保证了数据不可有任何篡改
发送报文时
发送方将报文利用数字摘要技术生成报文摘要
用非对称密钥加密技术中私钥对报文摘要进行加密
将原文和加密后摘要一同发送给接收方
接收报文时
接收方利用数据摘要技术对发送方发送的原文生成报文摘要
用公钥对发送方发送的数据进行解密,得到发送生成的报文摘要
解密的报文摘要和接收方自己生成的报文摘要进行对比
相同说明信息没有被揣改
数字签名的基本算法
1、对称加密算法
对称加密指加密和解密使用相同密钥的加密算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信性至关重要。
对称加密常用的算法包括:
(1)DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;
(2)3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
(3)AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高。
2、非对称加密算法
非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。私钥保存在所有者手中,需要对外人保密不可让外人知道,公钥可以向其他信息接收方公开。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
常用的非对称加密算法包括:
(1)RSA:因由 RSA 公司发明而命名,是一个支持变长密钥的公开密钥算法,需要加密的文件块的长度也是可变的;公开密钥算法总是要依据一个数学上的难题。RSA基于大素数积难分解问题,给定两个数p、q 很容易相乘得到n,而对n进行因式分解却相对困难。
(2)ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。椭圆曲线因为用二元三次方程y^2= x^3+ ax + b来表示,类似椭圆周长计算方程而得名。公开秘钥算法要基于一个数学难题,椭圆曲线算法就是基于离散对数问题。有限域Fp上的椭圆曲线同样有加法,但已经不能给以几何意义的解释。
椭圆曲线上的加法如下定义:
无穷远点 O∞是零元,有O∞+ O∞= O∞,O∞+P=P
P(x,y)的负元是-P(x,-y),有P+(-P)= O∞
P(x1,y1),Q(x2,y2)和R(x3,y3) 有如下关系:
x3≡k2-x1-x2(mod p)
y3≡k(x1-x3)-y1(mod p)
其中若P=Q 则 k=(3x2+a)/2y1 若P≠Q,则k=(y2-y1)/(x2-x1)
考虑如下等式:
K=kG,其中 K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数,不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相对困难了。这就是椭圆曲线加密算法采用的难题,我们通常称作离散对数问题。我们把点G称为基点(base point),k(k
ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在:抗攻击性强;计算量小,处理速度快;存储空间占用小;带宽要求低。ECC的这些特点使它必将取代RSA,成为通用的公钥加密算法,所以区块链也使用了ECC。
区块链中用到的签名算法SECP256K1
区块链中生成公钥时用到的算法是SECP256K1,是一种椭圆曲线的标准化表达方式,其中256表示该椭圆曲线是256位, K代表Koblitz curve,相对应的椭圆曲线的标准换表达还有,SECP192K1,SECP192R1,SECP224K1,SECP224R1,SECP256R1,SECP384R1,SECP521R1等。
SECP256K1曲线由下述函数定义,该函数可产生一条椭圆曲线:
Y^2 = (x^3 + 7)} over (Fp)
如此选取的原因,也是为了和哈希算法SHA256的输出值相一致,以及求解离散对数的困难性。
现在描述一个利用椭圆曲线进行加密通信的过程:
用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。
用户A选择一个私有密钥k,并生成公开密钥K=kG。
用户A将Ep(a,b)和点K、G传给用户B。
用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M(编码方法很多,这里不作讨论),并产生一个随机整数r(r
用户B计算点C1=M+rK;C2=rG。
用户B将C1、C2传给用户A。
用户A接到信息后,计算C1-kC2,结果就是点M。因为C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M
再对点M进行解码就可以得到明文,这是区块链中用到签名算法SECP256K1的基本原理。
|
|