签名过程如下:
①生成一随机整数k;
②计算r=gkmodp(modq);
③计算s=k-1(h(M)+xr)(modq)。
(r,s)为签名人对m的签名。
(3)验证过程
①检查r和s是否属于[0,q],若不是,则(r,s)不是签名;
②计算t=s-1(modq),r′=gh(M)t(modq)yrt(modq)modp(modq);
③比较r′=r是否成立。
若成立,则(r,s)为合法签名。
3.ECDSA体制
一种崭新的技术叫做椭圆曲线密码体制,该体制正日益被认为是数字签名系统的基础。
基于椭圆曲线的数字签名系统可以实现同RSA和DSA基本相同的功能,但实现效率更高。
利用椭圆曲线,可以比使用RSA和DSA更快地产生和核验数字签名。
同时,椭圆曲线数字签名也较容易在小型、资源有限的设施中使用,例如智能卡。
椭圆曲线数字签名算法ECDSA是使用椭圆曲线对数字签名算法DSA的模拟。
ECDSA首先由Scott和Vanstone在1992年为了响应NIST对数字签名标准(DSS)的要求而提出。
ECDSA于1998年作为ISO标准被采纳,在1999年作为ANSI标准被采纳,并于2000年成为IEEE和FIPS标准。
与大数分解问题(IntegerFactorizationProblem ,IFP)和普通的离散对数问题(DiscreteLogarithmProblem,DLP)不同,椭圆曲线离散对数问题(EllipticCurveDiscreteLogarithmProblem ,ECDLP)没有亚指数时间的解决方法。
因此,椭圆曲线密码的单位比特强度要高于其他公钥体制。
3.2.3盲签名和群签名
1.盲签名
一般数字签名中,总是要先知道文件内容后才签署,这正是通常所需要的。
但有时我们需要某人对一个文件签名,但又不让他知道文件内容,这就叫做盲签名(BlindSignature),它是由Chaum最先提出的。
在选举投票和数字货币协议中将会碰到这类要求。
利用盲变换可以实现盲签名,这类签名的过程如图3-4所示。
图3-4盲签名
(1)完全盲签名
现假设B是一位仲裁者,A要求B签署一个文件,但不想让他知道所签的是什么内容,而B并不关心所签的内容,他只是要确保在需要时可以对此进行公正的仲裁。
实现这个签名的过程可通过下述协议实现。
1)盲变换。
A将要签名的文件与一个随机数相乘,该随机数称为盲因子(BlindingFactor)。
这实际上完成了对原文件的隐藏,隐藏完的文件被称为盲文件。
2)A将此盲文件送给B。
3)签名。
B对该盲文件签名。
4)解盲变换。
A对签过字的盲文件除以所用的盲因子,就得到B对原文件的签名。
若签名算法和乘法是可交换的,则上述的过程就可以真正实现,否则,要采用其他方法(而不是乘法)对原文件进行盲变换。
安全性讨论:
如何保证B不能进行欺诈?
这要求盲因子是真正的随机因子,这样B不能对任何人证明对原文件的签名,而只是知道对其签过名,并能验证该签名。
完全盲签名具有如下特点;
1)B对文件的签名合法,它证明B签了文件,且具有以前介绍过的普通签名的属性。
2)B不能将所签文件与实际文件联系起来,即使他保存所有曾签过的文件,也不能获得所签文件的真实内容。
(2)盲签名
完全盲签名使A可以让B签任何他所想要的文件,这对B显然是很危险的。
例如,“B欠A1000万”这样的内容赋予完全盲签名显然是十分危险的,因此完全盲签名并不可能真正实用。
为了避免这种恶意的使用,采用“分割一选择(Cut-and-Choose)”技术,能使B知道他所签的为何物,但仍可保留完全盲签名有意义的特征,即B能知道所签为何物,但因为协议规定的限制条件,无法进行对他有利的欺诈,或者说进行欺诈所需代价超过其获利。
反间谍组织的成员身份必须保密,甚至连反间谍机构也不知道他是谁。
机构组织要给每个成员一个签名文件,文件可能会注明:
持此签署文件的人将享有充分的外交豁免权,并在其中写入该成员的化名。
每个成员有自己的不止一个的化名名单,使反间谍机构不仅要提供签名文件,还要能验证提供签署文件的人是不是真正的合法组织成员。
特工们不想把他们的化名名单送给所属机构,因为敌方可能已经破坏了该机构的计算机。
另一个方面,反间谍机构也不会盲目地对特工送来的文件都进行签名。
否则,一个聪明的特工可能会送来这样的文件请求签名:
“该成员已退休,每年发给100万退休金”,若对这样内容的文件进行签署将带来不必要的麻烦。
先假定成员B有5个化名,他可以自行选用,别人是不知道的。
假定成员B并不关心在哪个化名下得到了豁免权,并假定机构的计算机为A。
其签名过程为:
①B准备了5份文件,每一个使用不同的化名,给予那个特工外交豁免权。
②B用不同的盲因子隐藏每个文件。
③B把这5份隐藏好的文件给A。
④A随机选择4份文件向A索要每份文件的盲因子。
⑤B向A发送适当的盲因子。
⑥A打开(即去掉盲因子)4份文件,并确认它们是正确的。
⑦A在剩下的文件上签名并把它送给B。
⑧B去掉盲因子,将读出他的新化名。
以上的例子体现了盲签名的思想。
通常人们把盲变换看做是信封,盲化文件就是对文件加个信封,而去掉因子的过程就是打开信封。
文件在信封中时无人能读它,而在盲文件上签名相当于在复写纸信封上签名,从而得到了对真文件(信封内)的签名。
2.群签名
群体密码学是研究面向一个团体的所有成员需要的密码体制。
在群体密码中,有一个公用的公钥,群体外面的人可以用它向群体发送加密消息,密文收到后要由群体内部成员的子集共同进行解密。
群签名(GroupSignature)是面向群体密码学中的一个课题分支,在1991年有Chaum和vanHeyst提出的。
所谓群签名就是满足这样要求的签名:
在一个群签名方案中,一个群体中的任意一个成员可以以匿名的方式代表整个群体对消息进行签名。
与其他数字签名一样,群签名是可以公开验证的,而且可以只用单个群公钥来验证。
群签名有以下几个特点:
1)只有群体中的成员能代表群体签名;
2)接收到签名的人可以用公钥验证群签名,但不可能知道由群体中哪个成员所签;
3)发生争议时可由群体中的成员或可信赖机构识别群签名的签名者。
这类签名可用于投标商务活动中。
例如所有公司应邀参加投标,这些公司组成一个群体,且每个公司匿名地采用群签名对自己的标书签名。
事后当选中了一个满意的标书,就可以识别出签名的公司,而其他标书仍保持匿名。
中标者想反悔已无济于事,因为在没有他参加下仍可以识别出他的签名。
群签名在管理、军事、政治及经济等多个方面有着广泛的应用。
比如在公共资源的管理,重要军事情报的签发,重要领导人的选举,电子商务重要新闻的发布,金融合同的签署等事务中,群签名都可以发挥重要作用。
3.3哈希函数和消息完整性
3.3.1哈希函数基本概念
哈希(Hash)函数(也称为“散列函数”或“杂凑函数”)是可接受变长数据输入,并生成定长数据输出的函数。
这个定长输出是输入数据的哈希值或称消息摘要。
由于哈希函数具有单向性的属性,有时也称单向散列函数。
有时把哈希值(消息摘要、散列码)称为输入数据的数字指纹。
消息完整性要求对接收的数据的任何改动都能被发现,而哈希函数的一个主要功能就是实现数据完整性的安全。
哈希值以函数h=H(M)表示。
其中,M是变长的消息,H是一个将任意长度的消息M映射为一个较短定长的哈希值h的哈希函数。
其效果如图3-5所示。
图3-5哈希函数示例
Hash函数具备以下的性质:
①H可应用于任意长度的输入数据块,产生固定长度的散列值;
②对于每一个给定输入数据m,计算出它的哈希值H(m)很容易;
③反过来,给定哈希值h,倒推出输入数据m在计算上不可行,即单向性;
④对于给定的消息m1和其哈希值H(m1),找到满足m2≠m1,且H(m2)=H(m1)的m2在计算上不可行,即抗弱碰撞(Collision)性;
⑤找到任何满足H(m1)=H(m2)且m1≠m2的消息对(m1,m2)在计算上是不可行的,即抗强碰撞性。
碰撞性是指对于两个不同的消息,如果它们的摘要值相同,则发生了碰撞。
性质①是将哈希函数应用于消息认证的实际需求。
性质②和③是单向性,由给定消息产生哈希值很简单,而给定哈希值则不可能产生对应的消息。
性质④保证无法找到一个替代消息,使它的哈希值与给定消息产生的哈希值相同,能防止伪造。
性质⑤指的是哈希函数对已知的生日攻击方法的防御能力。
哈希函数并不提供机密性,并且它们不使用密钥以生成摘要。
哈希函数非常适合于认证和确保数据的完整性。
3.3.2常见的哈希函数
现在常用的几种优秀的哈希算法有MD5,SHA等。
1.MD5
消息摘要(MessageDigest,MD)算法基于RFC1321,MD5是第5个版本。
MD5以一个任意长度的消息作为输入,以512位分组来处理输入文本,输出是4个32位分组级联形成的一个128位(16字节)的哈希值。
MD5是4轮运算,各轮逻辑函数不同。
每轮又要进行16步迭代运算,4轮共需64步完成。
2.SHA
安全哈希算法(SecureHashAlgorithm,SHA)由美国国家标准与技术学会(NIST)和NSA开发的,于1993年作为联邦信息处理标准(FIPSPUB180)公布,1995年修订为FIPSPUB181,后来更名为SHA-1。
另外还有四种变体曾经发布,以提升输出的范围和变更一些细微设计:
SHA-224、SHA-256、SHA-384和SHA-512(以它们的摘要长度加在原名后面来命名)。
SHA基于MD4算法,SHA的设计很近似于MD4模型。
SHA用于数字签名的标准算法DSS中,也是安全性很高的一个杂凑算法。
该算法的输入为小于264位长的任意消息,分为512位长的分组,输出为160位长的消息摘要。
因为它能产生160位哈希值,因此,抗穷举攻击能力要更强。
3.Hash函数的攻击分析
Hash函数必须满足,然而,抗强碰撞性对于Hash函数的安全性要求是非常高的。
例如,MD5算法输出的Hash函数值总数为2128,SHA-1算法输出的Hash函数值总数为2160,这说明可能Hash函数值是有限的,而输入的消息是无限的,因此,函数的碰撞性是可能存在的。
评价Hash函数的一个最好的方法是看攻击者找到一对碰撞消息所花的代价有多大。
目前已有一些攻击Hash函数的方案和计算碰撞消息的方法,这些方法中的生日攻击方法可用于攻击任何类型的Hash函数方案。
生日攻击的思想来源于生日问题。
问题的描述:
当一个班级中有多少学生时,才使得这个班中有两个学生的生日在同一天的概率超过1/2?
大多数学生都认为答案将会超过100,实际上,根据概率论答案是23。
如果不给出严密的分析,我们可以看到,23个学生可以组成(23×22)/2=253对不同的组合,每一对组合有1/365的命中概率,照这样看来,这个答案实际上也就不那么令人惊奇了。
生日攻击方法只依赖于消息摘要的长度,即Hash函数值的长度。
有人可能会认为,为了攻击一个m位的消息摘要,将需要2m数量级的操作次数。
实际上,GideonYuval于1979年在他的论文中提出了一种生日攻击方法,用这种方法通常只需要2m/2量级的操作次数。
也就是说,如果攻击者希望伪造消息M的签名来进行欺骗,则他需要找到满足H(M′)=H(M)的M′来替代M。
对于生成64位哈希值的哈希函数,平均需要尝试232次就可能找到M′。
为了抵抗生日攻击,通常建议消息摘要的长度至少要达到128bit。
除生日攻击法外,对一些类型的Hash函数还有一些特殊的攻击方法,例如,中间相遇攻击法、修正分组攻击法和差分分析法等。
值得一提的是,我国山东大学王小云教授等人在2004年8月在美国加州召开的国际密码大会(Crypto’2004)上所做的Hash函数研究报告中指出,他们已成功破译了MD4、MD5、HAVAL-128、RIPEMD-128等Hash算法。
他们找到的碰撞基本上宣布了MD5算法的终结,这一成就或许是近年来密码学界最具实质性的研究进展。
最近国际密码学家Lenstra利用王小云等人提供的MD5碰撞,伪造了符合X.509标准的数字证书,这就说明MD5算法的破译已经不仅仅是理论破译,而是可以导致实际的攻击。
在MD5算法被以王小云为代表的中国专家攻破后,世界密码学界仍然认为SHA-1算法是安全的。
然而,2005年2月,王小云就宣布攻破SHA-1算法的消息。
因为SHA-1在美国等国家有更加广泛的应用,密码被破的消息一出,在国际上的反响可谓石破天惊。
换句话说,王小云的研究成果表明了电子签名从理论上讲是可以伪造的,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。
3.3.3消息认证和消息完整性
1.消息完整性检验的一般方法
消息完整性检验的一般机制如图3-6所示。
无论是存储文件还是传输文件,都需要同时存储或发送该文件的数字指纹;验证时,对于实际得到的文件重新产生其数字指纹,再与原数字指纹进行对比,如果一致,则说明文件是完整的,即未被篡改、删除或插入,否则,是不完整的。
图3-6消息完整性检验的一般机制
消息完整性检验只能检验消息是否是完整的,不能说明消息是否是伪造的。
因为一个伪造的消息与其对应的数字指纹也是匹配的。
2.消息认证
消息认证是指使意定的接收者能够检验收到的消息是否真实的方法。
消息认证具有两层含义:
一是检验消息的来源是真实的,即对消息的发送者的身份进行认证;二是检验消息的完整性,即验证消息在传送或存储过程中未被篡改、删除或插入等。
产生消息的数字指纹的方法很多。
当需要进行消息认证时,仅有消息作为输入是不够的,需要加入密钥K,这就是消息认证的原理。
消息认证码(MessageAuthenticationCode,MAC)是与密钥相关的单向杂凑函数。
MAC与单向杂凑函数不同的是,但它还包括一个密钥,不同的密钥会产生不同的杂凑函数,这样就能在验证发送者的消息是否被篡改的同时,验证是由谁发送的。
MAC通常表示为
MAC=CK(M)
其中:
M是长度可变的消息;K是收、发双方共享的密钥;函数值CK(M)是定长的认证码,也称密码校验和。
MAC是带密钥的消息摘要函数,即一种带密钥的数字指纹,它与不带密钥的数字指纹是有本质区别的。
(1)消息认证
认证码被附加到消息后以M||MAC方式一并发送,接收方通过重新计算MAC以实现对M