1数字签名技术
近几年,政务电子化成为了社会数字化的一个新的发展方向,电子签章系统是政府部门用于电子文件安全认证的首选,而数字签名是电子签章系统的技术基础。
数字签名,是为了使接收方能够向第三方证明其收到消息的真实性和发送源的真实性而采取的一种加密措施。
数字签名作为一个手写签名的代替方案,必须提供以下安全服务:
(1)数据完整性服务;
用来防止非法用户的主动攻击,以保证数据接收方收到的信息与发送方发送的信息完全一致。
(2)数据源鉴别服务;
用来确保数据由合法实体发出,提供对数据源的对等实体进行鉴别,以防假冒。
(3)禁止否认服务;
又称不可否认性,这种服务用来防止发送数据方发送数据后否认自己发送过数据,或接收方接收数据后否认自己收到过数据。
1.1数字签名的原理流程
数字签名体系的目的在于保证数据来源的可靠性和其输入时间的不可否认性,一般由数字信封结构、签名算法、公钥基础设施PKI等部分组成。签名算法一般由公开密钥密码算法(RSA、ELGamal、DSA、ECDSDA等),对称密钥密码算法(DES,AES等)和单向散列函数(MD2、MD4、MD5或SHA等)构成。
具体的数字签名的原理如下:
(1)被发送文件采用哈希算法对原始报文进行运算,得到一个固定长度的数字串,称为报文摘要(MessageDigest),不同的报文所得到的报文摘要各异,但对相同的报文它的报文摘要却是唯一的。
(2)发送方生成报文摘要,用自己的私钥对摘要进行加密形成发送方的数字签名。
(3)这个数字签名将作为报文的附件和报文一起发送给接收方。
(4)接收方首先从接收到的原始报文中用同样算法计算出新的报文摘要,再用发送方的公钥对报文附件的数字签名进行解密,比较两个报文摘要,如果值相同,接收方就能确认该数字签名是发送方的。如图1所示。
1.2数字签名技术的安全性
数字签名方案是安全的,因为这些方案通常是基于加密技术的。如公钥加密体制。这样就保证了签名数据的完整性,和数字签名的不可否认性。
1.3数字签名算法构成
自从有了数字签名概念,提出了许多数字签名方案。按照签名验证方式,数字签名方案可以分为两大类:
(1)等式验证,如,RSA,ElGamal,DSS/DSA等;
(2)不等式验证,目前比较知名的只有一个,即ESIGN方案。
1.4公钥加密技术
1.4.1DSA签名算法
DSA(DigitSignatureArithmotic)是Schnorr和ElGamal算法的变型,美国国家标准技术研究所于94年公布了数字签名标准(DSS),标准中采用的数字签名算法便是DSA,密钥长度为512~1024,其算法所用到的数学基础为:
(1)参数的产生
算法中应用了下述参数:
p:Lbits长的素数。L是64的倍数,范围是512到1024;
q:p-1的160bits的素因子;
g:g=h^((p-1)/q)modp,h满足h1;
x:x,x为私钥;
y:y=g^xmodp,(p,q,g,y)为公钥;
H(x):One-WayHash函数。DSS中选用SHA(SecureHashAlgorithm)。
p,q,g可由一组用户共享。
(2)签名过程
设明文为m,0。签名者任选一整数k,0并计算:
r=(gmodp)modq
s=k(H(m)+xr)modq
其中kk≡1(modq),而(r,s)即为m的签名文件。
(3)验证过程
首先检查r和s是否属于[0,q],若不是,则(r,s)不是签名文件。然后计算:
t=smodq
r′=(gymodp)modq
若r′=r成立,则(r,s)为m的合法签名文件。
DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,也能确认它们是否是随机产生的,还是做了手脚。RSA算法却做不到。
2DSA加密算法的优化
2.1数字签名过程中素数的生成
由于编程采用的是MicrosoftVisual.NET软件,该软件提供了关于DSA加密算法的相关类,本文研究的是关于DSA加密算法中参数的生成方式。
在公钥密码体制中,有效生成公钥参数是一个先决条件。由于素数的分布非常不均匀,而且随着素数位数的增加,分布越稀疏,因此如何更快速地生成一个大素数是一个非常实际的问题。
素数的生成分成三个阶段:素数的搜索、预筛选以及素性验证。
2.2素数的生成
公钥密码体制实现的过程中,绝大部分时间是浪费在素数的寻找以及素性检测的过程上。因此,运用好的搜索方法来提高素数的生成速度非常重要。两种常用的搜索方法:
随机搜索法:随机产生一个奇数P,对这个奇数进行素性测试,如果是素数,则结束;不是,则重新随机产生一个新的奇数P进行素性测试,重复这一过程直到找到一个素数。
2.3素数的预筛选
素数的测试比较费时,所以在测试前将合数滤掉可以提高效率。通常使用试除法进行过滤,即用小素数如3,5,7,11……等去试除待测数,如果能除尽,则为合数。通过这种方法,可以先行排除掉一些比较明显的合数,提高待测数的素性检测速度。
2.4素数的素性验证
对于一个数是否是素数,必须经过详细的判断,因为,越是位数大的素数,越难于判断其素性。素数验证方法有多种,本文选用Rabin-Miller方法。
首先选一个待测的随机p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
(1)选择一个小于p的随机数a;
(2)设j=0且z=a^mmodp;
(3)如果z=1或z=p-1,那么p通过测试,可能是素数;
(4)如果j>0且z=1,那么p不是素数;
(5)设j=j+1。如果j且zp-1,设z=z^2modp,然后回到(4)。如果z=p-1,那么p通过测试,可能为素数;
(6)如果j=b且zp-1,不是素数。
这个测试速度较快。数a被当成证据的概率为75%。这意味着当迭代次数为t时,它产生一个假的素数所花费的时间不超过1/4^t。实际上,对大多数随机数,几乎99.99%肯定a是证据。
2.5算法设计
参考以上关于素数的生成过程,对于本文的素数生成算法设计如下:
通过伪随机发生器生成一个n位的随机数p,n>100;
判断随机数p的奇偶性,如果随机数是偶数,则加1;
用小于2000的素数对p进行整除,先行筛去比较容易辨认的合数。如果能够整除则重新生成一个新的随机数,如果都不能整除,则进行下一步的拣选;
对某随机数a运行Rabin-Miller检测,如果p通过,则另外产生一个随机数a,再测试。选取较小的a值,以保证速度。做5次Rabin-Miller测试,如果p在其中失败,重新产生p,再测试。
3结束语
本文对数字签名技术的原理和加密算法做了详尽地介绍,设计了一种非常有效的算法,并在实际应用中得到了验证,运用此算法可以提高加密效率。
登录 | 立即注册