基于消息处理的一次签名方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于消息处理的一次签名方案
刘辉
河南理工大学计算机科学与技术学院,河南焦作(454000)
E-mail :liupeihui01@
摘 要:现存的一次签名方案有两个主要的不足:签名太长、实现过程相对复杂。这两个不足在一定程度上限制了其应用。为了克服这两种缺点,在保证签名安全性的前提下,本文提出一种改进的基于消息处理的一次签名方案:利用不等式12...2n
b ≤++对长度为b bit 的消息进行分割,缩短签名的长度,使一次签名实现起来更加高效。最后,我们对改进的一次签名方案的安全性和效率进行分析。
关键词:一次签名;单向函数;数据压缩;消息分割
1. 引言
一次签名是一种基于单向函数的数字签名,这种签名方案在对一条消息签名时,安全性是特别高的,而对多条消息签名时是不安全的。在1978年和1979年分别由Rabin [1]和Lamport [2]提出,一次签名是一种特殊的数字签名方案,其基本思想是利用任何单向函数对消息进行签名。在其提出一次签名后的二十多年里,许多专家、学者在他们的理论基础上,提出了许多改进的方案。使一次签名方案在生活中获得了很大的应用,例如:在线/离线签名[3]、带前向安全性的数字签名[4]、广播授权协议[5]等。一次签名相对于普通的一个最主要的优势就是签名的安全性依赖于没有陷门的单向函数,并且可以利用SHA-1[10]等快速哈稀函数来实现。然而,以前所提出的一次签名方案的签名长度和密钥的个数都取决于这样一个等式2b ≤k t C (其中b 表示消息的位数,t 表示公开的密钥数,k 表示应用于签名的私钥的个数)。下面我们给出基于这种等式的一般方案并分析其缺点,然后给出我们自己提出的不依赖于这种等式的改进的方案 。
在Lamport [2]提出一次签名方案后,许多人针对他的方案进行了一些改进,大多数人的思想是基于2b ≤k t C 这样一个等式,下面我们给出一种这样的方案,它包括三个算法:密钥生成、签名和验证。假设要对一条b 位长度的消息m 进行签名。选择合适的整数t,k 使其符合关系2b ≤k t C ,用T 表示集合{1,2,3,...,t},k T 表示含k 个元素的T 的子集,S 函数表示从{1,2,3,...,2b -1}到k T 的一一映射,所以S(m)能够标识唯一一个k T 的k 个元素的子集。让f 是一个操作在长度为a (a 是一个安全的参数)比特的字符串上的单向函数。
(1)密钥的产生:用密钥产生器随机选择t 个长度为a 的字符串i s (i =1,2,...t ),把i s 当作私钥。计算公钥i v =f (i s )。
(2)签名过程:把m 看作是0到2b -1的一个整数,并且计算S (m )={1i ,...,k i }∈k T ,1i s ,...,k i s 就是消息对m 的签名。
(3)验证过程:验证签名('1s ,...,'
t s )是否合法,验证者只需要重新把m 看做一个0到
2b -1之间的一个整数,计算出{1i ,
...,k i }作为k T 的第m 个含k 个元素的子集。验证是否1'1()i f s v =,...,'()t t i f s v =,是的话就是合法的签名,不是的话,就是伪造的。 从以上所提的方案可以看出,由于m t k 必须符合关系式2b ≤k
t C ,所以消息m 比较
大的话,相应的就使得t 和k 比较大,也就是说签名的长度和密钥的长度都会很大。另一方面,针对S 函数,有很多人设计了不同的S 函数,但实现起来过于复杂。为了尽可能的使签名的长度比较短,所用到密钥比较少,并且,不再涉及到复杂的S 函数,我们提出以下这个改进的一次签名方案。
2. 改进后的一次签名方案
为了尽可能的减小签名的长度,我们首先对长为b 比特的消息m 进行压缩。可以有很多数据压缩方案,可以利用私钥密码算法如DES 对消息压缩成64位或者是128位[6]。为了使压缩的效率更高我们使用散列函数对数据进行压缩处理,从而使任意长度的消息被压缩成相同长度的消息,在这里我们把'm 看作是压缩后的输出结果,另一方面,为了进一步减少密钥的数量,舍弃原来方案中必须用到的s 函数。本文所提出的方案依赖于这样一个不等式1'2...2n
b ≤++,('b 表示压缩后的数据的长度。)也就是说我们把压缩后的数据'm 分割成'1m …'n m 共n 部分,每部分的数据长度分别是21 bit 、22 bit 、…、2n bit ,签名时把每一部分对应一个整数,则一条消息签名后的长度就是n ,而公钥的长度就是2n -1。
2.1实施过程
(1)消息压缩
对要签名的消息,特别是比较大的消息,签名之前使用SHA-1等散列函数对其进行压缩处理,使不同长度的消息压缩成相同长度的消息。假如对消息m 进行压缩,输出结果为'm ('m 是一条160比特的消息)。则:
'm =()hash m
(2)消息分割
根据160≤21+2…+2n 求出最小的n ,把消息分割成n 部分,每一部分的长度是2
i (1,2,i =…n )比特,其中如果第n 部分的比特数小于2n ,则在其后面补0,使其成为2n 比特的数据。从而得到:
'''
12'...n m m m m =
(3)密钥的产生
利用密钥生成器随机生成21n −个长度为l (l 是一个安全的参数)的随机字符串1s ,2s ...,21n s −作为私钥,利用单向函数f 求出公钥i v 。
()i i v f s =
(4)签名过程
根据二进制与十进制之间的转换关系,计算每个'
i m (1,2,...,i n =)对应的十进制整数i j (1,2,...,i n =)。则 i j s 就是对'm 的签名,也就是对原消息m 的签名
(5)验证过程
假设验证者需要对签名'1s ,'2...s ,'n s 进行验证签名的合法性,验证者必须和签名者一样对消息m 进行同样的压缩和分割,得到'''12'...n m m m m =,并计算各个 'i m 的值 ,如