0
摘要 Ⅰ
ABSTRACT Ⅱ
第一章 绪论 1
1.1课题研究背景 1
1.2国内外的研究和利用现状 1
1.2.1 文档管理方案的介绍 1
1.2.2 不可否认签名方案 2
1.3 设计的目的和意义 3
第二章 系统开发所用的技术准备 4
2.1数据库 4
2.1.1 数据库的概念 4
2.1.2 数据库的基本结构 4
2.1.3 数据库的特点 4
2.1.4 数据库的应用 5
2.1.5 数据库的设计 5
2.1.6 数据库的类型及选取 6
2.2 WINSOCK通信 6
2.2.1 WINSOCK的基本概念 6
2.2.2 WINSOCK的工作原理 7
2.2.3 WINSOCK的编程特点 7
2.3 不可否认的数字签名 7
2.3.1 不可否认签名的原理 7
2.3.2 不可否认签名的安全性 8
第三章 系统分析及设计 9
3.1 系统分析 9
3.1.1 系统功能 9
3.1.2 选用的编程技术 9
3.2 系统设计 11
3.2.1 总体设计 11
3.2.2 分块设计及模块图 11
第四章 界面的设计与实现 13
4.1 服务器界面设计 13
4.1.1 菜单设计 13
4.1.2 发布新文档功能的设计 14
4.1.3 查询文档功能的设计 15
4.1.4 修改/删除文档功能的设计 16
4.2 客户端界面设计 18
4.2.1 菜单设计 18
4.2.2 各功能的实现 19
第五章 数据库的设计与实现 21
5.1 数据库设计 21
5.1.1 数据库概念结构设计 21
5.1.2 数据库逻辑结构设计 21
5.2 数据库结构的实现 22
5.3 配置ODBC 24
第六章 WINSOCK通信的设计与实现 25
6.1客户机/服务器模式 25
6.1.1通信的基本原理 25
6.1.2通信过程 25
6.2 WINSOCK通信的具体实现 26
6.2.1服务器端WINSOCK通信 26
6.2.2客户端WINSOCK通信 27
6.2.3 服务器端和客户端如何处理消息 28
第七章 不可否认签名的设计与实现 29
7.1 不可否认签名的方案 29
7.1.1 方案描述 29
7.1.2 WINSOCK通信过程 29
7.2程序的设计和实现 30
第八章 总结及完善 33
8.1 系统总结 33
8.2 系统完善 33
致谢 35
参考文献 36
摘要
网络文档管理系统,是当今信息社会一种重要而实用的系统。本文设计了一种具有不可否认功能的网络文档发放与认证管理系统。该系统除了可以用作具有一般常用功能的文档管理系统外,它的不可否认功能还能使接收方收到文档后无法否认。后者对于在网络上发放文档具有重要意义。
系统分为两大功能模块:服务器端和客户端。服务器端发送文档,客户端接收文档。在实现过程中,使用SQL Server 2000数据库来对在服务器端发布的文档进行日常管理,利用客户机/服务器模式的WINSOCK通信来实现文档的收发过程,并使用最早的不可否认签名算法,在收发双方间不断计算、传递,验证参数从而完成了文档的认证。
实现后的系统具有文档管理和不可否认的两大功能。文档管理功能主要有发布、查询、修改和删除等。不可否认的认证功能则是本系统的特色所在,该功能使收发双方在发送和收到文档后都无法否认。
关键词:不可否认签名,数据库,WINSOCK
ABSTRACT
Network document management system is one kind of important and practical system nowadays in the information society. This article designed one kind network document release and authentication management system with an undeniable function. The system can be used as a document management system in generally common use; in addition, its undeniable function makes sure that the receiver will get the document without denying. The latter function has the vital significance for releasing documents in the network.
The system has two main functions modules: Server and client. Server sends documents, client receives documents. In the process of realization, it uses SQL Server 2,000 database to do the daily management for the documents which is issued in the server, it uses Winsock of Client / server model to realize the documents receiving and dispatching process, and it uses the earliest undeniable signature algorithm, calculates, transmits and confirms parameters between the sender and receiver, which completes the document authentications.
After the realization, the system has two functions of documents management and undeniable signature. The documents management function mainly has the issue, the inquiry, the revision and the deletion and so on. The authentication function of undeniable signature is the characteristic of this system, which makes both the sender and receiver to be unable to deny after the documents receiving and dispatching.
KEY WORDS: undeniable signature, database, WINSOCK
第一章 绪论
1.1课题研究背景
电子计算机是上世纪最重要的科学技术成果之一。目前,各行各业除了将计算机引入各种业务管理和开创新型业务外,还大大优化了经营管理方式和决策过程,包括文档的现代化管理。但文档的管理会面临这样一些问题,比如说,如何控制阅读、修改、评审等权限,有些文件需要保密,如何可以做到让有阅读权限的人不能拷贝文件,防止泄密。还有,如何在网上实现文件的评审、批准、加密等。各种与网络文档管理有关的软件平台在这样的趋势下应运而生。
但在文档的发放过程中会存在这样的一些问题:接收方不能确认收到的文档是不是由发送方发送过来的,并且发送方在发送过文档后,也有可能不承认该文档是由他发放的。这时,通常会应用数字签名[1]来解决这一问题。
但一般的数字签名都能够被准确地复制。这个性质有可能导致该签名不停地被拷贝,而每个拷贝又能够被任何人验证,这样就有可能产生欺诈行为。并且接收方在收到文档后也会可能存在否认的欺诈行为。特别是在一些网络交易上,卖家在收到买家的支付后可能会否认;而在一些重要的消息、通知发放时,发送方通常也不会知道他发送的对象是否已经收到文档。这就对文档的发放管理系统提出了新的要求:要通过一定的认证体系来保证收发双方的不可否认性[2]。这样,不可否认签名[3]的算法便被提出,并且越来越多应用于一些网络文档管理系统当中。
1.2国内外的研究和利用现状
1.2.1 文档管理方案的介绍
1. 工商银行的文档管理网络系统选择了较先进的LOTUSNOTES作为其支持软件平台,将先进的计算机网络技术、电子邮件、文档数据库管理、电子编辑排版及扫描仪、输出打印设备等高度集成到一起。主要功能有:
(1)多媒体文档管理;
(2)文档编辑排版具有文字录入、编辑、排版,给文档实体加盖电子印章和附件扫描等功能;
(3)电子邮件是群件最突出的功能之一,它在群件系统中起到信息传递的作用,同时也是群件应用的关键技术之一。
2. NetDM(Net Document Manage)是一款编辑功能丰富,并支持网络备份的文档管理软件。它的最大特点是在数据安全方面:可以为资料库设置密码,只有输入正确的密码才能打开资料库。网络备份功能还可以在保存文档后,自动向邮箱发送一份备份,确保资料安全万无一失!
3. 而在2002年,网络维护解决方案提供商安恒公司再一次同微软公司携手合作,为国内中小企业推出了网络文档管理方案,这个方案基于微软的图表绘制软件Visio和Fluke Networks的网络拓扑专家Lan Mapshot这两款专业工具软件的整合。
1.2.2 不可否认签名方案
不可否认数字签名,首先由Chaum 和Antwerpen 提出[4]。它是介于零知识证明和自验证数字签名之间的一种需交互认证的签名方式.这是一种特殊的数字签名,它要求签名的验证必须得到签名者的合作,否则验证者无法知道签名的真伪性,这在某种程度上保护了签名者的利益。同时,对于一个签名者所签署的消息,签名者只要参与了该签名的验证,就无法否认、抵赖他确实签署过该消息。实际上,它兼顾签名者和接收者的利益,即既确保签名不被接收者滥用,又能够以后使签名让其他人相信.
自不可否认签名被提出后,许多研究者对这一特殊数字签名方法进行了研究。Chaum 提出了具有广泛用途的零知识不可否认签名方案[5]。Harn 和Yang将不可否认签名和群体签名结合起来,提出了(t,n) 门限不可否认签名的概念[6],并给出了两个具体方案(对应于t = 1和t = n )。但Langford指出,(n,n) 门限不可否认签名方案实际上只具有(2,n) 的安全性,即两个成员即可产生签名。因为在Harn 和Yang 的这一方案中,两个相邻成员可以产生对任意消息的签名。随后,Lin 等提出了一个新的(t,n) 门限不可否认门限签名[7]。之后,零知识不可否认签名方案得到了扩展,一个带有信任中心的(t,n) 门限不可否认签名方案被提出。Gennaro 等人在提出了第一个RSA 型不可否认签名方案[8],且该方案是可转化的。基于Gennaro 等人的这一方案,第一个门限RSA 不可否认签名方案被提出来。Desmedt 和Yung指出了对不可否认签名的几个攻击,但利用可转化的不可否认签名及指定验证者的不可否认签名可以克服这些缺点。
就是在这样的不断改进和完善的过程当中,有更多的不可否认签名方案应运而生。如:两方间收方不可否认的数字签名方案、基于双线性对的不可否认签名方案、基于身份认证的不可否认签名方案、使用双线性对构造基于身份的不可否认签名方案、不需要可信任方的门限不可否认签名方案、基于椭圆曲线的可转移不可否认签名方案、代理不可否认签名方案等等。这些方案都具有各自的特点并且存在一些缺点,但这并不阻碍不可否认签名方案的进一步研究和发展,也正是因为它们具有不足之处,才推动了这个领域地不断向前。
1.3 设计的目的和意义
网络文档发放与认证管理系统,既包含了文档发放登记管理的常规功能,又应用不可否认签名算法,在通信的过程中可以实现保证发方不否认发出,收方不否认收到。
该系统的开发,能有效地解决在一些文档的发放过程中存在的问题,使收发双方不能否认已发送或已接收文档,也保证发送方能够知道接收方是否已经收到文档。此外,在网络交易上,该系统能做到保证双方的诚信:既避免了发送方发送后的否认,也避免了接收方收到后的抵赖行为。
第二章 系统开发所用的技术准备
2.1数据库
2.1.1 数据库的概念
数据库[9]是依照某种数据模型组织起来并存放二级存储器中的数据集合。这种数据集合具有如下特点:尽可能不重复,以最优方式为某个特定组织的多种应用服务,其数据结构独立于使用它的应用程序,对数据的增、删、改和检索由统一软件进行管理和控制。从发展的历史看,数据库是数据管理的高级阶段,它是由文件管理系统发展起来的。
2.1.2 数据库的基本结构
1.物理数据层。它是数据库的最内层,是物理存贮设备上实际存储的数据的集合。这些数据是原始数据,是用户加工的对象,由内部模式描述的指令操作处理的位串、字符和字组成。
2.概念数据层。它是数据库的中间一层,是数据库的整体逻辑表示。指出了每个数据的逻辑定义及数据间的逻辑联系,是存贮记录的集合。它所涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。
3.逻辑数据层。它是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。
2.1.3 数据库的特点
数据库不同层次之间的联系是通过映射进行转换的。数据库具有以下主要特点:
1.实现数据共享。数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。
2.减少数据的冗余度。同文件系统相比,由于数据库实现了数据共享,从而避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的一致性。
3.数据的独立性。数据的独立性包括数据库中数据库的逻辑结构和应用程序相互独立,也包括数据物理结构的变化不影响数据的逻辑结构。
4.数据实现集中控制。文件管理方式中,数据处于一种分散的状态,不同的用户或同一用户在不同处理中其文件之间毫无关系。利用数据库可对数据进行集中控制和管理,并通过数据模型表示各种数据的组织以及数据间的联系。
5.数据一致性和可维护性,以确保数据的安全性和可靠性。主要包括:
(1) 安全性控制:以防止数据丢失、错误更新和越权使用;
(2) 完整性控制:保证数据的正确性、有效性和相容性;
(3) 并发控制:使在同一时间周期内,允许对数据实现多路存取,又能防止用户之间的不正常交互作用;
(4) 故障的发现和恢复:由数据库管理系统提供一套方法,可及时发现故障和修复故障,从而防止数据被破坏。
2.1.4 数据库的应用
数据库可以代替手工自动并高效率的完成管理的工作,不需人工干预。
数据库的常用用途包括如下方面:
(1)记录长期统计数据和产品趋势
(2)自动化处理以减少纸张浪费
(3)管理不同类型的个人或业务事务
(4)维护历史记录信息
在这个系统当中,要实现文档登记管理的常规功能,应用数据库是最好的选择。
2.1.5 数据库的设计
数据库设计(Database Design) [10]是指根据用户的需求,在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程。
一般,数据库的设计过程大致可分为5个步骤:
(1)需求分析:调查和分析用户的业务活动和数据的使用情况,弄清所用数据的种类、范围、数量以及它们在业务活动中交流的情况,确定用户对数据库系统的使用要求和各种约束条件等,形成用户需求规约。
(2)概念设计:对用户要求描述的现实世界(可能是一个工厂、一个商场或者一个学校等),通过对其中住处的分类、聚集和概括,建立抽象的概念数据模型。这个概念模型应反映现实世界各部门的信息结构、信息流动情况、信息间的互相制约关系以及各部门对信息储存、查询和加工的要求等。所建立的模型应避开数据库在计算机上的具体实现细节,用一种抽象的形式表示出来。以扩充的实体——联系模型方法为例,第一步先明确现实世界各部门所含的各种实体及其属性、实体间的联系以及对信息的制约条件等,从而给出各部门内所用信息的局部描述(在数据库中称为用户的局部视图)。第二步再将前面得到的多个用户的局部视图集成为一个全局视图,即用户要描述的现实世界的概念数据模型。
(3)逻辑设计:主要工作是将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式。与此同时,可能还需为各种数据处理应用领域产生相应的逻辑子模式。这一步设计的结果就是所谓“逻辑数据库”。
(4)物理设计:根据特定数据库管理系统所提供的多种存储结构和存取方法等依赖于具体计算机结构的各项物理设计措施,对具体的应用任务选定最合适的物理存储结构(包括文件类型、索引结构和数据的存放次序与位逻辑等)、存取方法和存取路径等。这一步设计的结果就是所谓“物理数据库”。
(5)验证设计:在上述设计的基础上,收集数据并具体建立一个数据库,运行一些典型的应用任务来验证数据库设计的正确性和合理性。一般,一个大型数据库的设计过程往往需要经过多次循环反复。当设计的某步发现问题时,可能就需要返回到前面去进行修改。因此,在做上述数据库设计时就应考虑到今后修改设计的可能性和方便性。
2.1.6 数据库的类型及选取
目前常用的数据库有SQL,MySQL,ORCAL,DEPHI和 ACCESS等。
SQL,MySQL,应用较为广泛;ORCAL,则比较适合于公司应用;DEPHI,本身并不是数据库,但却是一个做数据库的系统,是相当实用的软件;ACCESS,一般不用语言,而且是面向普通用户的,即应用起来比较方便简单。
在这个系统的开发过程中,我选择的是SQL Server 2000 数据库。我认为这个数据库比较符合题目的要求,尽管它不如ACCESS操作起来简单,但是它的功能相对强大得多。
2.2 WINSOCK通信
2.2.1 WINSOCK的基本概念
WINSOCK [11]是Windows Sockets的缩写。Sockets在中文是插座的意思,它的设计者实际上是暗指电话插座。因为在Sockets环境下编程很像是模拟打电话,Internet的IP地址就是电话号码,要打电话,需要电话插座,在程序中就是向系统申请一个Sockets,以后两台机器上的程序“交谈”都是通过这个Sockets来进行的。对程序员来说,也可以把Sockets看成一个文件指针,只要向指针所指的文件读写数据,就可以实现双向通信。利用Sockets通信,有两种主要方式。第一种是面向连接的流方式。顾名思义,在这种方式下,两个通信的应用程序之间先要建立一种连接链路,其过程好像打电话。一台计算机(电话)要想和另一台计算机(电话)进行数据传输(通话),必须首先获得一条链路,只有确定了这条链路之后,数据(通话)才能被正确接收和发送。这方式对应的是TCP协议。第二种叫做无连接的数据报文方式,这时两台计算机像是把数据放在一个信封里,通过网络传给对方,信在传送的过程中有可能会残缺不全,而且后发出的信也有可能会先收到,它对应的UDP协议。流方式的特点是通信可靠,对数据由校验和重发的机制,通常用来做数据文件的传输如FTP、Telnet等;数据报文方式由于取消了重发校验机制,能够到达较高的通信速率,可以用于对数据可靠性要求不高的通信,如实时语音、图像传送和广播消息等。
2.2.2 WINSOCK的工作原理
WINSOCK是一个DLL,它运行于Windows 3.x,Windows for Workgroups,Windows NT和Windows 95下。WINSOCK.DLL是与TCP/IP的接口,通过这个接口和网络进行连接。图2.1显示它的工作原理[12]:
2.2.3 WINSOCK的编程特点
在网络通信中,由于网络拥挤或一次发送的数据量过大等原因,经常会发生交换的数据在短时间内不能传完,收发数据的函数因此不能返回的现象,这种现象叫做阻塞。WINSOCK对有可能阻塞的函数提供了两种处理方式——阻塞和非阻塞方式。在阻塞方式下,收发数据的函数在被调用后一直要传送完毕或者出错才能返回;在阻塞期间,除了等待网络操作的完成不能进行任何操作。对于非阻塞方式,函数被调用后立即返回;当网络操作传送完成后,由WINSOCK给应用程序发送一个消息,通知操作完成,此时可以根据发送的消息传出的参数判断操作是否正常。
在编程时,应尽量使用非阻塞方式。因为在阻塞方式下,用户可能会因为较长时间的等待而是失去耐心继而关闭应用程序的主窗口,这样网络操作的函数从WINSOCK的动态连接库中返回时,主程序已经从内存中删除,可能会造成内存的异常。虽然现在的操作系统已经可以从系统级正确地处理这种内存问题,但还是要注意这种情况的发生。
2.3 不可否认的数字签名
2.3.1 不可否认签名的原理
不可否认签名方案通常由三个部分组成:
(1)签名算法合法的用户P可以使用该算法对任何消息进行签名;而其它用户无法冒充P进行签名,除非用户P的签名私钥已被攻破。
(2)确认协议签名者P和验证者V通过执行该协议,使验证者确信某一签名确实是P签署的。确认协议必须具备完备性和合理性。即,只要P和V都是诚实的(即按照协议的规定操作),则P签署的签名总是通过确认,从而被V接收;而不是P签署的签名,无论P怎样进行欺骗,要使该签名通过确认协议而被V接受,P的成功率是可以忽略的。
(3)否认协议通过执行该协议,证明者P向验证者V证明某签名不是自己签署的。否认协议也必须具备完备性和合理性。对于不是P所签署的签名,只要P和V都诚实,则该签名一定通过否认协议,从而使得V相信该签名确实不是P签署的;
而对于P签署的签名,无论P怎样进行欺骗,P能使该签名通过否认协议的成功率是可以忽略的。也就是说,对于一个P所签署的签名,通过执行否认协议,P几乎不可能使V相信该签名不是他签署的。
2.3.2 不可否认签名的安全性
不可否认签名主要考虑以下两条安全性:
(1) 签名的不可伪造性: 即使产生了多项式个有效签名后,伪造一个新的有效签名或破获私钥是困难的。
(2) 签名的非相关性: P验证、否认了多项式个签名后,V也不能自行判断某一未被P证实的签名究竟是否为P的签名。
第三章 系统分析及设计
3.1 系统分析
3.1.1 系统功能
1.常规功能
网络文档发放与认证管理系统首先应该具有一般文档管理系统的功能。应该分为两个部分:即发放文档和接收文档部分。
发放文档部分的主要功能应有:
(1) 发布文档:进行文档的发布
(2) 查询文档:选择不同的查询方式,并通过关键字来进行文档的查询
(3) 修改文档:对已经发布的某个文档的某些内容进行修改
(4) 删除文档:删除某个已经发布文档
为了让使用者方便操作,还可以添加一项功能:查看所有文档。这个功能可以显示所有的文档,帮助使用者全局的了解到有哪些已经发放的文档,做到一目了然。
接收文档部分的功能主要就是查询文档,查询成功后,便可通过通信过程来获得发放者发放的文档。
2.认证和不可否认功能
此外,在该系统中,还必须实现文档的认证和不可否认功能。认证和文档的不可否认性其实应该是一体化的,即通过不可否认签名来实现对文档的认证。用某种不可否认的签名算法可以做到发送方在发送文档时附带上自己的签名,以此向接收方证明该文档确实是他发放的;而接收方也是通过这种不可否认的签名算法来验证该文档是否来自发送方,此外,他在验证过程中返回给接受方的信息也使得他不能否认已经接收到了文档。这就很好地保证了任意一方都无法抵赖。
3.1.2 选用的编程技术
1. Visual C++语言简介
在该系统的开发过程中,选用由Microsoft公司开发的Visual C++程序设计语言[13]。该语言不仅能够编写传统的DOS操作系统下的应用程序,更主要的是它可以编写Windows操作系统下的各种应用程序。并且它提供了一组各种各样的为适应几乎每一种编程风格而设计的工具。这使得该语言具有功能强大、代码简洁、可移植性强等特点。同时Visual C++语言改变了传统的字符界面的编程手段,利用可视化的编程方法使得先前枯燥、单调的计算机编程语言变得更加生动和赏心悦目。
此外,Visual C++还提供了多种多样的数据库访问技术——ODBC API、MFC ODBC、DAO、OLEDB、ADO等。Visual C++开发和其他开发工具相比的优势有以下几个方面:
(1)简单性:首先,Visual C++提供的MFC类具有强大的功能,会达到事半功倍的效果;一些开发向导会简化应用程序的开发;另外MFC ODBC数据库接口已经将一些底层的操作都封装在类中,用户可以方便地使用这些接口,而无需编写操作数据库底层代码。
(2)访问速度快: Visual C++为了解决利用ODBC开发的数据库应用程序访问数据库速度快慢的问题,提供了新的访问技术,即OLE DB和它的高层接口ADO,它们是基于COM接口的技术,因此使用这种技术可以直接对数据库的驱动程序进行访问,从而提高访问速度。
(3)数据源友好:传统的ODBC技术只能访问关系数据库,而在Visual C++中,通过OLE DB访问技术不仅可以访问关系数据库,还可以访问非关系型数据库。
2.ODBC介绍
在该系统中,选择ODBC来开发数据库。
ODBC(Open Database Connectivity,开放数据库互连) [14]是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。
一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。
一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。
一个完整的ODBC由下列几个部件组成:
(1)应用程序(Application)。
(2)ODBC管理器(Administrator)。该程序位于Windows 95控制面板(Control Panel)的32位ODBC内,其主要任务是管理安装的ODBC驱动程序和管理数据源。
(3)驱动程序管理器(Driver Manager)。驱动程序管理器包含在ODBC32.DLL中,对用户是透明的。其任务是管理ODBC驱动程序,是ODBC中最重要的部件。
(4)ODBC API。
(5)ODBC 驱动程序。是一些DLL,提供了ODBC和数据库之间的接口。
(6)数据源。数据源包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽象。
3.SQL介绍
SQL全称是“结构化查询语言(Structured Query Language)”,是数据库中使用的标准数据查询语言,它是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的SQL语言作为数据输入与管理的接口。它以记录集合作为操纵对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语言可以嵌套,这使他具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的一个单独事件只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。 其实SQL语言使用起来比较简单,但是它的功能是非常强大的,这足以使用户可以完成各种数据库操作的任务。
SQL语言包含4个部分: 数据查询语言(SELECT语句) ;数据操纵语言(INSERT, UPDATE, DELETE语句); 数据定义语言(如CREATE, DROP等语句); 数据控制语言(如COMMIT, ROLLBACK等语句)。
3.2 系统设计
3.2.1 总体设计
系统可分为服务器端和客户端两大部分,分别对应的是文档的发送方和接收方。服务器端应该具备发送管理文件的基本功能,客户端则应该具有基本的查询功能。两者间文件的传送通过WINSOCK通信来实现。此外,还有认证和不可否认签名分别包含在两大部分里,这也同样通过WINSOCK通信来实现。
系统文档发放与接收主要过程描述如下:首先发送者可以通过服务器端先发布一些新的文档,并且能通过服务器端对已经发布的文档进行一系列的管理操作:包括查询、修改、删除等;而接收者在客户端连接上服务器后可以查询自己所需文档,查询到后,发送者则将所需的文档连同签名一起,通过WINSOCK通信发给客户端的接收者。然后接收者通过不可否认签名算法对发过来的文档进行验证,验证成立后即完成了一个文档的发放。
3.2.2 分块设计及模块图
如图3.1的网络文档发放与认证管理系统模块图所示,服务器端两个功能块,即一般功能和不可否认签名功能。一般功能又分为服务器设定、文档操作和帮助三项。其中服务器的设定是用来退出服务器的,而文档操作就分为:查询文档、查看所有文档、发布新文档和修改/删除文档,帮助项则包含了系统版本信息等。不可否认签名功能块即是对文章签名。
客户端和服务器端的功能大体相同。但在实现这些功能之前必须先连接服务器,客户端是通过WINSOCK通信与服务器端相连接的;而它的一般功能中的操作功能也相对减少,只有对文档的查询功能。其它相同部分就不一一赘述了。
图3.1 网络文档发放与认证管理系统模块图
第四章 界面的设计与实现
4.1 服务器界面设计
4.1.1 菜单设计
建立一个对话框,添加四个菜单项:服务器设定、文档操作、数字签名、帮助。“服务器设定”项用来退出服务器;“文档操作”向包括:查询文档、修改/删除文档、发布新文档和查看所有文档;“数字签名”项用来设置参数,对文档进行签名后再发送;“帮助”项则是介绍系统版本信息。实现后服务器的菜单界面及各项具备的功能如图4.1所示:
图4.1 服务器菜单界面
“数字签名”选项实现后的界面如图4.2所示:
图4.2 服务器“数字签名”界面
“帮助”选项中是该系统的版本信息,做好后的界面如图4.3所示:
图4.3 服务器“帮助”界面
4.1.2 “发布新文档”功能的设计
1.整体框架的设计
先建立一个对话框,在对话框中添加文档的各项信息,并添加相应的编辑框。在各编辑框中输入相应内容后的“发布新文档”的界面如图4.4所示:
图4.4 “发布新文档”的界面
2.“确定”键的实现
首先,要判断所有编辑框中输入的内容不为空,若有编辑框为空,则提示出错,系统会告诉使用者“请输入相应的数据”;接下来从建好的数据表中查询相关信息,若文档的编号已经存在,则系统提示“已经存在该文档,请重新输入文档编号”,然后把已经输入的内容相应地存到数据表中,并关闭已经打开的函数。一些关键语句如下:
if(myfindset_id.GetRecordCount()!=0)
{
AfxMessageBox(“已经存在该文档,请重新输入文档编号!”);
if(myfindset_id.IsOpen())
{
myfindset_id.Close();
}
return;
3.设定时间格式
在这里,还要对输入的时间格式进行规定,规定时间的格式为:2007/05/12。输入的时间格式若不正确,系统也会提示出错。
CTime t;
static char year[5],month[3],day[3];
char str[20];
strcpy(str,(LPCTSTR)m_m_issuetime);
memcpy(year,str,4);
memcpy(month,str+5,2);
memcpy(day,str+8,2);
CTime r(atol(year),atol(month),atol(day),0,0,0);
t.operator = (r);
4.1.3 “查询文档”功能的设计
1.整体框架的设计
先建立一个对话框,在对话框中以下拉框的方式设置四种查询方式:保密等级、类型、发布时间、图书编号,并且都对应相应的关键字进行查询。选择“保密等级”,以“公开”关键字进行查询后“查询文档”的界面如图4.5所示:
图4.5 “查询文档”的界面
2.查询方式下拉框的实现
用CComboBox控件显示四种查询方式:用AddString() 添加这些字符串,然后用SelectString()选中字符串。
CComboBox *pCombo=(CComboBox *)GetDlgItem(IDC_FindStyle);
pCombo->ResetContent();
pCombo->AddString(“图书编号”);
pCombo->AddString(“类型”);
pCombo->AddString(“保密等级”);
pCombo->AddString(“发布时间”);
pCombo->SelectString(-1,m_findstyle_value);
接下来就是将选中的查询方式添加到框中,并关闭下拉框。
m_ctrl_findstyle.ResetContent();
m_ctrl_findstyle.AddString(m_findstyle_value);
m_ctrl_findstyle.SelectString(-1,m_findstyle_value);
3.“查询”键的实现
在进行查询前,把原来打开的文档先关上,清空原来有的内容并刷新显示。选中任一种查询方式并输入关键字后,都要相应在数据表中逐个往下查询,直到找到一次相关的文档为止。若查询方式错误,系统则提示“对不起,无该种查询方式”。 代码略。
4.显示功能的实现
查询完毕后,即要把查询到的内容显示出来。首先,要从一开始的第一条记录开始显示,并且依次移动到下一条记录,直到最后一条记录止。
if(!myfindset.IsBOF())//如果不在开头,就移动到开始
{
myfindset.MoveFirst();
}
while(!myfindset.IsEOF())//如果不是结尾,就移动到下一条记录
{ }//然后显示所有项的更新
最后显示更新:UpdateData(false);
4.1.4 “修改/删除文档”功能的设计
1.整体框架的设计
先建立一个对话框,在上半部分用同上的显示功能把所有的文档显示出来;下半部分左边显示选中要修改或删除的文档,右边则以下拉框的方式设置与文档内容有关的十四种修改方式:保密等级、类型、发布时间、发布单位等,并添加一个编辑框输入修改后的内容。删除功能添加一个删除键对选中的文档进行删除即可。各功能都完成后“修改/删除文档”的界面如图4.6所示:
图4.6 “修改/删除文档”的界面
2.双击选中文档功能的实现
先定义一个指针,指向修改文档的这个列表,然后调用它的GetFirstSelectedItemPosition()函数,来得到项目索引,然后将得到的值传递给变量m_index,若值为-1,则返回。
CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_ChangeList);
POSITION pos = pListCtrl->GetFirstSelectedItemPosition();
int m_nIndex = pListCtrl->GetNextSelectedItem(pos); // 得到项目索引
if(m_nIndex==-1)
{
return;
}
然后便将选中的文档信息各项显示在左下方,用UpdateData(false);显示更新。
3.“修改”键的实现
首先,要判断修改方式是否为空,若为空,则返回;接下来则根据选择修改打开一个表,从界面获取变量m_isbn(文档编号),然后打开该表,打开失败则返回失败提示
CString sqlStr1;
sqlStr1=”SELECT * FROM documentinfo WHERE documentisbn=’”; sqlStr1+=m_isbn;
sqlStr1+=”‘”;
if(!myset.Open(AFX_DB_USE_DEFAULT_TYPE,sqlStr1))
{
AfxMessageBox(“documentinfo表打开失败!”);
}
之后便调用myset.Edit();函数来输入要修改的内容。以选中“类型”修改方式为例进行讲述,其它方式的实现相同。先将新输入的内容附给类型变量,然后更新,并把打开的文件关闭;还要通过把值赋给变量m_isbn(文档编号)来显示修改后的新内容。
if(m_xiugaifangshi==”类型”)
{
myset.m_type=m_new;
myset.Update();
myset.Requery();
if(myset.IsOpen())
{
myset.Close();
}
m_isbn=m_new; //显示更新
m_new=”"; //空附值为空
DisplayRecord();//列表中更新
UpdateData(false);//显示更新
}
4.“删除”键的实现
首先,要选中要删除的文档,接下来同修改功能中根据选择打开一个表,之后便用mydeleteset.Delete();函数来实现删除,删除了文档后还要更新列表中的内容,即将列表中的所有项都附为空值,最后用UpdateData(false);显示更新即可。代码略。
4.2 客户端界面设计
4.2.1 菜单设计
建立一个对话框,添加三个菜单项:客户端设定、操作、帮助,并添加上系统自动显示时间的功能。实现后客户端的界面如图4.7所示:
图4.7 客户端界面
4.2.2 各功能的实现
“客户端的设定”项实现了退出客户端;“操作”项即是对所需的文档进行查询,查询功能的具体实现跟服务器端相同,在此就不赘述,“帮助”项也是系统的版本信息,做好后的界面如图4.8所示:
图4.8 客户端“帮助”界面
在客户端界面左边,时间显示的下方是本机器IP地址和客户端编号, 点击“连接服务器”按钮后系统会出现如图4.9的对话框提示连接成功:
图4.9 连接成功提示界面
该键通过以下语句来实现与服务器的连接:
if(m_client.InitAndConnect(this->m_hWnd,m_serverport,m_serverip)==FALSE)
return;
return;
在界面的右上方可根据关键字来查询所需文档,与“操作”项中查询的功能一致,下拉框及“查询”键等的实现与服务器端相同,在此也不一一赘述。
第五章 数据库的设计与实现
5.1 数据库设计
5.1.1 数据库概念结构设计
在这个系统中,需要设计的实体只有文档实体。文档实体中应包括以下的数据项:文档编号、类型、保密等级、文档标题、主送、主题词一、主题词二、主题词三、主题词四、发布时间、发布单位、拟稿人、校对、签发和内容简述等。
图5.1为文档实体E-R图:
图5.1 文档实体E-R图
5.1.2 数据库逻辑结构设计
在以上实体的关系的基础上,形成数据库中的表格。
创建文档信息表documentinfo:
表5.1 文档信息表documentinfo
列名 数据类型 可否为空 说明
documentisbn varchar(100) not null unique 文档编号(主键)
type varchar(50) not null 类型
keylevel varchar(50) not null 保密等级
documentname varchar(200) not null 文档标题
sendto varchar(50) not null 主送
keywordsone varchar(50) not null 主题词一
keywordstwo varchar(50) not null 主题词二
keywordsthr varchar(50) not null 主题词三
keywordsfou varchar(50) not null 主题词四
issuetime datetime not null 发布时间
issuedepart varchar(50) not null 发布单位
writer varchar(50) not null 拟稿人
proofreadman varchar(50) not null 校对
drawon varchar(50) not null 签发
detail varchar(200) not null 内容简述
5.2 数据库结构的实现
在概念结构设计的基础上得到数据库逻辑结构以后,就可以在数据库系统中实现该逻辑结构。在SQL Server 2000 数据库系统中创建documentinfo表格之前要先创建一个数据库,具体SQL语句如下:
create database document;
use document;
create table documentinfo(
documentisbn varchar(100) not null unique,
type varchar(50) not null,
keylevel varchar(50) not null,
documentname varchar(200) not null,
sendto varchar(50) not null,
keywordsone varchar(50) ,
keywordstwo varchar(50) ,
keywordsthr varchar(50) ,
keywordsfou varchar(50) ,
issuetime datetime not null,
issuedepart varchar(50) not null,
writer varchar(50) not null,
proofreadman varchar(50) not null,
drawon varchar(50) not null,
detail varchar(200) not null
)
insert into documentinfo
values(
‘200704010001′,’财务制度’,'公开’,'关于2007年员工出差报销的财务制度’,'全体员工’,'2007年’,'出差’,'报销’,'财务制度’,'07/04/01′,’财务部’,'任晓平’,'郑丹婵’,'郑丹婵’,'报销时间每周四之前,报销延期不超过10天’
)
insert into documentinfo
values(
‘200703010001′,’任免制度’,'公开’,'关于2007年销售部经理的任免通知’,'全体员工’,'2007年’,'任免’,'销售部经理’,'人事制度’,'07/03/01′,’人事部’,'李鸿’,'郑丹丹’,'王炳’,'郑丹婵出任市场部经理,原经理李志调湖南子公司’
)
insert into documentinfo
values(
‘200703080001′,’公司公告’,'公开’,'关于三八妇女节休息的通知’,'全体女员工’,'2007年’,'妇女节’,'休息’,'放假’,'07/03/08′,’办公室’,'郑丹丹’,'郑丹丹’,'任晓平’,'三八妇女节全体女员工放假,去湖南省工人文化宫活动’
)
insert into documentinfo
values(
‘200612030004′,’公司公告’,'公开’,'关于2007年年初招收员工的通知’,'全体员工’,'2006年’,'招新’,'招收员工’,'人事制度’,'06/12/03′,’人事部’,'李鸿’,'郑丹丹’,'王炳’,'2007年要招收一批新员工,请大家互相转告’
)
insert into documentinfo
values(
‘200611030024′,’公司公告’,'公开’,'关于2006年年底任务完成情况’,'全体员工’,'2006年’,'任务’,'超额完成’,'销售计划’,'06/11/03′,’销售部’,'王生’,'李浩’,'尹浩’,'2006任务计划超额完成,公司发奖金,请各位员工登记’
)
insert into documentinfo
values(
‘200703160042′,’公司公告’,'公开’,'关于2007年度销售计划的通知’,'全体员工’,'2007年’,'销售计划’,'市场营销’,'销售部’,'07/03/16′,’销售部’,'周鸿’,'李强’,'王昆’,'2007销售计划已经出台,请各位员工努力’
)
如此,数据库便创建完毕。
5.3 配置ODBC
在数据库建立完成后,便进行数据源的配置。具体步骤如下:
(1)从控制面板中双击“管理工具”图标,然后在新出现的窗口中双击“数据源(ODBC)”。在弹出的对话框中选择不同的选项卡来确定建立数据源的类型,在这里选择“系统DSN”项 。
(2)单击右上侧的“添加”按钮,从弹出的对话框中选择SQL Server作为数据源的驱动程序。
(3)点击“完成”按钮后,在新弹出的对话框里输入数据源的名称“rsp”,并且在“服务器”项的下拉框中选择自己已经建好的服务器。
(4)单击“下一步”按钮,选择已经建好的“document”数据库,并点击下一步。
(5)在新对话框里点击“完成”进行“数据源的测试” ,最后点击“确定”按钮,所选择的数据源就进入了ODBC数据源管理器,这时便可以看到了新添加的名称为“rsp”的数据源。
第六章 WINSOCK通信的设计与实现
6.1客户机/服务器模式
6.1.1通信的基本原理
该模式的建立基于以下两点:
(1)非对等作用;
(2)通信完全是异步的。
客户机/服务器模式在操作过程中采取的是主动请示方式:
首先服务器方要先启动,并根据请示提供相应服务:(过程如下)
(1)打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求;
(2)等待客户请求到达该端口;
(3)接收到重复服务请求,处理该请求并发送应答信号;
(4)返回第二步,等待另一客户请求;
(5)关闭服务器。
客户方:
(1)打开一通信通道,并连接到服务器所在主机的特定端口;
(2)向服务器发送服务请求报文,等待并接收应答;继续提出请求……;
(3)请求结束后关闭通信通道并终止。
6.1.2通信过程
在通信开始前,服务器方先用socket()创建一个新的套接字,然后用Bind()将套接字地址与所创建的套接字号联系起来,绑定成功以后就用Listen()开始一个监听过程,等待客户方的连接。客户方开始时同样也要创建一个新的套接字。两方接下来调用connect()(服务器方)和accept()(客户方)来共同完成连接工作。两者间数据的发送和接收则由send()与recv()来实现,任意一方都可以发送或接收数据,即是双向的。待数据传输结束后,两方都要调用Closesocket()来关闭套接字。以上的全部过程便是客户机/服务器模式的一个完整的通信过程。
服务器方和客户方相互通信的具体实现过程如图6.1所示。
图6.1面向连接的套接字系统调用时序图
6.2 WINSOCK通信的具体实现
6.2.1服务器端WINSOCK通信
服务器端新建一个CServer类,CServer类中最重要的一个初始化并进行监听的函数是InitAndListen(HWND hwnd,UINT port)。它主要的功能是:如果当前有一个套结字,就将其关闭,然后重新创建一个新的流式套结字。接下来对本地地址m_addr进行设置,主要是地址族类型的选定以及端口号的设置。
将本机地址和之前创建好的一个套结字进行绑定bind(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr)),绑定成功以后就开始一个监听过程,等待客户的连接,listen(m_hSocket,5),其中的5代表最多连接5个客户。
服务器的主界面程序MainFrame,在初始化的过程中,就调用了上述的建立套结字和绑定过程。我们只需调用CServer相关的函数即可。另外,Winsock在使用之前,必须先进行初始化。如下面程序所示:
WSADATA wsaData;
WORD version = MAKEWORD(2,0);
int ret = WSAStartup(version,&wsaData);
if(ret!=0)
{
TRACE(“初始化失败”);
AfxMessageBox(“初始化失败”);
}
只有初始化成功之后,才能开始建立套结字和绑定过程。
6.2.2客户端WINSOCK通信
客户端与服务器端过程类似,只需服务器端开启监听,客户端就可以进行连接了。考虑到有多个客户端向服务器发起连接,我们在客户端都写了获取本机器IP地址的代码,方便将来的识别。
程序初始化时,便可获得本机器IP地址和客户端编号,如图6.2所示:
图6.2 客户端图
测试过程中,服务器和客户端都在一台机器上,所以界面当中的服务器地址是127.0.0.1,端口号默认为4000。
客户端也是需要先初始化winsock,然后建立套结字,然后和本地地址绑定。接下来的过程便是主动连接服务器,该过程将等待一定时间。connect(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr)),这里会产生的网络错误就是:服务器没有打开并工作在同样的端口,我们有个监听错误的函数GetLastError(),便于分析错误原因。
6.2.3 服务器端和客户端如何处理消息
上面两节讲述了服务器端和客户端创建winsock的过程,但是对方发送过来的消息如何判断是何种消息,并作出相关的响应,就需要各自建立处理消息的函数:OnClientMessage(WPARAM wParam,LPARAM lParam)和OnServerMessage(WPARAM wParam,LPARAM lParam)。两端都有FD_ACCEPT,FD_READ,FD_WRITE,FD_CLOSE四种消息类型,分别是建立连接、读、写、关闭连接。switch(lParam)过程,对不同的消息做不同的处理。
另外winsock要获取主对话框的句柄,以响应事件,如下两句函数比不可少:
afx_msg LRESULT OnServerMessage(WPARAM wParam,LPARAM lParam);
afx_msg LRESULT OnClientMessage(WPARAM wParam, LPARAM lParam);
在之后的不可否认加密算法的实现过程中,多次用到winsock通信,涉及到一些消息绑定和参数判定的过程,都是在OnClientMessage或OnServerMessage中实现的,不在本节中做过多的讨论。
第七章 不可否认签名的设计与实现
7.1 不可否认签名的方案
7.1.1 方案描述
根据课题要求,可选择以下不可否认签名方案来实现。
不可否认签名协议[15]:
发送方A公开一个大素数p和一个本原元g,它们由一组签名者用。A有一个私人秘钥x和一个公开秘钥
y=gx mod p (7.1)
对消息签名时,A计算
z=mx mod p (7.2)
并发给接受方B。
B的验证步骤如下:
(1) B选择两个小于p的随机数a和b,并计算
c=zayb mod p (7.3)
将c发给A;
(2) A计算
t=x-1mod(p-1) (7.4)
d=ct mod p (7.5)
并将d发给B;
(3) B进一步确认:
d=magb (mod p) (7.6)
如此式成立,B就认为签名是真的。
7.1.2 WINSOCK通信过程
发送方A与接收方B之间应总共有四次Winsock通信过程,具体过程如下图
p=2e+1、g、y=gx mod p
A B
(将m变成字的形式w1 、w2 、w3) z1= w1x mod p(w1 < p)、z2= w2x mod p…
(B选择两个随机数a、b) c1=z1ayb mod p、c2=z2ayb mod p…
d1=c1t mod p 、d2=c2t mod p …
图7.1 不可否认签名的Winsock通信过程
对一些参数的描述:大素数p可设定为2e+1;m表示要发送的信息,一开始发送方A先将m变成一个个16位的字的形式w1 、w2 、w3 …,计算z1 、z2 、z3 …发送给接收方B;B验证时即相对应计算c1 、c2 、c3 …发给A,A最后根据c1 、c2 、c3 …的值计算d1 、d2 、d3 …发给B让其做最后验证。
在第二次通信时,第一种方法是A可以直接将m和签字一起发送过去;第二种方法是不发送m,而只发送计算后的z值,最后从
n=dg-bmodp (7.7)
A=a-1mod( p-1) (7.8)
m=nA mod (7.9)
将消息恢复,由m的语意有意义来判断签字的有效性。
图7.1表示的是第二种方法。若使用第一种方法将m和签字一起发送给B,B则可以在收到了文档后不进行下面的签名验证过程,也就不能保证B接收后的不可否认,A方也无法确知B方是否已经收到了文档。运用第二种方法可以避免B的该种行为,更适合本课题的要求。
7.2程序的设计和实现
先定义一大素数:m_p = pow(2,16)+1
定义一个本原元g ,本原元应满足的条件如下:
gi≠gj(modp) ,(i≠j) (7.10)
参数y计算可得:m_y=fmod(pow(m_g,m_x),m_p)
在开始发送文件之前,发一个大素数p=216+1、g、y=gx mod p给客户端,为了便于客户端winsock准确识别消息,我们在发送的消息之前分别加_p,_g,_y三个前缀。
下面以参数g为例说明服务器与客户端是如何工作的。
服务器端:
if(str_g!=”")
{
CString mess1; 构造发送的字符串
mess1=”"; 初值设为空串
mess1=”_g”; 加前缀_g
mess1+=str_g; 将之前计算好的参数g加到字符串后面
char ss[1024];
ZeroMemory(ss,1024);
lstrcpy(ss,mess1);//将mess1存入ss数组
Sleep(1000);
send(socket,ss,strlen(ss),0); 通过套结字发送该消息
}
客户端:
该过程在客户端的OnClientMessage函数中实现。首先是通过套结字接收到服务器发送过来的消息,存入buf数组中。接下来根据buf数组的前两个数值判断是哪种类型的消息。例如判断是_g,则可知是g参数,则取出结果,存入本地变量m_g,中。
len=recv(m_client.m_hSocket,s,1024,0); 套结字接收消息
s[len]=NULL;
mess+=s;
char buf[1024];
ZeroMemory(buf,1024);
lstrcpy(buf,mess);//将str存入buf数组
if(buf[0]==’_’ && buf[1] ==’g')
//判断是_g
{
int index;
char _g[20];
for(index=0;index
_g[index] = ‘\0′;
CString test;
test.Format(“%s”,_g);
str_g = test;
m_g = atoi(str_g);
}
服务器端将三个参数发送至客户端以后,将消息m变成字的形式,将z=mx mod p发送至客户端,过程和上面讲述的winsock通信原理相同,不再赘述。
客户端在Ontimer()函数中不断检查p,g,y三个参数是否已经接收到,接收到的话就计算参数c,并发给服务器端。
if(str_g!=”" && str_p!=”" & str_y!=”")
{
m_c=fmod((pow(m_z,m_a)*pow(m_y,m_b)),m_p);
CString mess1,str_c;
str_c.Format(“%f”,m_c);
mess1=”";
mess1=”_c”;
mess1+=str_c;
m_client.SendString(mess1);
}
m_client是客户段的CClientSocket类,其中的SendString(CString a)方法集成了发送socket消息的函数,隐藏了send()复杂的参数设置,方便调用。SendString的实现方法如下所示:
void CClientSocket::SendString(CString a)
{
if(send(m_hSocket,a.GetBuffer(0),a.GetLength(),0) == SOCKET_ERROR)
{
AfxMessageBox(“发送数据出错”);
}
}
第八章 总结及完善
8.1 系统总结
历时近三个月的设计和开发,网络文档发放与认证管理系统最终完成。本系统实现了对网络文档的发放、修改、删除、查询以及认证的功能,做到既具有一般的文档管理功能,又利用不可否认签名保证了双方在发放过程中不能抵赖。特别是该系统所具有的不可否认的特点,对网络文档的发放有一定意义。
本系统分为服务器端和客户端两部分,界面简单合理,操作方便,使用户能很好上手。系统通过数据库来实现对每个文档进行有条不紊的管理,通过WINSOCK实现收发文档,通过不可否认签名的协议实现了保证收发双方的不可否认性。正是这三者的有效结合和合理运用,使得系统的功能较为完善并且具有不可否认的特点,解决了网络文档在传输过程中可能存在的问题。
不可否认签名的应用正是本系统的一个特色之处。在设计中,采用的是最初的不可否认签名协议。该协议的特点是较简单,又能通过在通信过程中计算并传输参数,来保证收发双方的不可否认。
8.2系统完善
尽管已经实现的系统基本符合要求,也具备了相应的功能,但是这并不表示这个系统就是完美的,它也还存在一些不足之处,可进行如下的完善。
首先,在用户登录系统时,可以考虑加上一个登录界面,这样能对用户的登录权限加以限制。特别是作为服务器一方,不应允许任何人对其中的文档进行修改,只有在权限范围内的人才能拥有这样的权力。这就可以通过设置一个用户登录界面来对此进行控制。这对保护文档的安全性和完整性起到了很大的作用。这个登录界面应该包含该系统的名称,用户账号,用户密码等。其次,图片的搭配,色彩等也可做进一步调整,使服务器端和客户端更加协调美观。但也不能太花哨,必须符合一个管理系统所具备的简洁,明了,操作简单等特点。
在服务器端,已经具备了发布、查询、修改、删除等的基本功能。未来还可以在帮助选项中添加如何使用系统的简单介绍,使用户更易上手。此外,还可以添加上按各种不同的方式排序功能,更让使用者一目了然;把不同类型的文档归到不同的文件夹中,也便于管理和根据文件夹的类型进行查询;服务器端也可以像客户端一样添加上显示时间的功能等等。而客户端功能再加上一个如何使用系统的说明也就更好。
而对系统现在应用的不可否认签名方案是最早的方案,而现在各种适用于不同场合的具体方案已层出不穷。在将来,我们可以根据具体的环境不同而寻求一种更适合系统的不可否认的签名方案。
对系统的完善是一个长久的工作,在未来,我们应该跟上时代的步伐,在各方面进一步做出相应完善,力求使系统更具有时代特点,符合实际应用的需求。
参考文献
[1] Atul Kahate. 密码学与网络安全[M]. 北京:清华大学出版社,2005.126~129.
[2] Bruce Schneier. 应用密码学[M]. 北京:机械工业出版社,2000.384~386.
[3] WANG Gui-lin, QING Si-han. A Threshold Undeniable Signature Scheme Without a Trusted Party [J]. 软件学报,2002,13(09):1757~1764.
[4] D. Chaum, and H. van Antwerpen. Undeniable signatures[M]. In: CRYPTO’89, LNCS 435, pp. 212-216. Springer-Verlag, 1989.
[5] D. Chaum, E. van Heijst, and B. Ptzmann. Cryptographically strong undeniable signatures, unconditionally secure for the signer[M]. In: CRYPTO’91, LNCS 576, pp. 470–484. Springer-Verlag, 1992.
[6] L. Harn, and S. Yang. Group-oriented undeniable signature schemes without the assistance of a mutually trusted party[M]. In: Auscrypt’92, LNCS 718, pp. 133-142. Springer-Verlag, 1993.
[7] C.-H. Lin, C.-T. Wang, and C.-C. Chang. A group-oriented (t, n) undeniable signature scheme without trusted center[M]. In: Information Security and Privacy (ACISP’96), LNCS 1172, pp. 266-274. Springer-Verlag, 1996.
[8] R. Gennaro, H. Krawczyk,and T. Rabin. RSA-based undeniable signatures[M]. In: CRYPTO’97, LNCS 1294, pp. 132–149. Springer-Verlag, 1997. Also in Journal of Cryptology, 2000, 13: 397–416.
[9] Ryan k.Stephens, and Ronald R.Plew. 数据库设计[M]. 北京:机械工业出版社,2001.1~69
[10] 李闽溟. Visual C++ 6.0 数据库开发实例导航[M]. 北京:人民邮电出版社,2002.11~78.
[11] 黄超. Windows网络编程[M]. 北京:人民邮电出版社,2003.211~386.
[12] 闻怡洋. Winsock介绍. http://tech.china.com/netschool/01_61.html,2007-04-25.
[13] 李奇. Windows环境下Visual C++ MFC编程技术与实例[M]. 北京:机械工业出版社,2000.126~148.
[14] 丁展. Visual C++ 网络通信编程实用案例精选[M]. 北京:人们邮电出版社,2004.156~173.
[15] 卢开澄. 计算机密码学(第二版)[M]. 北京:清华大学出版社,1998.221~222.







