基于JAVA的数字签名设计与实现

2011-08-08 12:48黄云
电脑与电信 2011年12期
关键词:数字签名报文密钥

黄云

(渝中职业教育中心,重庆 400042)

1.引言

随着计算机技术和网络技术的发展,计算机网络在线教学、在线考试等信息系统作为一种新的应用形式应用越来越广泛。与传统的教学模式相比较,计算机网络在线信息系统可以通过开放的Internet突破传统考试地域和空间的限制,可以组织大规模和跨地区的教育教学,也可以为远程教育和终身教育提供一种便捷有效的教学方式。但在具体应用实施过程中,计算机网络在线信息系统也存在需要解决的技术难点,主要体现在Internet的开放性和无序性特别是信息安全传输问题,计算机网络在线信息系统在Internet上存在攻击的可能。

2.数字签名机制

在网络信息传输中,对信息进行加密可以保证信息的机密性。但互联网是一个完全开放的环境,在基于Internet的计算机网络在线信息系统,还需要用一种机制来对通信双方的身份进行认证,以保证系统的安全。数字签名是基于公开密钥加密体制的。在公开密钥加密体制下,加密密钥是公开的,保密性完全取决于解密密钥,即私有密钥的保密。从另一个角度讲,私有密钥代表信息传输者的身份特征。需要数字签名时,信息发送方首先通过既定的私有的加密密钥实现信息加密,而在信息的接收方,则通过发送方的公开密钥实现信息的解密还原。以上的信息发送方加密、信息接收方解密的过程便是数字签名的基本原理。此外,第三方也可以通过发送方的公钥进行信息解密,这时,发送方可以用接收方的公钥对信息加密,这样只有接收方才能用自己的私钥对信息进行解密,从而保证信息的安全。数字签名具备如下特点:

(1)数字签名具有不可伪造性,用作用户的唯一标识,并因此确定发送方的身份;

(2)保证信息的完整性。数字签名必须防止信息在传输过程中被篡改或替换;

(3)具有不可抵赖性,发送者事后不抵赖对报文的签名。

经过不断的研究、发展,出现了多种数字签名的加密算法,Hash签名、RSA签名、DSS签名算法应用较为广泛。其中DSS是被建议的数字签名标准,主要包括以下步骤:

(1)发送方用一个Hash函数对报文进行处理,产生消息摘要,消息摘要MD是通过Hash函数产生,Hash函数为单向产生的Hash码,Hash码的作用在于将消息M映射为H(M),消息M为任意长度,H(M)则长度固定且长度较短,H(M)即为消息摘要;

(2)信息发送方将该信息的私人密钥和报文摘要进行DSA算法计算,产生数字签名,并实现报文和数字签名共同发送;

(3)在信息接收方,通过采用相同的Hash函数实现对报文的加密,并生成加密消息摘要,在此基础上,对信息发送方的公开密钥和消息摘要应用DSA算法,进而生成数字签名S1;

(4)将数字签名S1和从接收到的消息中得到的数字签名S2比较,若S1和S2相等,则数字签名得到难,否则,数字签名可能是篡改或伪造。

美国国家标准技术研究所(NITS)于1991提出了数字签名标准DDS,并在1993年和1996年进行了修改。DSS是利用安全SHA算法的一种数字签名技术,即数字签名算法DSA。H(x):Hash函数。DSS中选用SHA。算法中应用了下述参数:

p:素数,其中2L-1

q:p-1的160bits的素因子,其中2159

g:g=h((p-1)/q)mod p,h 为一整数,满足 11;

x:随机或伪随机整数,x

y:y=gx mod p ,(p,q,g,y)为公钥;

k:随机或伪随机整数,其中0

对于明文信息M,签名及验证协议如下:

(1)签名。产生随机数 k,k

其中k-1(H(M)q=1,0

(2)验证。信息接收方收到M、r和s后,计算u1=(H(M)*w)mod q,u2=(r*w)mod q,

其中,w=s-1mod q,v=((gu1*yu2)mod p)mod q,如果 v=r,则判断数字签名是有效的。

3.基于JAVA的数字签名设计

在数据签名的设计实现方面,C++、VB、Java均能有较好地实现,作为应用普遍的Java编程语言,通过其提供的密钥管理、认证、加密、数字签名和存取控制功能,Java编程语言提供的签名方法包括在Java.security软件之中,在应用过程中Java编程语言能够较好地实现数字签名,数字签名实现过程如下:

图1 数字签名实现过程

基于Java的数字签名密钥生成、数字签名和验证设计实现如下:

(1)密钥对的生成实现

Java语言生成密钥对主要是基于Key Pair Maker类来实现,密钥对的生成实现过程如下:第一步是建立加密密钥对的生成器,通过密钥对生成器,生成密钥对生成器对象;第二步实现对密钥对生成器对象的初始化,在初始化过程中分别针对“随机数源”和“强度”两个变量进行设置,随机数源变量由Secure Random类自动生成,“强度”变量默认设置为1024位;第三步是通过调用GenerateKeyPair函数返回密钥(KeyPair)对象,并通过调用getPublic函数和getPrivate函数分别提取公开密钥和私人密钥。实现代码设计如下:

Key Pair Maker Key Obj=Key pair Maker.getInstanc("DS A");//密钥对生成器生成

Key Obj.initalize(1024,new Secure Random());//密钥对生成器初始化

KeyPairDouble=KeyObj.GenerateKeyPair();//密钥对生成

Public Key Key Public=Key Double.getPublic();//公开密钥提取

Private Key Key Private=dey Double.getPrivate();//私人密钥提取

(2)数字签名的实现

首先是生成和验证签名对象,通过Signture签名类实现。然后是实现对私人密钥的初始化,主要通过SHA-1算法和DSA算法实现。最后是生成数字签名,通过调用Update方法,将签名信息提供至签名对象,在签名对象获取信息之后,数字签名便生成了。

Signture DisSign=Signture.get Instance("DSA or SHA");//数字签名的生成

Dis Sign.inisign(DeyPrivate);//私人密钥的初始化

Dis Sign.Update(Message);//签名信息提供

SignMessage=DisSign.sign();//签名操作执行

(3)验证签名

第一是验证签名对象的建立,在此基础上,实现对公开密钥的初始化,主要通过调用Initverify实现。第二是向验证签名对象提供验证签名信息,主要通过Update方法实现。第三是验证签名是否正确,主要通过调用verify函数实现,根据函数返回的逻辑值进行判断。主要程序代码如下:

Signature DisSign=SignaturegetInstance("DSA or SHA");//验证签名对象的建立

DisSign.initVerify(KeyPublic);//公开密钥的初始化

DisSign update(signMessage);//签名验证信息提供

Beelean Result=DisSign.verify(signMessage);//验证签名

4.结束语

基于公开密钥加密体系的数字签名,已经成为网络安全通信中的一项重要安全机制。对称密钥加密可以保证信息的机密性,而数字签名技术可以鉴别通信双方的身份,并实现网络信息传输的完整性,已经成为Internet环境下实现信息安全传输的必备手段,在电子商务和电子政务等Web应用中得到了广泛应用。对于计算机网络在线信息系统来说,也可于使用数字签名技术来认证通信双方的身份,实现信息的安全传输。

[1]刘泉,吴涛.基于Java的数字签名研究与实现[J].武汉理工大学学报(信息与管理工程版).2004(01):11-14.

[2]郑若鹢.用Java创建企业内部CA[J].福建工程学院学报.2006(01):123-128.

[3]解亚龙,许巧祥.基于J2EE架构的高可用性办公自动化系统[J].四川大学学报(工程科学版),2007(S1):24-26.

[4]武艳丽,陶振凯.基于J2EE的Web客户端安全验证[J].科技创新导报,2008(02):27-29.

[5]崔明磊.基于CA认证系统的移动代理安全系统的研究[J].福建电脑,2009(09):17-18.

猜你喜欢
数字签名报文密钥
基于J1939 协议多包报文的时序研究及应用
幻中邂逅之金色密钥
密码系统中密钥的状态与保护*
CTCS-2级报文数据管理需求分析和实现
浅析计算机安全防护中数字签名技术的应用
浅析反驳类报文要点
TPM 2.0密钥迁移协议研究
一种对称密钥的密钥管理方法及系统
基于数字签名的QR码水印认证系统
ATS与列车通信报文分析