···························································· 第3 章 chapter3 数字签名 在生活中,经常需要在文件上签名。签名无非出于以下3种目的: (1)认证。如果某人拟了一份文件,希望其他人确信该文件来自他,他可以在文件上 签名。 (2)批准和负责。例如办理某些银行业务(如刷卡消费、支取存款)时,营业员会要求 经办人签名,这是为了防止经办人以后抵赖,因为一旦签名就表明该项业务得到了经办 人的批准,并且由经办人承担责任。 (3)有效。人们有时请求领导或上级对某份文件签名或签章,用来表明该份文件是 有效力和权威的,以获得机构内其他人的认可。 3.1 数字签名概述 对签名的基本要求是:①无法伪造;②容易认证;③不可抵赖。手写签名一般通过 某人特有的笔迹实现以上要求。例如,有些领导为了防止别人伪造签名,也为了让其他 人容易鉴别,一般把签名设计得很有特色,其他人模仿不出。而数字签名和手写签名的 功能非常类似,好的数字签名比手写签名更能够防止伪造。因此,我国制定了《电子签名 法》,承认数字签名和手写签名具有同等的法律效力。 不仅如此,通过数字签名还能实现认证机制。如果一份消息附带某人的数字签名, 那么可以确信该消息确实是从该用户处发出的,而不是其他人伪造的。因此,可以说数 字签名是连接加密技术和认证技术的桥梁。 3.1.1 数字签名的特点 传统签名有4个基本特点:①与被签的文件在物理上不可分割;②签名者不能否认 自己的签名;③签名不能被伪造;④签名容易被验证。 而数字签名是传统签名的数字化,它也具有传统签名的这4个特点:①签名能与所 签文件绑定;②签名者不能否认自己的签名;③签名不能被伪造;④签名容易被自动 验证。而 进行数字签名通常也是为了确认以下两点: 第◆3 章 数字签名7 3 第一,信息是由签名者发送的。 第二,信息自签发后到收到为止未经任何修改。 总体来说,数字签名应具备以下几个特点: (1)签名是可以被确认的,即接收方可以确认或证实签名确实是由发送方完成的。 (2)签名是不可伪造的,即接收方和第三方都不能伪造签名。 (3)签名不可重用,即签名是和消息绑定的,不能把签名移到其他消息(文件)上。 (4)签名是不可抵赖的,即发送方不能否认他签发的消息。 (5)第三方可以确认收发双方之间的消息传送,但不能篡改消息。 3.1.2 数字签名的过程 要实现数字签名,最简单的方法是:发送方将整个消息用自己的私钥加密;接收方用 发送方的公钥解密,解密成功就可验证该消息经过发送方的签名。 但这种方法有一个缺陷,就是被签名的消息可能很长,由于公钥加密的运算速度慢, 导致加密会非常耗时而不可行。因此,在实际应用中,数字签名是先对消息用单向散列 函数求消息摘要(散列值),然后发送方用其私钥加密该散列值,这个被发送方用私钥加 密的散列值就是发送方的数字签名。发送方将其附在消息后,一起发送给接收方,就可 以让其验证签名了。 验证签名时,接收方先用发送方的公钥解密数字签名,然后将提取的散列值与自己 计算的散列值比较,如果相同,就表明该签名是有效的,整个过程如图3.1所示。这样,攻 击者虽然能截获并阅读消息(消息是明文形式),但不能修改消息内容或将消息换成别的 消息,因为别的消息的散列值和该消息的散列值是不同的,接收方能通过验证签名发现。 图3.1 数字签名的过程 图3.1的数字签名方案虽然解决了公钥密码体制加密长消息速度慢的问题,但又产 生了一个新的问题,那就是消息将以明文形式传输,无法实现机密性。如果对消息有机 密性需求,则可以将明文和数字签名的组合体先用一个对称密钥加密,再将加密后的组 合体以及对称密钥的数字信封发送给接收方,如图3.2所示(省略了数字签名过程)。这 种方式将数字签名与数字信封技术结合在一起,实现了能满足消息机密性需求的数字 签名。 7 4 ◆密码学及安全应用(第2 版) 图3.2 能满足机密性需求的数字签名方案 提示:能满足机密性需求的数字签名使用了两对公私钥。这是因为,公钥密码体制 如果用于数字签名,则无法同时实现机密性;反之,如果用于加密,则无法同时实现数字 签名。如果要用公钥密码体制同时实现数字签名和加密,则需要使用两次公钥密码算 法,一次用于加密,另一次用于数字签名。这需要两对公私钥才能实现,一对是发送方 的,另一对是接收方的。 3.2 数字签名的算法实现 理论上,只要是双向可逆的公钥加密算法都可用于数字签名,常见的数字签名算法 有RSA、ElGamal、Schnorr等。下面分别介绍这3种数字签名算法。 3.2.1 RSA 数字签名算法 设RSA 数字签名算法的私钥为d,公钥为e,则RSA 数字签名算法的思想就是:签 名者用自己的私钥d 加密文件摘要,其他人用签名者的公钥e 就可以验证签名。 1.签名过程 用户A 对消息m 进行签名,他先计算m 的摘要H (m ),再用自己的私钥d 计算SA: SA=Sign(H (m ))=(H (m ))d modn 然后将SA 附在消息m 后作为用户A 对消息m 的签名。 2.验证签名过程 如果其他用户要验证A 对消息m 的签名,则要用A 的公钥e 计算散列值: M'=Se Amodn 如果M'与H (M )相等,则相信签名确实是用户A 的。可见,RSA 数字签名算法的计算 过程就是RSA 加密算法的逆过程。 第◆3 章 数字签名7 5 3.RSA 数字签名的注意事项 如果用RSA 数字签名算法实现数字签名,一定要先求出消息摘要,再用私钥签名; 或者将一对公私钥专门用于签名,而用另一对公私钥对进行加解密。 这是因为,公钥e 和n 是公开的,攻击者如果截获别人发给接收方的密文c(c 是别人 用接收方的公钥e 加密得到的,即c=me modn),则攻击者可以任意选择一个小于n 且 与n 互素的数r,计算 x=re modn, y=xc modn 将y 发给接收方请求签名。如果接收方随随便便就用自己的私钥d 给攻击者发来的y 签名,即 u=yd modn 则攻击者得到签名u 后,就可以轻而易举地恢复出c 对应的明文m 。他首先计算r 的乘 法逆元t,即t=r-1 modn,再把t 和u 相乘即得到m ,这是因为 t×u =r-1yd modn =r-1(xc)d modn =r-1xdcd modn =r-1redcd modn =r-1rk.(n)+1cd modn =r-1rcd modn =cd modn =m 而如果先对消息y 求消息摘要H (y)再签名则不存在该问题,或者签名和加密使用 不同的密钥对也能避免该问题。 3.2.2 ElGamal 数字签名算法 ElGamal数字签名算法是一种非确定性的签名方案,它需要使用随机数,但 ElGamal数字签名算法的运算过程并不是ElGamal加密算法的逆过程。 1.选择密钥 系统先选取一个大素数p 及p 的本原根a,用户A 选择一个随机数x(1≤x≤p-1) 作为自己的私钥,计算y=ax modp,将y 作为自己的公钥。整个系统公开的参数有大 素数p、本原根a 以及每个用户的公钥,而每个用户的私钥x 则严格保密。 2.签名过程 给定消息m ,用户A 通过下述计算实现签名。 (1)选择随机数k∈Zp * ,且k 与p-1互素(注意,随机数k 需要保密)。 (2)A 对消息m 进行散列压缩后得到消息散列值H (m ),再计算 r=ak modp s=(H (m )-xr)k-1 mod(p-1) 将(r,s)作为用户A 对消息m 的数字签名,与消息m 一起发送给接收方。 3.验证签名的过程 接收方B在收到消息m 与数字签名(r,s)后,先计算消息m 的散列值H (m )。然后 计算 yrrsmodp=aH (m)modp ◆ 76 密码学及安全应用(第 2 版) 如果上式成立,则可确信(s)为有效签名;否则认为签名是伪造的。 r, 4. 证明验证签名的正确性 若(r,s)为合法用户采用ElGamal数字签名算法对消息 m 的签名,则 rs=( x )ak )xr+k yrar(s=as modp 又因为 k- s=( H (m)-xr)1mod(p-1) 两边乘 k 再移项 得 ks+xr= H (m)mod(p-1) 根据模运算规则有 axr+ks=aH (m)mod(p-1)modp ak ≡ak mod(p-1) 由费马定理的推论,modp,将 k 替换成 H (m), 有 axr+ks=aH (m)modp 因此有 yrrs=aH (m)modp 5.ElGamal数字签名算法举例 用户A对消息 m 进行签名。设系统选取素数p=19,本原根a=13 。用户A选择 整数x=10 作为自己的私钥,经计算可得用户A的公钥y=6。 如果用户A需要对消息 m 的散列值 H ( m )=15 进行签名,首先选择一个随机数 k=11,然后求出 k 的乘法逆元: k-1=5mod19 然后计算r: r=ak modp=1311 mod19=2 接着计算s: r)d( s=( H (m)-xk-1mop-1)=5×(15-10×2)mod18=11 用户A把元组(r,s)=(2,11)作为自己对 H (m)=15 的数字签名。 接收方B验证签名时只须计算并验证 yrrs modp=62×211 mod19=8 aH (m)modp=1315 mod19=8 两者相等,则认为(2,11)是用户A对消息 m 的有效签名。 6.ElGamal数字签名算法的安全性 关于ElGamal数字签名算法的安全性,有以下几点需要注意: (1)ElGamal数字签名算法是一个非确定性的算法,对同一个消息 m 所产生的签名 依赖于随机数k。 (2)由于用户的签名私钥 x 是保密的,攻击者要从公钥 y 推导出私钥 x 等价于求解 离散对数的困难性,因此ElGamal数字签名算法的安全性是建立在求解离散对数的困难 性上的。 (3)在签名时使用的随机数 k 绝对不能被泄露。这是因为,当攻击者知道了随机数 第◆3 章 数字签名7 7 k 后,就可以通过公式 s=(H (m )-xr)k-1 mod(p-1) 推出 x=(H (m )-ks)r-1 mod(p-1) 从而得到用户的私钥x,这样整个签名算法便被攻破。 (4)随机数k 不能被重用。有研究指出,如果随机数k 被重用,则攻击者可根据得到 的两个不同的签名求出签名私钥x。 ElGamal数字签名算法还有一些变种,如DSA。它是一种单向不可逆的公钥密码体 制,只能用于数字签名,而不能用于加解密和密钥分配。与ElGamal类似,DSA 在每次 签名的时候也要使用随机数,所以对同一个消息,每次签名的结果是不同的,所以称DSA 为随机化数字签名算法。而RSA 为确定性数字签名算法。由于RSA 存在共模攻击,用 RSA 签名时每次都要使用不同的n,而DSA 没有这个要求,因此在实际中使用DSA 进 行数字签名比RSA 更加方便。 3.2.3 Schnorr 数字签名算法 Schnorr数字签名算法的安全性建立在求解离散对数的困难性上。对于相同的安全 级,Schnorr的签名长度比RSA 短(对140位长的q,Schnorr签名长度仅为212位,比 RSA 签名长度短一半,比ElGamal签名短得多)。而且产生签名所需的大部分计算都可 在预处理阶段完成,进一步提高了该签名体制的速度。由于其签名运算的高效率, Schnorr数字签名算法已被广泛应用于许多电子现金协议和公平盲签名协议中。 Schnorr数字签名算法的签名过程如图3.3所示。 图3.3 Schnorr数字签名算法的签名过程 1.初始过程 初始时算法完成以下工作: (1)选择大素数p、q,p≥2512,q≥2160,并且q 是p-1的一个素因子,即q|(p-1)。 (2)选择g∈Zp * ,满足gq≡1modp。 (3)选择一个小于q 的随机数s,计算v=g-s modp。 (4)将p、q、a、v 公开,将s 保密,其中v 是公钥,s 是私钥。 2.签名过程 签名过程如下: (1)签名方A 选取一个小于q 的随机整数r,并计算x=gr modp。 (2)A 将消息m 与x 连接起来,计算其散列值e=H (m ,x)。 7 8 ◆密码学及安全应用(第2 版) (3)A 计算y=(r+se)modq,(e,y)即为签名。A 将消息m 和签名(e,y)传送 给B。 其中,H (·)是一个单向散列函数,m 是消息。 3.验证过程 验证方B收到m 和(e,y)后,计算x'=gyve modp,然后验证e=H (m ,x'),如果通 过验证,则认为该签名有效。这是因为y=(r+se)modq,v=g-s modp,x=gr mod p。所以 x'=gyve modp=g(r+se)ve modp=grgseg-se modp=gr modp=x 由于每次计算得到的签名与选择的随机数r 有关,因此Schnorr数字签名算法也是 非确定性算法。 3.3 前向安全数字签名 对于数字签名来说,其安全性涉及两方面:一是签名算法的安全性,数字签名使用的 算法要能够抵抗各种密码分析,即算法不被破解;二是签名私钥的安全性,即私钥不会被 窃取,或者即使被窃取了损失也不大。一般来说,私钥由签名者自己生成后保存在自己 的系统中,不会经过网络传输,一般很难被窃取,因此普通数字签名算法都假设私钥是绝 对安全的(这个假设隐含着:如果私钥泄露,则责任完全由签名者承担,验证者不需承担 任何责任)。如果不这样假设,则签名者无论自己的私钥是否被盗,他都可以声称自己的 私钥被盗了,是窃取者用他的私钥签的名,从而可对自己签名的任何消息进行抵赖。 但是私钥不在网络上传输并不表示私钥是绝对安全的,因为攻击者还可能会攻入签 名者的系统并窃取私钥。一旦签名私钥被泄露,则攻击者可使用该私钥随意冒用签名, 这将给整个系统带来灾难性的后果。银行或CA 等比较重要的机构必须考虑签名私钥泄 露这种风险的存在。 1.前向安全的概念和方法 基于这样的背景,1997年,Anderson首次提出了前向安全(forwardsecrecy)的概念。 其主要思想是:将一个密码学系统的整个生命周期分为若干时间段,系统的私钥值在每 个时间段都不断地变化。这样,即使当前时间段的私钥值泄露了,也不会影响以前时间 段私钥的安全性,这意味着以前的签名仍然是有效的。因此,前向安全数字签名方案能 有效地降低因私钥泄露而造成的损失。这种思想的本质是对数字签名安全性的风险控 制,即将签名私钥泄露后造成的损失尽可能减少。 前向安全数字签名与一般数字签名相比多了一个私钥自动更新的环节。这使它具 有前向安全性:如果时间段i 的私钥泄露,则攻击者只可以伪造时间段i 以后的签名,而 不能伪造时间段i 之前的签名,也就是说,时间段i 之前的签名仍然有效。 实现前向安全数字签名的关键是私钥可以自动更新,但验证签名的公钥却要求始终 不变,这样,无论私钥怎样变化,验证者总能用固定的公钥和时间段编号对签名进行验 证。因此,私钥可以用单向散列函数(例如散列链)实现,即允许签名者由昨天的私钥计 ◆ 第 3 章 数字签名79 算出今天的私钥,但不能由今天的私钥计算出昨天的私钥,以此保证:即使当前的私钥暴 露了,过去的私钥仍然是安全的。自动更新是单向的,所以自动更新函数是单向散列函 数,为了便于验证及提高效率,对应的公钥必须始终保持不变。 为了实现前向安全,可以将签名的私钥按时间段进行自动更新,并用不同的私钥生 成签名,而相应的公钥并没有变,任何验证者都可以使用固定的公钥和时间段编号验证 签名。前向安全数字签名的私钥自动更新过程如图3. 4所示。用户先注册一个公钥PK, 同时保存相应的私钥SK 。然后将公钥的有效时间分为 n 个时间段,记为T1,T2,…, Tn ,每个时间段的私钥记为SK1,SK2,…,SK。存在这样的单向散列函数f,它可以将 私钥SK1 更新为SK2,即SK2=f(SK1)。因为(n) 单向散列函数具有单向性,即,由SK1 计 算SK2 非常容易,而反过来由SK2 计算SK1 则非常困难。 图3.前向安全数字签名的私钥自动更新过程 4 2. 基于ElGamal的前向安全数字签名方案 通常一个前向安全数字签名方案包括4个算法:公私钥生成算法、私钥更新算法、数 字签名算法和数字签名验证算法,也就是说比普通数字签名方案多了一个私钥更新 算法。 基于ElGamal的前向安全数字签名方案的4个算法说明如下。 (1)公钥生成算法。 系统先选取一个大素数 p 及 p 的本原根g,用户A选择一个随机数x(1≤x≤p-1) 作为自己的初始私钥SK0,确定私钥的更新次数Ti,并根据PK=gSK0-1modp 计算出 公钥PK 。系统公开初始化参数{p,PK,}。 (2)私钥更新算法。 g,Ti 前向安全技术的关键是根据设定的时间段不断地计算出新的私钥,并用新的私钥替 换旧的私钥。设 i 表示时间段i,则私钥更新算法如下: 1), 1,根据SK计算SKi+1,计算公式为SKi+1= i mod(其中i∈[n+1 ]。 SK2 p 显然,如果(i) 想由SKi+1 计算SKi,则等价于求解离散对数的难题,因此非常困难。 (3)数字签名算法。 k 与p-然后计算对消息 m 进行签名时,签名者首先选择一个随机数k(1互素), a=gk modp a+1-ik b=( H (m))-SK2a)1modp 此时对消息 m 的签名结束,{a,b,i}时间(i) 段 i 对消息 m 的签名 。 8 0 ◆密码学及安全应用(第2 版) (4)数字签名验证算法。 验证者在接收到签名后通过以下等式进行验证: PKaab=gH (m)modp 若上式为真,则签名有效;反之则签名无效。 3.强前向安全的概念 前向安全数字签名仍然是有安全漏洞的,因为它没有办法阻止攻击者在窃取私钥后 在未来的时间段内进行同样的私钥更新。即,如果攻击者获得了时间段i 的私钥,并且 签名方也没有发觉自己的私钥已经被窃取,那么攻击者就可以和签名方一样进行私钥的 更新,得到时间段i 以后的所有私钥。有了这些私钥就可以伪造时间段i 及以后的所有 签名,直到被签名者发现。也就是说,前向安全签名无法保证签名在未来的安全性(即后 向安全性)。为此,2001年,Burmester提出了强前向安全数字签名的概念,即在保证签 名是前向安全的同时,不应该让攻击者具有和合法签名者同样的私钥更新能力,也就是 说,即使攻击者获得了时间段i 的私钥,它也不能伪造时间段i 以前的签名和时间段i 以 后的签名,这样的安全性称为强前向安全性,或称为双向安全性。 3.4 特殊的数字签名 在电子商务、电子投票、电子现金等领域,产生了几种特殊的数字签名方式,如盲签 名、群签名、群盲签名、门限签名、数字时间戳等。 3.4.1 盲签名 1.盲签名的特点 在一般的数字签名中,文件的签名者都知道他们签署的文件内容,甚至该文件就是 签名者自己撰写的。但有时可能需要某人对一个文件签名,却又不想让他知道文件的内 容。例如,立遗嘱时,通常将遗嘱写好并用信封密封好后,由公证人签名盖章,为了防止 公证人未到时候就私下将遗嘱的内容泄露出去,要求公证人看不到遗嘱内容,但又必须 让公证人签名,这样验证者才能确信遗嘱是真实的。这里公证人对遗嘱的签名就是一种 盲签名。 盲签名最主要的用途是实现电子现金的匿名性。用户自己生成了一些电子现金(包含 序列号),把电子现金提交给银行签名(当然有办法让银行能大体知道它签署的是什么,只不 过不准确而已),这样电子现金才会变得有效,但用户又不想让银行知道自己提交的电子现 金是哪些,以防止银行对用户的消费状况进行跟踪,侵犯用户隐私。因此,不能让银行看到 待签名文件(电子现金)的具体内容(如序列号),这就需要采用盲签名技术。 盲签名操作涉及三方,分别是请求签名者、签名者和签名验证者。 为了实现盲签名,一种自然的想法就是先将消息加密(称为盲化),再把加密的消息 发送给签名者。这样,签名者就无法阅读消息的内容了,而只能进行签名。请求签名者 可先将签名解密(脱盲),然后把消息明文和脱盲的签名发送给验证者进行验证。该过程 盲签名 ◆ 第 3 章 数字签名81 如图3. 5所示。 图3.盲签名的过程 5 提示:脱盲的签名就相当于签名者直接对消息明文 m 进行的签名。 由此可见,盲签名的基本原理是两个可交换的算法的应用:第一个是加密算法,用来 隐藏消息,实现盲化处理;第二个是签名算法,用来对消息进行签名。只有这两个算法是 可交换的,即Sgk (=(inm))其中 h 为盲化因子, inmh)Sgk (h, 盲签名才能有效。 如果这两个算法不能交换,则文件拥有者(即请求签名者)无法进行脱盲运算,不能 ignign, ignmign 由S'得到S而只能解密S'得到m'。虽然文件拥有者也可以把m、'和S'提 交给验证者验证S'确实是从 m 得来的签名,但这又要将盲化因子 h 告诉验证者,而一 ign 旦盲化因子公开,则签名者也能用盲化因子解密得知明文了。 综上,盲签名与普通数字签名相比,有两个显著的特点,即两个条件: (1)消息的内容对签名者是不可见的。例如,5中签名者不知道m 图3.。 (2)在签名消息被接收者公开后,签名者不能追踪签名,即盲签名具有不可追踪性。 例如,图3.ign,仍然不能把它和m 5中签名者即使看到S'联系起来。 上述盲签名方案又称为强盲签名。如果盲签名方案满足条件(1), 但不满足条件(2), 即,在签名消息被接收者公开后,签名者能够追踪签名,则称为弱盲签名或公平盲签名。 盲签名可通过RSA 算法和离散对数等数学难题实现。 2.RSA 的盲签名体制 RSA 盲签名的步骤如下: (1)参数选择。系统随机选取两个大素数 p 和q,计算n=pq,再计算 n 的欧拉函数 .(=(1)(1), n 可以公开。然后选择一个与.(互素的整数 e 作为 n)p-q-计算完后,n) 某用户的公钥(这样 e 才会有乘法逆元)。求出 e 的乘法逆元,将该结果作为该用户的私 钥d,即dn) 1mod.()。将 d 保密, d,作为私钥; 将(n)作为公钥。 e= n 将(n) 将 e 公开, e, p、 q 和.(都需要保密。 (2)签名过程。用户(请求签名者)选择待签名的消息 m ∈Zn *和一个随机数r∈Zn 作为盲化因子,并用签名方的公钥 e 对原消息进行盲化,即计 算 m'=mremodn ◆ 82 密码学及安全应用(第 2 版) 然后把盲化的消息m'发送给签名者进行签名。 签名者收到m'后,用自己的私钥 d 对其进行签名,即计算 Sign(')=(') d modn 可见,签名过程和普通RSA签名完(m) 全一致,(m) 然后把Sin(m')作为m'的签名发送给 用户。 g (3)脱盲过程。验证者收到Sign(m')后,对其进行脱盲运算,即计算 Sign(m)=Sign(m')/ r modn Sign(m)就是对原消息 m 的直接签名,即Sign(m)=md modn。这是因 为 d/e)d/ e Sign(m)=Sign(')/=(m')r=(mrd/r=mdrr modn=mdr/ r modn=md modn (4)验证签名(m) 。由(r) 于Sign(m)就是对原消息 m 的直接签名,因此验证者可以用签名 者的公钥 e 像验证普通RSA 签名一样验证Sign(m), 即验证如下等式是否成立: m)) m=(Sign( e modn 例3.取p=q=则n=.(=3,7。设 1 3,11, 33,n)20 。再取公钥e=经计算得d= 明文m=6,任取随机数r=5。求 m 的盲签名,并对盲签名进行验证。 解: m'=6×53mod33=750mod33=24 Sign(m')=247mod33=18 - Sign(m)=18×51mod33 Sign(m)=30 验证如下 : 6,(n(m) ) m=Sige modn=303mod33= 6 两者相等,说明签名是有效的 。 3.ElGamal的盲签名体制 ElGamal盲签名的步骤如下: (1)系统先选取一个大素数 p 及 p 的本原根a,然后选择一个随机数x,2, 再计算y= x modp,以(a,作为用户的公钥,而以 x 作为用户的私钥。 2≤x≤p y,p) (2)盲化(a) 过程。请求签名者选择随机数h∈Z* 作为盲化因子,然后计算 p β=ah modp 将二元组(m发送给签名者。 m'=mh mod(p-1) β,') β,mp (3)签名过程。签名者收到(')后,选择随机数k∈Z*1,并用自己的私钥 x 对 m'进行签名,即计 算 r=βk modp s=r+m'k mod(p-1) 并将(r,s)作为对消息 m 的签名发送(x) 给验证者。 (4)验证过程。验证者收到(s) 用签名者的公钥 y 进行验证 r,后, 如果该式成立,则说明签名有效。 as=rmyr modp 第◆3 章 数字签名8 3 3.4.2 群签名、群盲签名和门限签名 1.群签名 群签名是指:一个群中的任意一个成员可以以匿名的方式代表整个群对消息进行签 名,验证者可以确认签名来自该群,但不能确认是群中的哪一个成员进行的签名。但是 当出现争议时,借助于一个可信的机构或群成员的联合就能识别出群中的签名者。 与其他数字签名一样,群签名也是可以公开验证的,而且可以用单个的群公钥来验证。 一个群签名体制由以下几个算法和协议组成: (1)创建算法。一个用以产生群公钥和私钥的多项式时间概率算法。 (2)加入协议。一个用户和群管理员之间的交互协议。执行该协议可以使用户成为 群成员,群管理员得到群成员的秘密成员管理密钥,并产生群成员的私钥和群成员证书。 (3)签名算法。一个概率算法,当输入一个消息和一个群成员的私钥后,输出对消息 的签名。 (4)验证算法。一个在输入对消息的签名及群公钥后确定签名是否有效的算法。 (5)打开算法。一个在给定一个签名及群公钥的条件下确定签名人身份的算法。 一个好的群签名方案应满足以下的安全性要求: (1)匿名性。给定一个群签名后,对除了唯一的群管理员之外的任何人来说,确定签 名人的身份在计算上是不可行的。 (2)不关联性。在不打开群签名的情况下,确定两个不同的群签名是否为同一个群 成员所签在计算上是困难的。 (3)防伪造性。只有群成员才能产生有效的群签名。 (4)可跟踪性。群管理员在必要时可以打开一个群签名,以确定签名人的身份,而且 签名人不能阻止一个合法群签名的打开。 (5)防陷害攻击。包括群管理员在内的任何人都不能以其他群成员的名义产生合法 的群签名。 (6)抗联合攻击。即使一些群成员串通在一起也不能产生一个合法的不能被跟踪的 群签名。 2.群盲签名 1998年,Lysyanskaya和Ramzan有效结合群签名和盲签名提出了群盲签名的概念。 大多数电子现金系统都基于由单个银行发行电子现金的模型,所有的用户与商家在同一 家银行拥有账户。而在现实世界中,电子现金可能是在一个中央银行监控下由一群银行 发行的。Camenisch和Stadler利用群盲签名构造了一个多个银行参与发行电子现金的、 匿名在线的电子现金方案,为研究电子现金系统开辟了一个新的方向。 在该方案中有多个银行参与,每个银行都可以安全地发行电子现金,这些银行形成 一个群,受中央银行的控制,中央银行担当群管理员的角色。该方案具有以下性质: (1)任何银行都不能跟踪自己发行的电子现金。 (2)商家只需要用单个群公钥验证其收到的电子现金的有效性,而不关心该电子现 8 4 ◆密码学及安全应用(第2 版) 金是哪个银行发行的。 (3)所有银行组成的群只有一个公钥,该公钥与参与银行的个数无关,而且有银行加 入时,该公钥也不需要改变。 (4)给定一个合法的电子现金,除中央银行以外的任何银行都不能辨别该电子现金 是哪个银行发行的,为用户和银行提供了匿名性。 (5)包括中央银行在内的任何银行都不能以其他银行的名义发行电子现金。 3.门限签名 在有n 个成员的群中,至少有t 个成员才能代表群对文件进行有效的数字签名。例 如,银行金库大门的打开申请需要一个正行长和一个副行长同时签名或者3个副行长同 时签名才能生效。这就需要门限签名。门限签名可通过共享密钥的方法实现,它将密钥 分为n 份,只有超过t 份子密钥组合在一起才能重构出密钥。 3.4.3 数字时间戳 在某些电子交易中,交易时间是非常重要的信息。例如,股票、期货的交易时间直接 影响交易商品的价格。因此,需要一个可信任的第三方———时间戳权威(TimeStamp Authority,TSA)提供可信赖的且不可抵赖的时间戳服务。TSA 的主要功能是证明某份 文件(交易信息)在某个时间(或以前)存在,防止用户在这个时间后伪造数据进行欺诈。 数字时间戳(DigitalTime-Stamp,DTS)产生的一般过程是:用户首先对需要加时间 戳的文件用散列函数计算其摘要,然后将摘要发送给TSA。TSA 将收到文件摘要时的 日期和时间信息附加到文件中,再用TSA 的私钥对该文件进行加密(TSA 的数字签名), 然后将其返回给用户,整个过程如图3.6所示。 图3.6 数字时间戳的产生过程 用户收到数字时间戳后,可以将其与原始文件一起发送给接收方,供接收方验证 时间。可 见,数字时间戳是一个经TSA 签名后形成的凭证文档,它包括3部分: (1)需加时间戳的文件摘要。 (2)TSA 收到文件的日期和时间。 (3)TSA 的数字签名。 ◆ 第 3 章 数字签名85 习 题 1. 要实现电子现金的匿名性,可以使用( )。 A. 盲签名B. 群签名 C. 门限签名D. 前向安全数字签名 2. 盲签名操作涉及的三方分别是、签名者和验证者。 3. 为了解决签名私钥可能被窃取的问题,人们提出了数字签名。 4. 如果要实现带有机密性的数字签名,需要使用发送方的和接收方的 。(填公钥或私钥) 5. 简述数字签名的过程和应用。 6. 小强想出了一种数字签名的新方案,他用一个随机的对称密钥加密要签名的明 文,得到密文,再用自己的私钥加密该对称密钥(签名), 然后把密文和加密后的对称密钥 一起发送给接收方,接收方如果能解密得到明文,就表明验证签名成功。请问用该方案 能够对明文签名吗? 为什么? ···························································· 第4 章 chapter4 密钥管理与密钥分配 在现代密码学中,加密算法的安全性完全依赖于密钥,因此密钥是现代密码学的核 心,密钥管理是整个密码系统中最重要的环节。密钥管理作为现代密码学的一个重要分 支,是在授权各方之间建立和维护密钥关系的一整套技术,它是现代密码学中最重要、最 困难的部分。 4.1 密钥管理 密钥管理是一种综合性技术,它除了技术因素外,还包括管理因素,例如密钥的行政 管理制度和人员的素质密切相关。再好的技术,如果失去必要的管理支持,也将毫无意 义。密码系统的安全强度总是由系统中最薄弱的环节决定的。但是,作为一个好的密钥 管理系统,应尽量不依赖于人的因素,为此,密钥管理系统的一般应满足以下要求: (1)密钥难以被窃取。 (2)在一定条件下,即使窃取了密钥也没有用。 (3)密钥的分配和更换过程在用户看来是透明的,用户不一定要亲自掌握密钥。 4.1.1 密钥的层次结构 如果一个密码系统的功能很简单,可以使用单层密钥体制,即所有的密钥都直接用 来加密或解密数据,但这种密钥体制的安全性不高。一个完善的密码系统通常要求密钥 能够定期更换、自动生成和分配等各种附加功能,为此,就需要设计成多层密钥体制。 多层密钥体制的基本思想是用密钥保护密钥。在多层密钥体制中,密钥可分为会话 密钥、密钥加密密钥、主密钥3个层次。密钥的层次结构如图4.1所示。其中,fn 表示加 解密变换函数。 . 会话密钥(sessionkey)是最底层的密钥,直接对数据进行加密和解密。 . 密钥加密密钥(keyencryptingkey)是最底层以上的所有密钥(除主密钥外),用于 对下一层密钥进行加密保护。 . 主密钥(masterkey)是最高层的密钥,是密钥系统的核心,通常受到严格的保护, 用于对密钥加密密钥进行保护。 第◆4 章 密钥管理与密钥分配8 7 图4.1 密钥的层次结构 多层密钥体制的优点如下: (1)安全性大大提高,下层的密钥被破解不会影响上层密钥的安全。 (2)为密钥管理自动化带来了方便。除主密钥需由人工装入以外,其他各层密钥均 可由密钥管理系统实行动态的自动更新和维护。 4.1.2 密钥的生命周期 密钥管理涉及密钥的生成、存储、更新、备份与恢复、销毁以及撤销等,涵盖了密钥的 整个生命周期。 1.密钥的产生 密钥必须在安全环境中生成,以防止对密钥的非授权访问。密钥的生成有两种方 式:一种是由密钥分配中心集中生成,称为集中式;另一种是由客户端分散生成,称为分 散式。这两种方式各有优缺点,如表4.1所示。 表4.1 两种密钥生成方式的对比 方 式集 中 式分 散 式 代表密钥分配中心个人客户端 生产者在中心统一进行用户 用户数量用户数量受限制用户数量不受限制 特点密钥质量高,方便备份需第三方认证 安全性需安全的私钥传输通道安全性高,只需将公钥传送给CA 为了保证安全,避免弱密钥,防止密钥被猜测或分析出来,密钥的一个基本要求是具 有足够的随机性,这包括长周期性、非线性、统计意义上的等概率性以及不可预测性等。 但是,一个真正的随机序列是无法用计算机模拟产生的,目前常采用物理噪声源方法产 生具有足够的随机性的伪随机序列。 对密钥的另一个基本要求是密钥要足够长。决定密钥长度时需要考虑多方面的因 素,包括数据价值有多大、数据需要多长的安全期、攻击者的资源情况怎样等。应该注意 到,计算机的计算能力和加密算法的发展也是决定密钥长度时要考虑的重要因素。 ◆ 88 密码学及安全应用(第 2 版) 2. 密钥的存储 密钥的安全存储是密钥管理中的一个重要环节,也是比较困难的一个环节。所谓密 钥的安全存储是指要确保密钥在存储状态下的机密性、真实性和完整性。安全可靠的存 储介质是密钥安全存储的物质条件,安全严密的访问控制机制是密钥安全存储的管理 条件。 密钥安全存储的原则是不允许密钥以明文形式出现在密钥管理设备之外。例如,可 以将密钥以明文形式存储在安全的IC 卡或智能卡中,由专人保管,使用时插入设备中。 如果无法做到时,必须用另一个密钥对密钥进行加密以保护该密钥,或由一个可信方分 发密钥。 3. 密钥的更新 密钥更新是密钥管理的基本要求,无论密钥是否泄露,都应该定期更新,更新时间取 决于给定时间内待加密数据的数量、加密的次数和密钥的种类。会话密钥应当频繁更 换,以防止攻击者在长时间内通过截获大量的密文分析出密钥;密钥加密密钥无须频繁 更换;而主密钥可有更长的更换时间。 4. 密钥的备份与恢复 为了进一步确保密钥和加密数据的安全,防止密钥遭到毁坏并造成数据丢失,可利 用备份的密钥恢复原来的密钥或被加密的数据,密钥的备份本质上也是一种密钥的存储 形式。密钥备份有以下几个原则: (1)备份的密钥应当受到与存储的密钥同样的保护。 (2)为了减少明文形式的密钥的数量,一般都采用高级密钥保护低级密钥的密文形 式进行密钥备份。 (3)对于高级密钥,不能采用密文形式备份,一般采用多个密钥分量的形式备份,即 把密钥通过门限方案分割成几部分,将每个密钥分量备份到不同的设备或地点,并且指 定专人负责。 (4)密钥的备份应当考虑方便恢复,密钥的恢复应当经过授权而且要遵循安全的规 章制度。 5. 密钥的销毁 对任何密钥的使用都必须设置有效期。没有哪个密钥能够无限期地使用,否则会带 来不可预料的后果,这是因为: (1)密钥使用时间越长,它泄露的可能性就越大。 (2)如果密钥已经泄露,又没有被使用者察觉,那么密钥使用越久,损失就会越大。 (3)密钥使用越久,对攻击者来说花费精力破译它的诱惑力就越大,甚至会采取穷举 法进行攻击。 (4)对同一密钥加密的多个密文进行密码分析相对来说更容易。 因此,当密钥超过有效期或停止使用后,应该对该密钥进行销毁,彻底清除所有踪 迹,包括将所有明文、密钥及其他没受保护的重要保密参数全部清除,以禁止攻击者通过 观察数据或从废弃的设备中确定旧密钥值。 第◆4 章 密钥管理与密钥分配8 9 6.密钥的撤销 密钥的撤销是从法律上取消密钥与密钥拥有者之间的关联,解除实体在密钥使用过 程中应承担的义务。密钥的撤销往往意味着密钥同时也被销毁。 密钥管理的各个过程都要记录日志,方便以后进行审计。 4.2 密钥的分配 密钥分配,通俗地说,就像把钥匙传递给对方。在现实生活中,这应该是一个很简单 的问题,因为人们可以面对面地把钥匙交到对方手里;但是在网络环境中,人们不能见 面,只能通过网络把密钥发送给对方。而在这中间可能会遭受各种各样的攻击,如窃取 密钥或伪造密钥等。如果密钥被敌方掌握了,那么设计得再好的密码系统也没用了,因 此密钥分配是密钥管理最重要的环节。 密钥分配是指将密钥安全地分发给通信双方的过程。由于密钥是整个密码系统安 全的核心,所以攻击者很可能通过窃取密钥来攻破密码系统。许多情况下,出现安全问 题不是因为密码算法被破解,而是因为密钥分配系统被攻破。需要注意的是,对称密码 体制和公钥密码体制的密钥分配方式是不同的。 4.2.1 对称密码体制的密钥分配 两个用户A 和B获得共享的对称密钥有如下几种方法: (1)密钥由A 选取并通过物理手段发送给B。 (2)密钥由第三方选取并通过物理手段发送给A 和B。 (3)如果A、B事先已有一个对称密钥,则其中一方选取新密钥后,用已有的密钥加 密新密钥并发送给另一方。 (4)如果A 和B与第三方分别有一条保密信道(即第三方与每个用户事先共享一个 对称密钥),则第三方为A、B选取密钥后,分别在两条保密信道上将密钥发送给A、B。 提示:如果有n 个用户,需要两两拥有共享密钥,那么一共需要n(n-1)/2个密钥, 而采用第(4)种方法,只需要n 个密钥。 第(4)种方法称为集中式密钥分配方案,它是指由密钥分配中心(KeyDistribution Center,KDC)负责密钥的产生并分配给通信双方。在这种情况下,用户不需要保存大量 的会话密钥,只需要保存和KDC通信的加密密钥。其缺点是通信量大,同时要求具有较 好的鉴别功能以鉴别KDC 和通信双方。图4.2是集中式密钥分配方案的实现,称为 Needham-Schroeder协议。 该密钥分配方案的具体过程如下: (1)A 向KDC发出会话密钥请求,请求的消息由两部分组成,一是A 和B的身份 IDA 和IDB,二是本次业务的唯一标识符N1。每次请求的N1 都应不同,常用一个时间 戳、一个计数器或一个随机数作为这个标识符。A 发给KDC的请求可表示为 A→KDC:IDA‖IDB‖N1 ◆ 90 密码学及安全应用(第 2 版) 图4.集中式密钥分配方案的实现 2 提示:‖表示连接符,例如abc‖fg=abcfg。 (2)KDC 对A的请求作出应答。应答是由KDC 与A共享的密钥Ka 加密的信息, 因此只有A才能成功地对这一信息进行解密,并且A能相信信息的确是由KDC 发 出的。 KDC→A:EKA[KS‖IDA‖IDB‖N1‖EKB[Ks‖IDA]] 1) 应答中包括A希望得到的两项数据:①一次性会话密钥Ks;②A 在第(步中发出 的请求,包括一次性随机数N1,其目的是使A将收到的应答与发出的请求比较,看是否 匹配。因此,A能印证自己发出的请求在被KDC 收到之前未被篡改,而且A还能根据一 次性随机数相信自己收到的应答不是重放对过去请求的应答。 KDC 到A的应答中含有A和B的身份IDA‖IDB,可防止攻击者将KDC 发往其他 用户的应答转向,重放给A。 此外,应答中还有B希望得到的两项数据:①一次性会话密钥Ks;②A 的身份 IDA。这两项由KB 加密,将由A转发给B,以建立A和B之间的连接并用于向B证明A 的身份。 (3)A收到KDC 的响应后,将会话密钥Ks 保存起来,同时将经过KDC 与B的共享 密钥加密过的消息传送给B。B收到后,得到会话密钥Ks,并从IDA 可知对方是A,而且 还从EKB 知道Ks 确实来自KDC 。由于A转发的是加密后的密文,所以转发内容不会被 窃听。 A→B:EKB[KS‖IDA] (4)B用会话密钥加密另一个随机数N2,将加密结果发送给A,并告诉A,B当前是 可以通信的。 B→A:EKs[N2] (5)A响应B发送的消息N2,并对N2 进行某种函数变换(以防止攻击者将B发送 给A的消息反向重放), 同时用会话密钥Ks 进行加密,然后将其发送给B。 A→B:EKs[f(N2)] 实际上第(3)步已经完成了密钥的分配,第(4)、(5)步结合第(3)步执行的是认证功 能,使B能够确认其收到的消息不是一个重放。 第◆4 章 密钥管理与密钥分配9 1 4.2.2 公钥密码体制的密钥分配 虽然公钥密码体制中使用的公钥可以公开,但必须保证公钥的真实性。公钥的发布 一般有以下4种方法。 1.公开发布 用户A 将自己的公钥公开发布给其他每一个用户。这种方法最简单,但没有认证 性,因为任何人都可以伪造A 的这种公开发布。如果某个用户假装是用户A,并以A 的 名义向其他用户发送或广播自己的公钥,则在A 发现假冒者以前,这一假冒者可解密所 有发给A 的加密消息(因为它拥有与该假冒公钥对应的私钥),而且假冒者还能用伪造的 密钥获得认证。 2.公钥目录表 建立一个动态可访问的公钥目录表。公钥目录表的建立、维护以及公钥的发布由可 信的实体或组织承担。管理员为每个用户在公钥目录表里建立一个目录项,目录项中包 括两个数据项:一是用户名,二是用户的公钥。每一用户都亲自或以某种安全的认证通 信向管理员注册自己的公钥,用户可以随时替换自己的公钥。管理员定期公布或定期更 新目录。其他用户可以通过公开的渠道访问该公钥目录表以获取公钥。 这种方法比用户公开发布公钥更安全。但它也存在两个缺点:①一旦管理员的私钥 被攻击者窃取,则攻击者可以修改公钥目录表,传递伪造的公钥;②用户必须知道这个公 钥目录表的位置且信任该公钥目录表。 3.公钥管理机构(在线服务器方式) 公钥管理机构为用户建立和维护动态的公钥目录。每个用户知道公钥管理机构的 公钥,只有公钥管理机构知道自己的私钥。这种方案称为带认证的公钥分配,如图4.3所 示,步骤如下: (1)A 发送一个带有时间戳的消息给公钥管理机构M,以请求B的公钥。 (2)M 给A 发送一个用其私钥SKM 签名的包括B的公钥PKB 在内的消息,A 用M 的公钥PKM 解密得到B的公钥PKB。 (3)A 用B的公钥加密IDA‖N1 并发送给B,表示请求和B通信,B用其私钥SKB 解密成功,就同意通信,然后B以同样的方法从M 处检索到A 的公钥。 其中,M 应答的消息(如②)中的Request用于A 验证收到的应答的确是对相应请求 的应答,且还能验证自己最初发送的请求在被M 收到之前是否被篡改。最初的时间戳 Time1 使A 相信M 发来的消息不是一个旧消息。消息⑥和⑦使A、B能相互确认对方身 份,因为只有B才能得到N1,只有A 才能得到N2。 该方案安全性很高,但也有缺点。只要用户与其他用户通信,就必须向公钥管理机 构申请对方的公钥,故可信服务器必须在线,这导致可信服务器可能成为性能的瓶颈。 4.公钥证书(离线服务器方式) 为解决公钥管理机构的性能瓶颈问题,可以通过公钥证书实现公钥的发布,即使用 公钥证书进行公钥分配,这样就不要求与公钥管理机构直接通信。公钥证书由认证机构