计算机网络安全技术第5章.ppt
《计算机网络安全技术第5章.ppt》由会员分享,可在线阅读,更多相关《计算机网络安全技术第5章.ppt(71页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章第五章数字签名与认证数字签名与认证5.1数字签名的基本概念1数字签名及其特点在信息化社会,签名盖章和识别签名是一个重要的环节,例如,银行业务、电子资金传送、股票、证券交易、合同、协议的签字等,都需要签名。在计算机广泛应用的时代,应用密码学的方法实现数字签名,具有重要的理论意义,更具有重要实际意义。假设发送方sender发送了一个签了名的信息message给收方receiver,那么sender的数字签名必须满足以下条件:1)receiver能够证实sender对信息message的签名;2)任何人包括receiver在内,都不能伪造sender对message的签名;3)假设sender
2、否认对信息message的签名,可以通过仲裁解决sender和receiver之间的争议。假定sender向receiver发送一则消息message,采用公开密码系统的签名过程描述如下:1)sender计算:c=Da(message)对message签名。Da是加密变换,所使用的秘密密钥为sender所私有,任何人,包括receiver在内,由于不知道sender的秘密钥,所以不能伪造sender的签名。2)receiver通过检查Ea(c)是否恢复message来验证sender的签名,Ea是Da的逆变换,Ea变换中所使用的密钥是sender的公开钥。3)如果sender和receiver
3、之间发生争议,仲裁者可以用2)中的方法鉴定sender的签名。例:sender表示一个银行电子支付系统的客户,receiver代表sender所在的银行。Receiver收到sender要求取款1000万日元的信息后,必须确定这个信息确实是由sender签名发出的。如果以后sender否认这一笔取款,receiver能够向仲裁者证实,这个取款单确实是由sender签署的。如果采用公开钥密码系统签名,密秘钥仅为sender所拥有,公开钥大家都知道,sender无法否认自己的签名。别人由于不知道秘密钥也无法冒名顶替sender的签名。在上例中,由于银行和客户之间的业务信息往来应秘密进行,所以这个签
4、名系统除要求生成签名和验证外,还要求加密。当然,和纸上签名一样,并非所有的数字签名系统都要求保密性。以上介绍的数字签名方案属于所谓的“常规数字签名方案”这类方案具有如下特点:1)签名者知道他签署的报文的内容。2)任何人只要知道签名者的公开密钥,就可以在任何时候验证签名的真实性,不需要签名者的“同意”信号或来自其他方面的信号。3)具有基于某种单向函数运算的安全性。但在电子货币、电子商业和其他的网络安全通信的实用中,可能要放宽或加强上列特征中的一个或几个,或添加上其他安全性特征,以适应各种不同的需要。例如,在因特网上购买商品或服务,要向供应商或银行付款,顾客发出包含有他的银行账号或别的重要信息的付
5、款报文,由收款者作出(电子)签名才能有效,但账号之类的信息又不宜泄露给签名者,以保证安全。这种情况,就要使用盲签名方案(BlindSignatureScheme)。盲签名方案的工作原理是这样的:用户A有报文要求用户B签署,但不能让B知道关于报文m的任何信息。设(n,e)是B的公开密钥,(n,d)是他的秘密密钥。A用专用通信软件生成一个与n互质的随机数r,将m=remmodn发送给B,这样,B收到的是被r“遮蔽”的m值,即m,它不能从m获取有关m的信息。接着,B发回签名值s=(m)dmodn=(rem)dmodn=remdmodn,A对收到的s计算s(re)-1modn=mdmodn,就得到了真
6、正的来自于B的对m的签名s=mdmodn可见,运用盲签名方案,A无法代替或冒充B的签名,而B则不知道他自己所签署的报文的真实内容。除了盲签名方案之外,还有其它几种专用数字签名方案:“小组签名方案”(GroupSignatureScheme):一个小组的任一成员可以签署文件,验证者可以确认签名来自该小组,但不知道是小组的哪一个成员签署了文件。“一次性签名方案”(OnetimeSignatureScheme):仅能签署单个报文的签名方案。“不可抵赖签名方案”(UndeniableSignatureScheme):在签名和验证的常规成分之外添上“抵赖协议”(DisavowalProtocol),则仅
7、在得到签名者许可信息后才能进行验证。“带有数字时间标记系统(DigitalTimestampingSystem)的签名方案”:将不可篡改的时间信息纳入数字签名方案。“多重签名”:使任意n个签名人产生的n个签名组成一个单一的签名。2数字指纹仅用上述的数字签名是不够的,也是不实用的。因为数字签名不像纸上签名那样,签名和被签署的内容紧密联系在一起,因而不易被篡改。在数字签名中,如果sender的签名未与被签署的文件本身(message)相联系,就留下了篡改、冒充或抵赖的可能性。为了把那些千差万别报文(文件)和数字签名不可分割的结合在一起,即签名与其发送的信息紧密结合起来,需要设法从报文中提取一种确定
8、格式的、符号性的摘要,称为“报文摘要”(messagedigest),更形象的一种说法是“数字指纹”(digitalfingerprint),然后对它进行签名并发出。可以说,真正的数字签名是信息发送者用其秘密密钥对从所传送的报文中提出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时,也确保信息报文在传递过程中未被篡改(即完整性)。当信息接受者受到报文后,就可以用发送者的公开密钥对数字签名进行验证。如果实体A要发送一个需要签署的报文给实体B,通信软件会调用某种报文摘要算法处理报文内容,得出一个数字指纹,然后用自己的秘密密钥将它加密,这才是真正的
9、数字签名,将它同报文一并发送给B。B接到报文和数字签名后,用A的公开密钥将数字签名解密,恢复出数字指纹。接着用A所用的一样的报文摘要算法处理报文内容,将算出的数字指纹和接受到的经解密的数字指纹比较,如果两者完全相同,则A的数字签名被B验证成功,可以相信该报文是真实的,确实是发自于A。否则,报文可能来自别处,或被篡改过,有理由拒绝该报文。用上述方法,别人也不难读取报文并验证数字签名,这在使用中是不妥当的。为使报文本身的内容不泄露给别人,A只要再添加一个操作步骤:用B的公开密钥现将待发的报文加密,当然,B在验证数字签名无误后,要用其自己的秘密密钥解密,才能得到原始机密信息。总之,“报文摘要”是一种
10、防止信息被篡改的方法,在数字签名中有重要作用的摘要算法,即生成报文“数字指纹”的方法,近年来倍受关注,构成了现代密码学的一个重要侧面。它是通过一类特殊的散列函数(Hash)生成的,这些函数的输入可以是任意大小的信息,而输出是一个固定长度的摘要。这些摘要有这样一个性质,如果改变了信息中的任何内容,甚至只改变了一位,输出摘要也将会发生不可预测的改变,即输入信息的每一位都影响输出的摘要。对这些Hash函数的特殊要求是:1)接受的输入报文数据没有长度限制。2)对任何输入报文数据生成固定长度的摘要(数字指纹)输出。3)从报文能方便的算出摘要。4)难以对指定的摘要生成一个报文,而由该报文可以算出该指定的摘
11、要,即不可逆性。5)两个不同的报文难以生成相同的摘要,即唯一性。显然,上面前三点是实用性的要求,保证对长短不一的报文易于生成同样大小的“数字指纹”;后两点则是安全性的要求,是建立在某种单向函数的基础之上的。这样摘要算法从给定的文本块中产生的数字签名,可以有效地防止从一个签名中获取文本信息或改变文本信息内容的行为。显然,客户机和服务器必须使用相同的算法。数字签名不同于手写签名:数字签名随文本的变化而变化,手写签名反映某个人个人特征,是不变的,数字签名与文本信息是不可分割的,而手写签名是附加在文本之后的,与文本信息是分离的。5.2数字签名算法DSADSA(digital signature alg
12、orithm)算法是美国国家标准与技术学会(NationalInstituteofStandardsandTechnology,NIST)于1994年公布的一个数字签名标准。DSA是一个公开钥数字签名算法,用于检验数据的完整性和一致性,第三方可以使用它来确认数字签名的合法性。1DSA算法描述DSA是Schnorr和ELGamal数字签名算法的变体,DSA算法使用的参数含义如下:p:L比特长的素数,其中L范围是从512比特到1024比特,并且要求是64的整数倍(在原始标准中p的尺寸固定的512比特,后来p的尺寸由NIST作了改变)。q:160比特的数,并且要求是p-1的因子。g:gh(p-1)/
13、qmodp,其中h是小于p-1的任意数,并且h(p-1)/qmodp1x:小于q的数y:ygxmodp前三个参数p、q、g是公开的,可以由一组网络用户共享。秘密密钥为x,公开密钥为y。DSA算法还利用了单项哈希函数H(m),该标准还规定了安全哈希算法。对信息m进行签名过程可以描述如下:1)发送方sender生成一个随机数k,并且kq2)发送方sender生成签名:r=(gkmodp)modqs=(k-1(H(m)+xr)modq参数r和s是sender的签名,sender把这些信息发送给接收方receiver。3)receiver通过计算验证这些签名:w=s-1modqu1=(H(m)w)mo
14、dqu2=(rw)modqv=(modp)modq如果v=r,那么签名被证实。1使用预先计算来加快速度DSA的实现经常是通过预先计算来加快速度的。注意到r的值不取决于信息(由随机数k确定)。可以生成一串k值,然后再计算对应的r值,也可以计算k对应的k-1。于是,当对消息签名时,可以用给定的r和k-1进行计算。表5.1给出了DSA样本软件速度。表表5.1对于不同的模长度带有对于不同的模长度带有160比特指数的比特指数的DSA速度速度模长度签名验证512比特0.20秒0.35秒768比特0.43秒0.80秒1024比特0.57秒1.27秒如果p取512比特,DSA算法对长期安全强度是不够的,如果取
15、1024比特,DSA算法对长期安全强度是足够的。3DSA素数生成密码学家Lentra和Haber指出DSA的一些模是容易攻破的。如果一些网络用户使用这样的模,那么他的签名就会被伪造。但是这些模很容易被检测,而且数目很少,以至于选择这样的模的概率很小。NIST学会推荐生成两个素数p、q的一个特别的方法,其中q能整除p-1,p长度为L比特,L范围是512比特到1024比特之间,并且是64的整数倍。素数q长度是160比特。令L-1=160n+b,其中L是p的长度,n和b是两个数,b160。DSA素数生成步骤如下:1)选择至少有160比特的任意序列,称之为S。令g是S的比特长度;2)计算U=SHA(S
16、)SHA(S+1)mod2g,其中,SHA是安全哈希算法;3)设置U的最高有效位和最低有效位为1,形成q;4)检查q是否是素数;5)如果q不是素数,则转会步骤1;6)令C=0且N=2;7)对应k=0,1,2,n,令Vk=SHA(S+N+k)mod2g);8)令W是一个整数W=V0+2160V1+2160(n-1)Vn-1+2160nVn(mod2b)并且令X=W+2L+1;9)令p=X(Xmod2q)1),要求pmod2q=1;10)如果p2L-1则转到步骤13;11)检查p是否是素数;12)如果p是素数,则转到步骤15;13)令C=C+1且N=N+n+1;14)如果C=4096,则转到步骤1
17、,否则转到步骤7;15)存储S和C的值,用于生成p和q。上式中,变量S称作“种子”,C称作“计数器”,N称作“偏移量”。4用DSA的RSA加密假设DSA算法由一个单独的函数调用实现:DSAsign(p,q,g,k,x,h,r,s)给函数提供参数p,q,g,k,x,h,函数返回签名r,s。使用RSA加密是比较容易的,设模为n,消息为m,公开密钥为e,调用DSAsign(n,n,m,e,0,0,r,s)那么返回的r值就是密文,令c=r。相应的,用RSA实现解密也是比较容易的,如果c为密文,d为秘密密钥,调用DSAsign(n,n,c,d,0,0,r,s)那么返回的r值就是明文。5DSA变体为了突出
18、不同方面的实现特性,下面介绍几种变体。第一种变体使签名容易实现,它是通过使用户不去计算k-1来实现的,DSA变体的所有参数与DSA中参数相同。为了对信息m签名,发送方生成两个随机数k和d,且kq,dq。签名:r(gkmodp)modqs(H(m)+xr)d)modqt(kd)modqreceiver通过计算验证这些签名:w(t/s)modqu1(H(m)w)modqu2(rw)modq如果,r(modp)modq那么签名被证实。第三种DSA变体允许成批地验证。接收方成批地验证签名。如果都是有效的,则结束;如果某一个无效,接收方还得去找到这个签名。遗憾的是,这种方法不安全。签名者和验证者很容易生
19、成一组伪造的签名来满足验证的标准。第四种变体是DSA素数生成的变体,即1)选择至少有160比特的任意序列,称之为S。令g是S的比特长度;2)计算U=SHA(S)SHA(S+1)mod2g),其中SHA是安全哈希算法;3)设置U的最高有效位及最低有效位均为1,形成q;4)检查q是否是素数;5)令p是q、S、C和SHA(S)的并置链接,C被设置成32比特,并且全为0;6)p=p(pmodq)+1;7)p=p+q;8)如果p中的C是0X7fffffff,那么转到步骤1;9)检查p是否是素数;10)如果是合数,则转到步骤7。关于这个变体,可以不必存储用于生成p和q的S和C的值,他们与p嵌在一起。对于应
20、用,不需要大量的存储器,这一点很可贵。但这种模式是否降低了DSA的安全性,目前还不十分清楚。4使用DSA生成、验证签名的实例这里介绍使用Java语言实现使用DSA生成、验证签名的一个例子。1)Java简介 谈论Internet和Intranet或网络设备而不谈论Java是不可能的。似乎一夜之间Java成为建立网络化应用的标准平台,Java是一种通用的、并发的、基于类的、面向对象的程序设计语言,它被设计得足够简单以便许多程序员很容易使用它。Java是一种生产性语言而不是研究性语言,Java使用垃圾收集器技术自动地进行内存管理,避免不安全因素。Java程序设计语言和历史上任何其他程序设计语言相比被
21、采用得最快,并且Java技术被大部分公司认作一个关键技术来支持平台独立存取广泛的协作资源无疑,Java在软件开发者中越来越受欢迎。它对Internet和Intranet应用的开发和使用起到了革新的作用。它提供了一种新的、令人兴奋的面向对象的网络设计模型。这种模型易于理解,使用这种模型很容易地进行程序设计。Java取得了巨大的成功的另一个方原因是:用Java写一次程序,测试一次,然后可以到处运行(writeaprogramonce,testitonce,andthenrunitanywhere)而不需要考虑所用的硬件和操作系统。这可以实现在网络上软件、信息的共享和再利用。这个事实也蕴含一个潜在的
22、优势:软件开发时间和成本的巨大节省。Java.math.BigInteger提供了任意精度的大数的模代数运算,如最大公约数计算gcd(BigInteger),素数生成测试BigInteger(intbitLength,intcertainty,Randomrnd),余 数 计 算,指 数 运 算modPow(BigInteger),乘法逆元素运算modInverse(BigInteger)。使用这些方法进行程序设计是很方便的,这就是使用Java的优点之一。如果使用其他的程序设计语言,这些都要自己编程。Java安全API提供加密、信息融合、密钥管理、认证、存取控制和数字签名功能,允许开发者进行底
23、层和高层的安全应用。2)使用DSA生成、验证签名的例子使用Java安全API(应用程序接口)为数据生成一个签名,并验证签名是真实的。步骤步骤1准备初始化程序结构数字签名的方法是包括在java.security的软件包中的,所以要输入来自于这个软件包的一切。还要输入java.io软件包,因为它包括了输入文件数据所需要的方法。importjava.io*;importjava.security.*步骤步骤2生成公开密钥和秘密密钥为能生成签名,必须做的第一件事就是生成密钥对:秘密密钥和对应的公开密钥。密钥由随机数生成器生成。秘密钥用于生成数字签名,对 应 的 公 开 钥 用 于 验 证 签 名。密
24、钥 对 是 通 过 使 用KeyPairGenerator类来生成的。在这个例子中,为“DSA”算法生成一个公开的和秘密的密钥对。生成的密钥具有1024bit长度。生成一个密钥对步骤如下:(1)创建一个密钥对生成器为DSA签名算法生成密钥的第一步是获得一个密钥对对象。KeyPairGeneratorKeyGen=KeyPairGenerator.getInstance(“DSA”)(2)初始化密钥对生成器所有的密钥对生成器都共享“强度”(strength)和“随机数源”(sourceofrandomness)的概念。KeyPairGenerator类中的方法initialize有两个类型变量。
25、对DSA密钥对生成器强度Srength设置为1024,随机数源必须是java中的SecureRandom类的一个实例。简单的说,可使用SecureRandom的空的构造函数,这将自动的生成一个随机数生成器所需要的一个“种子”(seed)值.KeyGen.initialize(1024,newSecureRandom();(3)生成密钥对,并在KeyPair类的实例中存储密钥KeyPairPair=KeyGen.GenerateKeyPair()步骤3对数据进行签名在生成秘密钥和公开钥之后,准备对数据进行签名。在这个实例中,将对文件中包括的数据进行签名,可以从命令行得到文件名。使用签名Signa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 安全技术
限制150内