1、绪论
数字签名(Digital Signature),也称电子签名,是指附加在某一电子文档中的一组特定的符号或代码。它利用密码技术对该电子文档进行关信息提取并进行认证形成,用于标识签发者的身份以及签发者对电子文档的认可,并能被接收者用来验证该电子文档在传输过程中是否被篡改或伪造。
数字签名是非对称密钥加密技术与数字摘要技术的应用。
数字签名技术一般分为带仲裁和不带仲裁的两类。如果使用对称密钥进行数字签名,则必须使用仲裁者,非对称可以不带仲裁。
2、数字签名特点
为了满足身份认证、数据完整性和不可否认性等需求,数字签名具有以下特点:
- 可信性;
- 不可重用性;
- 不可改变性;
- 不可伪造性;
- 不可否认性。
3、数字签名流程
数字签名流程简要介绍如下:
- 发送方用一个哈希函数 H a s h ( ) Hash() Hash()将要发送的消息生摘要(一串数字),然后用发送方的私钥对这个摘要进行加密,这个加密后的摘要将作为消息的数字签名和消息一起发送给接收方;
- 接收方首先用与发送方一样的哈希函数从接收到的原始消息中计算出消息摘要,接着用公钥对消息附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该消息是发送方的。
使用数字签名的好处在于:
- 确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。
- 确定消息的完整性:因为数字签名使用了哈希函数,消息如果发生稍微改变,摘要的值将发生变化。
一次数字签名涉及到一个哈希函数 H a s h ( ) Hash() Hash()、接收方的公钥、发送方的私钥。
4、基于RSA的签名方案
RSA的签名方案流程如下:
-
1)生成公私密钥对
①选取两个大素数 p p p、 p p p,计算 n = p q n=pq n=pq及 n n n的欧拉函数 φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n) = (p-1)(q-1) φ(n)=(p−1)(q−1);
②随机选取整数 e ( 1 < e < φ ( n ) ) e(1<e<\varphi(n)) e(1<e<φ(n))作为公钥,满足 gcd ( e , φ ( n ) ) = 1 \gcd(e,\varphi(n))=1 gcd(e,φ(n))=1,即 e e e 与 φ ( n ) \varphi(n) φ(n)互素;
③使用Euclid扩展算法计算私钥: d ≡ e − 1 m o d φ ( n ) d \equiv e^{-1} \mod \varphi(n) d≡e−1modφ(n),即 e e e 的逆元(先选择 e e e再确定 d d d的原因是:加密的重要性大于解密的重要性)。 -
2)签名过程
设待签名的消息为 m m m,签名者利用安全的 H a s h Hash Hash函数产生消息摘要 h = H a s h ( m ) h=Hash(m) h=Hash(m),然后计算签名: s ≡ h d m o d n s \equiv h^d\mod n s≡hdmodn。 -
3)验证过程
签名接收者收到消息 m m m和签名 s s s,计算消息摘要 h = H a s h ( m ) h=Hash(m) h=Hash(m),然后,检验等式 h m o d n ≡ s e m o d n h \mod n \equiv s^e \mod n hmodn≡semodn。若成立,则签名有效;否则签名无效。
签名时使用 H a s h Hash Hash函数可以防止利用同态的伪造攻击,有很好的抗攻击性。
RSA签名方案存在签名可重用的问题,同一消息在不同时刻签名不应是相同的。
RSA签名方案还存在签名可重用的问题,同一消息在不同时刻签名不应是相同的。这个问题可以通过在签名中引人随机数来解决。
5、基于椭圆曲线的签名方案
基于椭圆曲线(Elliptic Curve)的签名是基于椭圆曲线的非对称密码体制在数字签名中的一个实现方案,即在椭圆曲线有限域上实现签名算法,其安全性依赖于椭圆曲线的有限域上的离散对数难题。
与RSA数字签名相比,在相同的安全强度条件下,基于椭圆曲线的签名方案签名长度短、存储空间小、计算速度快,特别适用于计算能力和存储空间有限、带宽受限、要求高速实现的场合。
基于椭圆曲线的签名方案流程如下:
-
1)生成公私密钥对
选择椭圆曲线 E E E一点 G ∈ E G\in E G∈E, G G G的阶为满足安全要求的素数 n n n,即 n G = O nG=O nG=O。
选取一个随机数 d ∈ [ 1 , n − 1 ] d∈[1,n-1] d∈[1,n−1],计算 P B P_B PB使得 P B = d G P_B=dG PB=dG,那么公钥为 ( E , n , G , P B ) (E,n,G,P_B) (E,n,G,PB),私钥为 d d d。 -
2)签名过程
用户随机选取整数 k ∈ [ 1 , n − 1 ] k∈[1,n-1] k∈[1,n−1],计算 k G = ( x , y ) kG=(x,y) kG=(x,y), r ≡ x m o d n r≡x\mod n r≡xmodn;
待签名的消息为 m m m,计算 e = H a s h ( m ) e=Hash(m) e=Hash(m);
计算 s ≡ ( e + r d ) k − 1 m o d n s≡(e+rd)k^{-1} \mod n s≡(e+rd)k−1modn,如果 r = 0 r=0 r=0或 s = 0 s=0 s=0,则另选随机数 k k k,重新执行上面的过程,消息 m m m的签名为 ( r , s ) (r,s) (r,s)。 -
3)验证过程
签名接收者收到消息 m m m和签名 ( r , s ) (r,s) (r,s);
计算 e = H a s h ( m ) e=Hash(m) e=Hash(m);
计算 u ≡ s − 1 e m o d n u≡s^{-1}e\mod n u≡s−1emodn, v ≡ s − 1 r m o d n v≡s^{-1}r\mod n v≡s−1rmodn, ( x 1 , y 1 ) = u G + v Q , r 1 ≡ x 1 m o d n (x_1,y_1)=uG+vQ,r_1≡x_1\mod n (x1,y1)=uG+vQ,r1≡x1modn;
判断 r r r和 r 1 r_1 r1的关系,相等则签名有效,否则无效。
6、数字签名与区块链
数字签名在区块链技术中起到了核心的作用,特别是在确保交易的完整性和不可否认性方面。在区块链中每一个区块都保存了上一个区块的哈希值。
基本原理:
- 当在区块链上发送一个交易时,首先创建一个交易的描述,包括发送者的地址、接收者的地址、金额等信息。
- 发送者使用他们的私钥对这个交易描述进行签名,生成数字签名。
- 交易(包括交易描述和数字签名)被发送到网络,并由网络中的其他参与者(例如比特币中的矿工)验证。
交易的验证:
- 网络中的验证者使用发送者的公钥来验证数字签名。如果签名验证通过,这意味着交易确实来自声称的发送者并且没有被篡改。
- 另外,验证者还会检查发送者是否拥有足够的资金来完成交易。
区块的创建:
- 一旦交易被验证,它会被放入待打包的交易池。
- 矿工或验证者将这些交易打包成一个新的区块。
- 新区块包含了这些交易的信息以及前一个区块的哈希值。这种链接方式确保了所有区块的连续性和不可更改性。
区块的添加:
- 新创建的区块会被添加到区块链上,成为链的一部分。
- 一旦区块被添加到链上,其中的交易就被认为是已确认的,并且难以更改。因为要更改一个区块中的信息,你不仅需要更改那个区块,还需要更改它之后的所有区块,这在计算上是非常困难的。
数字签名确保了区块链上的每个交易的真实性和完整性。同时,通过将每个新区块链接到前一个区块的哈希值,确保了区块链的不可更改性和安全性。
总之,数字签名和哈希函数都是区块链安全性的基石。数字签名确保交易的真实性,而哈希函数通过连续链接每个区块来确保整个链的不可更改性。