数字签名
数字签名(Digital Signature)是密码学中实现身份认证与数据完整性验证的核心工具,它以规范的算法流程和可验证的数学方法,鉴别签名者身份,并对电子数据内容的真实性进行认证,从而确保传输电子文件的完整性、真实性与不可抵赖性。
1、何谓数字签名
当数据在网络中传输时,可能遭受篡改、伪造或重放等威胁。为解决这些问题,可在数据后附加数字签名,使接收方通过验证数字签名即可确认数据是否完整、真实。与数据加密不同,数字签名的核心目的不是保密,而是确保信息的完整性与真实性。
1.1、数字签名的基本概念
在传统纸质环境中,手写签名用于证明签名者身份。在数字化环境中,电子文档逐渐取代纸质文件,成为信息交换的主要载体。若需证明某份电子文档确由特定主体签发,仅靠复制手写签名的图像既不安全也不可靠,因为该图像可被轻易复制并粘贴到其他文件。因此,必须引入具备抗伪造、抗抵赖特性的数字签名技术。
数字签名并非手写签名的电子化,而是基于密码学算法对消息进行处理,生成一段唯一且不可伪造的附加数据。该数据与原文一同传输,接收方通过验证即可确认消息来源及完整性,防止伪造。数字签名可解决网络安全中的消息源认证、不可否认性、数据完整性及匿名性等问题。数字签名具有以下基本特征:
- 接收方可验证签名,但无法伪造;
- 发送方事后无法否认已签名消息;
- 接收方不能否认已收到签名消息,因存在接收认证;
- 第三方可验证收发双方的消息传递过程,但无法伪造。
因此,数字签名具备消息认证、完整性校验及发送方不可否认性功能,但不提供原文加密,也不保证消息一定能被对方收到,且不直接验证接收方身份。
数字签名通常分为普通数字签名与特殊数字签名两类。普通数字签名算法包括RSA、ElGamal、ECDSA、SM2等;特殊数字签名包括盲签名、代理签名、群签名及不可否认签名等。
1.2、数字签名的工作原理
数字签名是一段只能由信息发送者生成、他人无法伪造的数字串,同时也是对发送方所发送信息真实性的数学证明。数字签名体制包括"施加签名"和"验证签名"两个环节,若对消息m产生签名s,验证它们是否为一个有效对:

其中,sig(·)为签名算法,ver(·)为验证算法。绝大多数数字签名都是使用公钥密码算法实现的。一个数字签名s附在所发送的消息m之后,并随同消息m一起被储存和传送,数字签名的基本原理如图所示。

假设发送方为A,接收方为B,设A的公钥为PKA,私钥为SKA; B的公钥为PKB,私钥为SKB。
- A使用自己的私钥对消息m进行签名运算,并发送给
B: s = Dska(m) - B收到A的数字签名
Dska(m)后,用A的公钥PKA执行验证运算:Epka(dska(m))=m。
因为除了A之外,没有人拥有A的解密私钥SKA,且A的公钥PKA和私钥SKA是成对产生的,所以用A的私钥运算后得到的密文只有用A的公钥才能得到明文消息m。这样,就证明了该消息的确来源于A, A事后也无法否认。接收方B由于不具备A的私钥,其伪造的签名无法恢复出m。
同样,若A为接收方,B为发送方,A也可以利用PKB来恢复被B用SKB加密的消息,从而验证B的签名。
1.3、数字签名的实现方式
实现数字签名的方法众多,采用较多的是公钥密码技术,如由RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准(Public Key Cryptography Standards,PKCS)、数字签名算法(Digital Signature Algorithm,DSA)、X.509、PGP等。通常,按照数字签名的执行方式可以把数字签名分为直接数字签名(Direct DigitalSignature)和仲裁数字签名(Arbitrated DigitalSignature)两种。
1)直接数字签名
直接数字签名仅由通信双方参与,并假定双方已共享秘密密钥,或接收方已知发送方的公开密钥。签名的生成方式包括:以发送方的私钥对整个消息加密,或以发送方的私 钥对消息的哈希值加密。若在此基础上,再以接收方的公开密钥(公钥体制)或收发双方共享的会话密钥(对称体制)对整个消息及其签名进行二次加密,则可进一步增强保密性。
直接数字签名的有效性完全依赖于发送方私钥的安全。若发送方欲否认已发出的消息,可声称私钥丢失或被盗,并指称其签名系他人伪造。此外,并非所有公钥算法均具备数字签名功能。
2)仲裁数字签名
直接数字签名的上述缺陷可通过仲裁数字签名加以克服。与直接数字签名类似,仲裁数字签名亦有多种实现方案,其共同操作流程如下:
发送方A对发往接收方B的消息签名后,先将消息及其签名提交仲裁者C。C完成认证后,连同"已通过认证"的指示一并转发给B。由于C的存在,A无法对已发消息予以否认。在此模式中,仲裁者承担关键角色,并需获得所有用户的充分信任。
1.4、特殊数字签名
1)盲签名
通常情况下,签名者应在对文件内容知情后再行签署。然而,在某些场景中,用户需让签名者对明文消息进行数字签名,同时又不希望签名者获知消息内容,此需求催生了盲签名。与一般数字签名相比,盲签名具有以下特性:
- 签名者无法获知明文消息。
- 验证者亦无法获知明文消息,仅能凭借签名确认消息的合法性。
- 签名者与验证者均无法将盲签名与对应的盲消息建立关联。
综上,盲签名兼具消息内容保密性与签名---消息不可关联性,能有效保护隐私,已广泛应用于基于互联网的匿名金融交易,如匿名电子现金支付系统与匿名电子拍卖系统等。
2)群签名
群签名是传统数字签名在多方环境下的延伸,由Chaum与Van Heyst于1991年首次提出。简言之,在群签名方案中,任一成员皆可代表整个群体对消息进行签名;验证者可利用唯一的群公钥核验签名;若发生争议,群管理员可"打开"签名并揭示实际签名者。群签名通过隐匿组织内部结构而具有重要价值,在政治、军事及商业领域均有广泛应用。群签名具备以下三项属性:仅群成员可代表该群签发消息;验证者可确认签名源自该群,但无法识别具体签名成员;若出现纠纷,可借助群管理员或可信机构揭示签名者身份。
群签名方案可视为由以下5个算法(或协议)构成的数字签名方案:
- 创建算法:通过输入一个随机数,能够产生群的公钥Y和群管理员的私钥S。
- 注册协议:群管理员与群成员之间的一个概率交互协议。它可使得某个用户注册为新的成员,其输出为一个群成员的身份证书以及一个只有群成员知道的私钥。
- 签名算法:群成员与签名接收者之间的协议。当输入消息m与某个群成员的身份证书和私钥后,输出消息m的签名。
- 验证算法:一个确定性算法。当输入消息m和消息的签名以及群的公钥PK后,输出关于这个签名是否有效的判定。
- 打开算法:一个确定性算法。当输入消息m和它的签名以及群管理员和私钥SK后,输出签名者的身份。
在公共资源的管理、重要军事情报的签发、重要新闻的发布、金融合同的签署等事务中,群签名都可以发挥重要作用。
3)代理签名
代理签名允许原始签名人将其签名权委托给代理签名人,由后者代表原始签名人行使该权利。一个完整的代理签名体制包含以下组成部分::
- 初始化:生成系统公共参数及用户密钥。
- 签名权委托:原始签名人将签名权授予代理签名人,代理签名人通常为其信任的部门或员工。
- 代理签名生成:代理签名人利用所获授权,代替原始签名人生成代理签名。
- 验证:验证者核验签名的有效性。
2、RSA签名体制
RSA是一种基于数论的公钥密码体制,既可用于加密,亦可用于数字签名。其密钥生成过程产生一对RSA密钥:私钥由用户秘密保存,公钥可对外公开。为增强安全性,RSA密钥长度不应低于600bit,建议采用1024bit及以上。
2.1、RSA算法适用于数字签名的证明
首先,验证RSA算法是否能够应用于数字签名,即条件E(PK, D(SK, m)=m是否满足。RSA算法中用户的公钥PK用{e, n}表示,与之对应的私钥SK用{d, n}表示,设明文为m,密文为c, RSA算法的加密运算过程为:

相应的解密运算过程为:

作为一种密码体制,RSA首先必然满足D(SK, E(PK,m))=m,即明文通过公钥加密后,可以由对应的私钥解密。要判断条件E(PK, D(SK, m))=m是否满足,可按如下步骤推导:

由上式可知,E(PK, D(SK, m))=m,即RSA算法符合数字签名的条件,能够应用于数字签名。
2.2、利用RSA算法实现数字签名及验证
将RSA算法应用于数字签名和验证的具体过程如下:
1)设计密钥
- 选取两个大素数p和q,计算n=p×q,φ(n)=(p-1)×(q-1),其中φ(n)是n的欧拉函数值。
- 随机选取一个整数e,满足1≤e≤φ(n),且gcde,φ(n)=1,作为公钥。
- 用欧几里得(Euclid)算法计算d,满足de≡1modφ(n),d即为私钥。
2)签名过程
如果需要签名的消息为m,签名者的私钥SK为{d, n},则签名者施加签名的过程可以描述为:

其中,s为签名者对m的签名。
3)验证签名
与签名过程相对应,验证签名需要用到签名者的公钥PK,用{e, n}表示签名者的公钥,在获得签名信息s后,验证签名的过程可以描述为:

如果m'=m,即verkm, s=true,则验证通过,可以判断签名s的签名者身份真实。
例如,用户A的公钥为{79, 3337},对应的私钥为{1019, 3337}。用户A想把明文消息65发送给其他用户,在发送前他用自己的私钥对消息进行签名:s≡651019mod 3337=53。其他用户在接收到消息和签名以后,可以通过A的公钥对签名进行认证从而确定消息是否的确由A发出:m'≡5379mod 3337=65,计算所得到的结果与接收到的消息65相同,可以确定消息是由A发出的,而且消息在传输过程中没有被修改过。
事实上,上述签名和验证过程是一种理想状况,在实际中并不可行。这不仅是因为对整个消息进行签名的速度非常慢,而且RSA算法还存在乘法攻击的可能性。因此,发送者在发信前,一般是先使用哈希算法(如SHA-2、MD5等)求出待发送消息的数字摘要,然后用私钥对这个数字摘要而不是对待发消息本身进行加密,将加密的结果作为数字签名。发信时,将这个数字摘要和签名信息附在待发消息的后面,一起发送过去。接收方收到消息后,一方面用发送方的公钥对数字签名进行解密,得到一个摘要H;另一方面把收到的消息本身用哈希算法求出另一个摘要H',再把H与H'进行比较,查看两者是否相同。如果两个摘要H和H'完全相同,则证明消息是完整的,且发送方不可否认;如果不相同,就说明消息被人篡改了,或者消息不是来自所声称的发送方的。
3、ElGamal签名体制
ElGamal签名体制由ElGamal于1985年提出,是一种基于离散对数问题的数字签名方案,兼具数据加密与数字签名功能。基于ElGamal密码系统的数字签名算法已被采纳为数字签名标准(DSS),属于非确定性公钥密码体制------对同一明文消息,因随机参数选择不同,生成的签名结果存在差异。
ElGamal签名体制实施流程与ElGamal加密算法一样,利用它实现数字签名要选择一个大素数p,获取该素数p的一个本原根a,将p和a公开,并且可由一组用户共享。生成一个随机整数x作为其秘密的解密密钥,使得1≤x≤p-1,计算y≡ax mod p,则公钥为(y, a, p),私钥是x。
3.1、ElGamal签名体制参数
- p:系统选取大素数p,可使Zp(Zp是一个有p个元素的有限域)中求解离散对数为困难问题。
- a: Zp中(指非交换群或没有特别说明的群)z*p(Zp中除去0元素)的一个生成元或本原根。
- k:用户随机选取的整数,计算r≡ak modp。
3.2、签名的产生过程
设m是用户A(发送方)待签名的消息,1≤m≤p-1,用户A执行以下步骤:
- 用户A秘密随机选取一个整数k, 1≤k≤p-1,且k与p-1互素。
- 计算r≡ak modp。
- 计算消息m的哈希值H(m)。
- 计算s≡(H(m)-xr)k-1mod(p-1)。
把S=sigk(m, k)=(r, s)作为产生的数字签名,将m和(r, s)发送给用户B(接收方)。
3.3、验证签名
用户B(接收方)收到消息m和数字签名(r, s)后,先计算H(m),然后按下式进行验证:

如果(yrrs)mod p≡aH(m)mod p成立,则验证通过,签名有效;否则验证不通过。这是因为yrrs≡arxask≡a(rx+sk)modp,由式s≡(H(m)-xr)k-1mod(p-1)可得(rs+sk)≡H(m)mod(p-1),因此,(yrrs)mod p≡aH(m)modp。
例如,假设p=11, a=2是p的本原根,选取x=8,计算y≡ax(mod p)=28(mod 11)=3。(y, a, p)=(3, 2,11),x=8为保密密钥。用户A要对消息m=5签名,首先要秘密选择k=9,因为gcd(9, 10)=1,所以9模10的逆一定存在,有9-1mod 10=9。用户A进行以下计算:r≡akmod p≡29mod 11=6, s≡(H(m)-xr)k-1mod(p-1)≡(5-8×6)×9mod 10=3。将Sigk(m, k)=(r, s)=(6, 3)作为用户A对消息m=5的数字签名。
当用户B需要对消息m=5的签名(6, 3)进行验证时,因为(36×63)mod 11=25mod 11,验证通过,确认其签名有效。显然,在这种数字签名算法中,对同一消息m,由于随机数k不同而有不同的数字签名sigk(m, k)。
为安全起见,随机数k必须是一次性的。由于取(r, s)作为m的签名,所以ElGamal数字签名的数据长度是明文的两倍。另外,ElGamal数字签名需要使用随机数k,这就要求在实际应用中要有高质量的随机数生成器。
4、椭圆曲线密码数字签名体制
椭圆曲线数字签名体制(ECDSA)基于椭圆曲线密码(ECC)系统,是数字签名算法(DSA)的变例。依据SEC1椭圆曲线密码标准(草案)规定,一个椭圆曲线密码由一个6元组定义:

其中,p为大于3的素数,它确定了有限域GF(p),元素a, b∈GF(p),定义了椭圆曲线,G为循环子群E1的生成元,n为素数且为生成元G的阶,G和n确定循环子群E1, h表示椭圆曲线群的阶与n的商。
4.1、密钥生成
每个签名者都产生一对密钥,包括一个私钥和一个公钥。假设签名者是用户A,要对明文消息m进行签名,其密钥生成步骤如下:
- 定义一组共同接受的椭圆曲线加密用参数。简单地,这组参数可表示为(Curve, G, n),其中,Curve表示椭圆曲线点域和计算方程。
- 选择一个随机数dA=rand(1, n-1),dA∈{1,2,...,n-1}。
- 计算点QA=dA×G,得到一条椭圆曲线Ep(a, b)上的解点。
- 签名用户A的公钥是QA,私钥是dA。
4.2、生成签名
用户A(发送方)使用公开的全局域参数和手中的私钥,对消息m产生320Byte数字签名的步骤如下。
- 计算e=H(m),H是一种哈希函数,如SHA-2。
- 计算z,取自e的二进制形式下最左边(即最高位)Ln个比特,Ln是上述椭圆曲线Ep(a, b)参数中的可倍积阶数n的二进制长度。注意z可能大于n,但长度绝对不会比n更长。
- 选择一个随机数k, k∈{1, 2,...,n-1}。
- 计算椭圆曲线解点R(xR, yR)=kG,记为r=xR。
- 计算r≡xRmodn,如果r==0,则返回步骤(3)重新计算。
- 利用私钥dA计算s=sigd(m, d)≡(e+dA×r)k-1modn,如果s==0,则返回步骤(3)重新计算。
- 以(r, s)作为m的数字签名,并将m和(r, s)发送给用户B(接收方)。
4.3、验证签名
对于接收消息的用户B来说,除了收到数字签名文件(m,r, s)外,还有一个公钥QA。因此用户B的验证分为两部分:先验证公钥QA,然后验证签名文件。
1)公钥QA的验证
- 公钥QA的坐标应是有效的,不会等于一个极限空点Q。
- 通过公钥QA的坐标验证该点是否处于椭圆曲线Ep(a, b)上。
- 椭圆曲线的可倍积阶数n与公钥的点不满足n×QA=Q。
2)签名文件的验证
- 验证(r, s)均是处于(1, n-1)范围内的整数,否则验证失败。
- 计算e=H(m),H为签名生成过程中使用的哈希函数。
- 计算z,取自e的最左边Ln个比特。
- 计算参数w=ver(m, r, s)≡s-1mod n。
- 计算两个参数:u1≡zwmodn, u2≡rwmod n。
- 计算(xU, yU)=u1G+u2QA,如果(xU, yU)不是椭圆曲线上的点,则验证失败。
- 如果r≡xU modn成立,则(r, s)是用户A对m的签名,否则验证失败。
相较于基于RSA密码系统的数字签名算法,ECDSA在公钥长度与签名效率上具有显著优势:对于80bit安全级别的数字签名,ECDSA仅需160bit公钥(为安全级别的2倍),而RSA需至少1024bit公钥;同时,二者签名长度均约为320bit。因此,ECDSA相对于RSA在应用上具有很明显的优势。
5、SM2签名方案
SM2签名方案包含在我国于2010年颁布的SM2椭圆曲线公钥密码算法中,其安全性依赖于椭圆曲线上计算离散对数的困难问题。设有限域上的椭圆曲线Ep(a, b),选择Ep(a, b)中的基点G, G的阶是大素数n。SM2签名方案如下。
5.1、密钥生成
随机选择整数k,满足1≤k≤n-1,计算Y=k×G。签名方案的公钥是<G, Y>,私钥是<k>。
5.2、签名过程
假设需要签名的明文消息为m,完成如下运算:
- (1)置M=Z‖m,其中Z是签名者的身份标识、部分系统参数及签名者公钥的哈希值。
- (2)计算e = hash(M),其中hash为哈希函数。
- 随机选择d,满足1≤d≤n-1,计算d×G=(x1, y1)。
- 计算r≡(e+x1)modn;如果r=0或者r+d=n,则返回步骤(3)。
- 计算s≡((1+k)-1(d-rk))modn,如果s=0,则返回步骤(3)。
最终,对消息m的签名是(r, s)。
5.3、签名验证
为了验证收到的消息m'和数字签名(r', s')是否真实有效,验证者应执行以下运算:
- 检验r'∈(1, n-1)且s'∈(1, n-1)是否成立,如果不成立,则签名无效。
- 置插图。

- 计算插图。

- 计算t≡(r'+s')mod n,如果t=0,则签名无效。
- 计算插图。

- 如果v≡r'mod n,则签名验证通过。