3.1 数字签名的定义
ISO对于数字签名是这样定义的:附加在数据单元上的一些数据,或是对数据单元所做的密码变换,这种数据或变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被他人伪造。
数字签名的过程中应该满足一下要求:
(1)签名者发出签名后,不能否认自己所签发的消息。
(2)接收者能够确认或者证实签名者的签名,不可否认。
(3)所有人不得伪造签名。
(4)第三方在双方消息传送的过程中起到监督的作用,可以确认双方之间的消息传输,不可对传输过程进行伪造,当一旦发生签名纠纷时,第三方可以进行裁决,解决双方争执[6]。
3.2 数字签名的分类
数字签名根据密码体制可以分为对称密钥密码体制和非对称密钥密码体制两种。对称密钥密码体制的数字签名:文件的安全和正确性都取决与第三方。报文再三方之间传递,大大降低了传输效率,增加了传输时间[7]。
非对称密钥密码体制的数字签名:最大的特点就是有公共密钥和私钥两个密钥。大致过程如下:发送方用特有的私钥对报文解密,再用接收方的公共密钥进行加密,之后再发送给接收方,接收方收到报文后先用自己的私钥进行解密运算,再用发送方的公共密钥进行加密运算,就可以得到报文[8]。在这个过程中由于除了发送方自己以外没有人可以对报文进行解密,保证了报文的安全,便是对报文进行签名。由于接收方拥有发送方的公共密钥,所以发送方也不可能对自己发送过的报文进行抵赖。同时如果接收方想对报文进行篡改也是不可能的因为一旦篡改就不能再使用发送方的公共密钥进行加密发送给第三方了,证明报文被篡改过。比较来看非对称密钥密码体制比较容易实现数字签名,并且安全快捷[9]。
4.数字签名系统的设计
本部分为本次论文核心部分通过代码实现数字签名系统的过程。主要通过Java平台对数字签名用到的三个过程进行一一的描述,从而还原数字签名的过程。
4.1 开发工具的介绍
Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling 和同事们共同研发,并在1995年正式推出。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Javaapplet。其次,Java技术也在与时俱进不断进步和发展(2010年Oracle公司收购了SUN)。
4.2 数字签名系统的介绍
根据数字签名的过程将本系统分为三个部分:
(1)生成密钥对
首先定义私有和公共的文件输出流(FileOutputStream)和对象输出流(ObjectOutputStream),然后通过KeyPairGenerator类用于生成公钥和私钥对。使用getInstance工厂方法(返回一个给定类的实例的静态方法)构造密钥对生成器。密钥对生成器使用DSA算法,通过调用initalize方法使KeyPairGenerator初始化密钥大小为1024。调用generateKeyPair()获取生成的密钥对,通过getPublic()和getPrivate()分别取得公共和私有的密钥。最后使用公共密钥和私有密钥分别写入公共私有的对象流。
图1 公私钥对生成
(2)在数据发送端对数据进行签名
首先定义File对象和FileInputStream文件输入流读入文件。紧接着获取密钥定义FileInputStream输入流和ObjectInputStream对象流读入密钥。通过Signature类使用getInstance工厂方法构造DSA算法Signature对象。使用initSign()方法初始化此验证的对象再通过update()方法为读入的字节数组更新签名。最后通过FileOutputStream文件输出流将签名写入文件。 数字签名系统的设计与实现+流程图(3):http://www.751com.cn/jisuanji/lunwen_3472.html