Featured Post

图像加解密平台软件的设计实现

Read More

毕业论文(设计)题目 图像加解密平台软件的设计实现 题目类型 软件开发 题目来源 生产实际题 毕业论文(设计)时间从 2007年3月4日 至 2007年6月16日 1. 毕业论文(设计)内容要求: Internet技术的飞速发展,为信息的网上发布和传播提供了便利条件。如何确保基于网络的图像/视频信息的安全,是当前信息处理技术领域的亟待解决的难点和热点研究问题之一。本课题针对该问题,设计并实现一个实用的可进行图像加密和解密的工具软件,具体任务如下: ...

一种基于AES的序列密码保密通信软件

Posted by 天际的荒草 | Posted in Docs | 文档 | Posted on 19-09-2009

标签:, , , , ,

0

摘要 III
ABSTRACT IV
第一章 绪论 1
1.1课题研究的相关背景和现实意义 1
1.1.1密码学研究的现实意义 1
1.1.2信息加密的目的 2
1.1.3课题研究的现实意义 3
1.2国内外密码学研究的现状 3
1.2.1序列密码发展现状 3
1.2.2分组密码的发展现状 4
1.3课题设计内容介绍 5
1.3.1AES算法构造密钥 5
1.3.2序列密码进行主体加解密 5
1.3.3通信软件实现信息传输 6
第二章 分组密码与AES密码算法原理 7
2.1分组密码 7
2.2先进加密算法——AES 8
第三章 序列密码的方案设计 15
3.1序列密码原理 15
3.1.1序列密码的一般原理 15
3.1.2序列密码安全性 16
3.2分组密码构造序列密码的原理 16
3.2.1准备知识 17
3.2.2加密算法 17
3.2.3算法安全性 18
3.3基于AES的序列密码的设计 18
3.3.1序列密码设计的基本原则 19
3.3.2密钥的设计 19
3.3.3总体设计 20
第四章 序列密码的软件实现 23
4.1加密部分的实现 23
4.1.1加密部分流程 23
4.1.2调用重要函数以及模块 24
4.2解密部分的实现 25
4.2.1解密部分流程 25
4.2.2调用重要函数及模块 26
4.3加密解密界面实现: 26
4.3.1加密界面实现 26
4.3.2解密界面实现 27
第五章 保密通信的实现 28
5.1WINSOCK编程介绍 28
5.1.1WINSOCK简介 28
5.1.2WINSOCK函数介绍 28
5.2实现通信的程序分析 29
5.2.1服务器端 29
5.2.2客户端 30
5.3保密通信界面的实现 31
5.3.1服务器端 31
5.3.2客户端 31
5.4程序演示界面 32
第六章 总结与展望 36
6.1总结 36
6.2课题展望 36
结束语 37
参考文献 38

摘要
基于AES的序列密码保护通信软件,涉及了AES(Advanced Encryption Standard,先进加密算法)密码算法和序列密码以及通信软件三部分。对称密码体制分为序列密码和分组密码两类,序列密码以密钥控制密钥流发生器,产生一随机序列,用这个随机序列和明文信息逐位异或,就得到密文,其加密单元为比特。AES是一种分组加密算法,分组长度位128位,密钥长度为128bits、192bits、256bits三种,分别称为AES-128、AES-192、AES-256。通信软件支持消息的即时发送,传输和接收。分别设置服务器端和客户端,信息在服务器端和客户端都可以进行输入,并在相对端进行接收。发送前在本地进行加密,之后以密文的形式在信道内传输,接收端接收后,进行解密并显示。
本毕业设计基于VB的工作环境,分别设置了发送端和接收端的应用界面,在相应的操作下进行加密解密工作,利用WINSOCK进行通信。由于采用了AES密码算法进行加密形成一个随机的密钥,然后利用此密钥和明文进行序列加密,所以,很大程度的提高了密文的保密程度。

关键字: 序列密码,AES密码,分组密码,WINSOCK,通信,密钥

ABSTRACT
The communication software protected by the stream cIPher, which is based on the AES, involves three sections. Such as AES, stream cIPher and communication. Modern cIPher has two cIPher systems, symmetric algorithm and public-key algorithm. The symmetric algorithm is a traditional algorithm, it is easy and efficient, and so it is still being popular used. The stream cIPher and the block cIPher are two part of the symmetric algorithm. The symmetric algorithm uses the key to control the key stream generator, and then the generator produces a random stream. We can get the cIPher by xor the message and the random stream by bit. In the field of communication and code, the stream cIPher has always been the key cIPher of the military affairs and foreign affairs. Alone with the development of electron, computer and modern communication, the stream cIPher is an ideal scheme as “one encrypt on time”, which has a quality of a strong secrecy. In 2000, Rijndael was selected from 5 candidates and was named as AES. The AES is a kind of block cIPher, which has blocks as 128 bits and three kinds of keys. The keys have three kinds of length, 128bits, 192bits and 256bits. The AES will be widely used in the field of Internet, E-commerce and Digital Signature. Communication software can send and receive messages immediately. The software has a server and a client. The message is encrypted on the server and is decrypted on the client. The communication software is designed by The Visual Basic 6.0, which uses the WINSOCK to solve the communication problem. The AES produces stream keys, and the stream cIPher uses these keys to encrypt the message. The server and the client are designed separately. And this communication software has a very strong secrecy.

KEY WORDS stream cIPher, the AES, block cIPher, WINSOCK, keys

第一章 绪论
1.1课题研究的相关背景和现实意义
1.1.1密码学研究的现实意义
几千年前,密码技术己经用于保护军事和外交通讯。在信息时代的今天,随着集成电路、计算机和通信技术的飞速发展以及网络技术的广泛应用,基于公共通信设施和计算机网络的个人通信、多媒体通信、电子邮件、电子自动转账系统和自动零售业务网得以蓬勃发展,信息的安全和保护问题显得愈发重要。因此,当今社会密码学的应用范围更加广泛,己不再局限于政治、军事和外交领域,其触角亦深入到商业领域和社会领域。
密码学是研究密码系统或通信安全的一门学科。通过采用密码技术对信息进行编码可以隐蔽和保护需要保密的信息,使未授权者在这些信息存储或传输时不能识别、增添、删除、修改或伪造,从而实现消息的保密性、完整性和可认证性。
一个完整的密码系统可由一个五元组 来描述。M是所有可能明文消息的有限集合,称之为明文空间;C是所有可能密文消息的有限集合,称之为密文空间;K是所有可能密钥的有限集合,称之为密钥空间; 和 分别是与密钥空间中的任意一个加密密钥 和相应解密密钥 对应的加密和解密规则。E和D之间具有以下关系:设m是明文空间中的任意一个明文,则 。密码系统的数学模型如图1.1所示。

图1.1 密码系统模型

图1.1中,发送端的明文m是要发送的原始消息,密文c是明文m经加密密钥 决定的加密规则E,变换后在公共信道上传输时的形式,在接收端密文c在解密密钥 决定的解密规则D,变换下恢复成原始的明文m【1】。
自从密码学从外交情报和军事领域走向公开后,越来越多的研究人员投入到了对各种密码的研究和开发上来,密码学在第二次世界大战后得到了迅速的发展,如今已经发展成为一门单独的,具有多个分支的学科,包括协议处理,加解密算法等等方面。随着经济,政治的全球化,信息也毫无疑问的加入了全球化的进程。现如今,信息传播的手段多种多样,各种的传播都不可能避免一个问题,那就是信息的安全。所谓信息的安全,就是指信息的完整和不可盗用性。
随着计算机网络的不断发展,网络无疑成为了信息传输最有力的工具,但由于计算机网络具有连接形式多样性、终端分布不均匀性和网络的开放性、互连性等特征,致使网络易受黑客、恶意软件和其他不良企图的攻击,所以网上信息的安全和保密是一个至关重要的问题。对于军用的自动化指挥网络和银行等传输敏感数据的计算机网络系统而言,其网上信息的安全和保密尤为重要。因此,上述的网络必须有足够强的安全措施,否则该网络将是无用的,甚至会危及国家安全。密码技术则是网络安全最有效的技术之一。一个加密的网络,不但可以防止非授权用户的搭线窃听和入网,而且也是对付恶意软件的最有效方法之一。
1.1.2信息加密的目的
信息加密的目的是保护网内的数据、文件、口令和控制信息,保护网上传输的数据。网络加密常用的方法有链路加密、结点加密和端到端加密三种。链路加密的目的是保护网络结点之间的链路信息安全;结点加密还要对结点内的数据提供保护;端到端加密的目的是对源端用户到目的端用户的数据提供保护。数据加密作为一项基本技术是所有通信安全的基石。数据加密过程是由形形色色的加密算法来具体实施的,它以很小的代价提供很大的安全保护。在多数情况下,数据加密是保证信息机密性的唯一方法。
在图1.1中,密码分析者可以通过包括搭线窃听、声音窃听和电磁窃听在内的各种方法来获得密文,然后通过分析可能从截获的密文中推断出原始的明文或密钥。密码分析者对密码系统的攻击类型按照攻击时己具备的前提条件分为下述四类:
(1)唯密文攻击:密码分析者已经截获一个或多个密文。
(2)己知明文攻击:密文分析者不但截获了一些密文,而且拥有与这些密文相对应的明文。
(3)选择明文攻击:密码分析者可以选择一些明文,并得到与之对应的密文。
(4)选择密文攻击:密码分析者可以选择一些密文,并得到与之对应的明文。
上述四种攻击的目的是获得密码系统所使用的密钥,这四种攻击类型的攻击强度按上述次序依次递增。
通常一个密码系统的安全性是指在Kerckhof假设下的安全性,即密码系统的安全性不依赖于密码系统的加密体制或算法的保密,仅与密码系统所采用的密钥有关。一个具有健壮的抗密码分析的密码系统应当满足下述基本要求【2】:
(1)系统即使不能达到理论上不可破解,也应当是实际上不可破解的。即对于上述的四种攻击方法,要确定密钥或任意明文在计算上是不可行的。
(2)系统的保密性仅仅依赖于对密钥的保密,其加密体制或算法是公开的。
(3)系统既易于实现又便于使用。
1.1.3课题研究的现实意义
课题所研究的项目为:基于AES的序列密码保密通信通信软件。作为分组密码与序列密码两种密码体制来说,二者各有优点和缺点。分组密码汇聚了强安全性、高性能、高效率、易用和灵活等优点,但是也不是完全不可以破解的,只要密码分析员得知了算法并且捕获一定的明文,就有可能推算出密钥,进而分析出整个明文。
作为序列密码,是一种较早的数据加密方法,其优点是加密简单高效,最早的序列密码是利用一个乱码本,进行一次一密的和明文异或,分析者无法得知每一次从乱码本中取出的密钥,也就无法破译,缺点则是发送端和接受端都要有乱码本,而且乱码本一旦被窃取,则密文有可能被破解。本课题的基本思想就是,利用AES加密算法为序列密码产生一次一密的密钥流,使得加密变成密钥,明文两次加密,这样,无疑大大增加了加密的复杂性和灵活性,使得密码分析者在破解过程中的困难大大增加,最大程度上提高了数据传输的安全性。对于国家机要部门,信息安全性的要求很高,那么,单独的一种加密体制就不能满足这种要求,将两种或更多种的加密体制进行混合,就可以大大提高数据加密的可靠性。对于日益增长的民用通信软件,如何更好的保护用户的通信隐私权也是需要很好解决的问题,那么,这种多种密码结合的混合密码体制,就能够很好的为各种民用通信软件提供安全保障。
1.2国内外密码学研究的现状
1.2.1序列密码发展现状
序列密码虽然主要用于政府、军方等国家要害部门,而且用于这些部门的,理论和技术都是保密的,但由于一些数学工具 (比如代数、数论、概率等)可用于研究序列密码,其理论和技术相对而言比较成熟。从20 世纪 80年代中期到 90年代初,序列密码的研究非常热,特别是在序列密码的设计方法、序列密码的安全性度量指标、序列密码的分析方法、用于设计序列密码的各种组件(如密码布尔函数的构造与分析、非线性资源的生成和分析)等方面取得了一大批有理论和应用价值的成果。
在序列密码的设计方法方面,人们将设计序列密码的方法归纳为 4种,即系统论方法、复杂性理论方法、信息论方法和随机化方法:将同步流密码的密钥流生成器分解成驱动部分和非线性组合部分,这样做不仅结构简单,而且便于从理论上分析这类生成器;提出了非线性组合生成器、非线性滤波生成器和钟控生成器等多种具体设计方法。
在序列密码的安全性度量指标方面,人们提出了线性复杂度轮廓、跃复杂度、k-错误复杂度 (球复杂度)、球周期、非线性复杂度等多种度量序列随机性和稳定性的指标,并对指标进行了深入研究。
在序列密码的分析方法方面,提出了分别征服攻击方法、线性攻击方法、线性伴随式攻击方法、线性一致性攻击方法、快速相关攻击方法、线性时序逻辑逼近方法、熵漏分析方法等多种有效的分析方法。在密码布尔函数的构造与分析方面,提出了构造布尔函数的多种设计准则,如相关免疫性、线性结构、严格雪崩特性、扩散特性、平衡性、非线性、差分均匀性等,构造了一大批满足上述若干准则的布尔函数,同时,对这些准则之间的关系也进行了深入研究。
在非线性资源的生成和分析方面,对环上序列的生成和结构进行了深入研究和刻画,诱导出的二元序列具有良好的密码学特性。在研究方法方面,将谱技术、概率统计方法、纠错编码技术、有限域理论等有效地用于序列密码的研究。另外,虽然没有制定序列密码标准,但在一些系统中广泛使用了序列密码比如 RC4,用于存储加密。事实上,欧洲的NESSIE 计划中已经包括了序列密码标准的制定,这一举措将导致序列密码研究热 。
1.2.2分组密码的发展现状
NIST(National Institute of Standard and Technology,美国标准技术研究机构)于1997年1月开始了遴选DES(Date Encryption Standard,数据加密标准)替代者——高级加密标准(AES)的工作。其目的是为了确定一个非保密的、全球免费使用的分组密码算法,用于保护下一世纪政府的敏感信息,并希望成为秘密和公开部门的数据加密标准。1997年9月12日,NIST在联邦登记处公布了征集AES候选算法的通告。
对候选者提出以下基本要求: (a)比TrIPle2DES 快,且至少和TrIPle2DES一样安全;(b)应当具有128 比特分组长度和128/ 192/ 256 比特密钥长度;(c)具有较大的灵活性。
1998年8月20日,NIST 召开了第一次候选大会并公布了12个国家的15个候选算法。
1999 年3月22日,NIST召开了第二次AES候选会议,从中选出5个候选法:MARS(IBM)、RC6 (MIT)、Serpent (英、以、美)、Twofish(美)和Rijndael(比利时)。
2000 年10月2日,NIST 宣布比利时的密码学家Joan daemen 和Vincent Rijmen 设计“Rijndael 算法”最终获胜。Rijndael 之所为能当选AES,主要是因为:运算速度快。在无论有无反馈模式的计算环境下的软硬件中,Rijndael 都表现出非常好的性能。对内存的需求非常低,使它很适合用于受限制的环境。算法可靠,使用非线性结构的S2盒,表现出有足够的安全余地【3】。
Rijndael 算法的设计策略是宽轨迹策略(Wide Trail Strategy),这种策略能有效抵抗差分分析和线性分析攻击。Rijndael 是一个分组迭代密码,被设计成128/192/256比特三种密钥长度,可用于加密长度为128/192/256 比特的分组,相应的轮数为10/12/14,分组长度和密钥长度设计灵活。密钥安装的时间很好,也具有很高的灵活性。AES算法在所有的平台上都表现良好,其操作比较容易抵御对物理层实现的某些攻击,能很好地适应现代及将来处理器的发展,有支持并行处理的能力。因此,无论是从安全还是实现的难易度上考虑,AES采用Rijndeal作为其加密算法应该是最明智的选择。
随着破译方法、硬件技术的发展,导致AES出现。技术和方法总是不停向前推进,因此,密码算法、应用及标准化工作也应不断地发展。目前,美国已确定了21世纪高级加密算法AES,以代替过时的DES。欧盟各国投资33亿欧元,计划在3年时间内建立自己的分组密码、序列密码、公钥密码等算法标准。我国也应高度重视密码算法的标准化问题,增大密码研究经费投入的力度,以利于加快密码关键技术及其产品的研究与开发,为赢得高技术条件下的竞争提供信息安全保障。
1.3课题设计内容介绍
课题“基于AES的序列密码保密通信软件”,主要设计三方面的内容:AES加密算法、序列密码算法和通信软件。
1.3.1AES算法构造密钥
由上文可知,AES是一种分组密码体制,通过对明文进行长度相等的分组,并对每个分组进行加解密。具体是通过按位异或、密钥变换、复杂的行变换和列变换等方式,并对这一系列变换进行多轮的循环对明文进行加密解密。本课题中,AES所起的作用是为序列密码提供一个随即密钥流序列,流序列的提供需要在初始状态下设置一个初始 供AES进行加密,加密后形成 ,与明文进行序列密码加密后生成密文 ,之后返回AES进行加密成 , 再与后来的明文进行序列加密,依次类推,不断输出一个密钥序列 、 、 …… 。
1.3.2序列密码进行主体加解密
在现实中,分组密码更加通用,而序列密码更多用于数学分析,每次只能对一个数据位进行加解密的序列密码并不适用于软件实现,因为密钥流序列的生成需要一个随机或伪随即序列生成器,软件实现比较困难,而分组密码算法就可以很容易的用软件实现。本课题研究的关键就是利用AES构造随机的序列,替代通常序列密码中的随机序列发生器。
序列密码的实现有很多方法,其基本内涵都是将明文的每一位与随机序列发生器产生的随机序列的每一位进行逻辑运算,鉴于AES的算法比较复杂,在本课题中,我选择序列密码的算法比较简单,就是将明文的每一位与随机序列发生器产生的随机序列的每一位进行异或运算,然后得到密文,实际上,就是将明文的每一位与AES产生的 的每一位进行异或运算,得到密文。解密方面,仍然由AES通过初始值与不断的循环产生随机密钥流,由于 , 设明文为 ,密钥为 ,密文为 ,则由上式可得:在加密端 ,而在解密端 ,即可回复明文。
1.3.3通信软件实现信息传输
本课题最终要实现通信,就要设计一款通信软件。目前用于通信的软件很多,而且基本都已比较完善,利用各种语言实现通信得方式也都已知,那么,挑选一个合适得实现环境,对软件的实现很有帮助。在参阅了很多专业书籍之后,我选定了Visual Basic 6.0进行设计。VB中,我可以使用WINSOCK控件,方便快捷得实现软件通信。
具体思路如下:分别设置服务器端与客户端,这里之所以要分别服务器端与客户端,是基于WINSOCK中要获取对方机器IP,为了简化这个过程,在两个端上设置相同的端口,在客户端上获取IP值(即服务器端IP),客户端连接服务器端后,既可以进行信息的发送和接收。为了实现通信软件通信的真正目的,我在两个端上都设置了发送和接收端,考虑到信息的安全性,发送过程中,采用密文发送,那么,在发送信息前,就存在一个加密的过程,我选择设置加密命令按钮,输入明文后,点击加密,即输出密文,密文传输,在接收端,接收到密文,然后设置解密命令按钮,点击解密按钮,还原成为明文。值得注意的是,利用WINSOCK实现通信功能,要注意,在服务器端和客户端都要添加WINSOCK控件,并且,设置相应的端口号,而且,在客户端的连接上,要设置服务器端的IP,这样,就需要提前获取服务器端的IP,才能够实现信息的传送和接收。

第二章 分组密码与AES密码算法原理
本课题要求设计一种基于AES的序列密码,就必须要对分组密码的原理加以研究,并研究如何用分组密码实现序列密码。
2.1分组密码
美国早在1977年就制定了自己的数据加密标准:DES。随着DES的出现,人们对分组密码展开了深入的研究和讨论。出现了各种各样的分组密码。用抽象的观点来看,分组密码就是一种满足下列条件的映射 对每个 , 是从 到 的一个置换。可见,设计分组密码的问题在于找到一种算法,能在密钥控制下从一个足够大且足够“好”的置换子集合中,简单而迅速地选出一个置换。一个好的分组密码应该是既难破译又容易实现,即加密函数 和解密函数 都必须容易计算,但是至少要从方程 或 中求出密钥 应该是一个困难问题。
令 表示含 个“字母”或“字符”的明文字母表,例如,可以是普通的英文字母 ,也可以是数字、空格标点符号或任何可以表示明文消息的符号。因此可以将 抽象地表示为一个整数集 。在加密时通常将明文消息划分成长为 的消息单元,称为明文组,以 表示,如 。 也称作 报文,它是定义在 上的随机变量, = 。L=1为单字母报, L=2为双字母报, L=3为三字母报。明文空间 。
令 表示含 个“字母”或“字符”的密文字母表,抽象地可用整数集 来表示。密文单元或组为 。 是定义在 上的随机变量。密文空间 。
一般地,明文和密文由同一字母表构成,即 。
加密变换是从明文空间到密文空间的映射。加密变换通常是在密钥控制下变化的,因此,一般记为:

为密钥空间。
假定 是一个单射,对固定的 ,令 ,因此对给定的密文组 ,有且仅有一个对应的明文组,也就是说,对于此函数 ,存在逆映射 ,使
即 为解密变换。
一个密码系统就是在 作用下由 到 的映射,在这种意义上,称此种密码为代换密码。 时,称作单字母代换,也称作流密码。 时,称作多字母代换,也称作分组密码。对于二元域,记 为二元域 上的 维向量, 是明文组和密文组以比特形式出现的长度,称为分组长度。从分组密码的发展现状来看,目前分组密码的观念是 , , ,则映射 可构造成一对一的映射用于加密变换,则逆映射 可构造成一对一的逆映射用于解密变换。
正是这一观念,飞速发展的计算机技术使得DES仅仅21年就走过了它的历史的辉煌。因为对于 , 或 可构造成一对一的映射或逆映射充其量只不过是 。可以预言,如果抱着这个观念不放,AES的寿命也不会太长,因为它仅仅是加大了一倍的 。面对人类的进步、计算技术的高速发展,我们必须创立新的加密思路,使得破密难度远远大于 。
在分组密码设计技术发展的同时,分组密码分析技术也得到了空前的发展。已有很多分组密码分析技术,如强力攻击(包括穷尽密钥搜索攻击、字典攻击、查表攻击、时间—存储权衡攻击)、差分密码分析、差分密码分析的推广(包括截段差分密码分析、高阶差分密码分析、不可能差分密码分析)、线性密码分析、线性密码分析的推广(包括多重线性密码分析、非线性密码分析、划分密码分析)、差分—线性密码分析、插值攻击、密钥相关攻击、能量分析、错误攻击、定时攻击等等。
2.2先进加密算法——AES
2000年,FIPS发布了一种新的数据加密标准AES(Advanced Encryption Standard),它也是一种分组加密算法,加密分组为128位,密钥长度可以为128bits、192bits、256bits三种,在未来它将广泛的用于Internet、电子商务及数字签名等领域中保护数据的机密性。
Rijndael算法采用Square结构,将明文分成 个块,密钥分成 个块,每个块32 bit。令N=max{ , }+6,则算法共进行一个初始轮和N轮变换。记首轮变换为 ,末轮变换为 ,中间各轮为 , …, ,则:
AES = …
初始轮变换仅由密钥加构成。末轮变换由S-box变换,行移位,密钥加构成。其他各轮变换由4种变换复合而成:S-box变换,行移位,列混合,密钥加【4】。
记轮密钥为 的密钥加变换为 或 、列混合矩阵为M的列混合运算为 、移位向量为C=( , , , )的行右移位操作为 、放射变换参数为 , 的S-box变换为 ,则AES加密过程可分解为:
AES = …
运算的中间结果称为态,每个态是一个4× 阶字节矩阵T=( )4× ,即: 为GF( )中元素,则:
(1) = ( + )
(2) =( )+ mod +1) , 这里的表示法指 中元的多项式表示法;
(3)

(4)
其中, 表示 在 中的逆,矩阵乘法MT中的加、乘为 中运算, = 。
可见: , 是字节并行运算, 是字(列)运算, 是字(行)运算。AES解密过程为:

显而易见,S-box变换仅对一个字节运算,右移运算不改变字节的值,所以,它们的运算顺数是可以改变的,于是得:
,那么,自然有:

又:
所以 ,

于是,解密过程可写成:

又: , , , ,
其中: 指模 逆元和负元。
所以:

可见,解密算法与加密算法结构完全相同。所不同的是解密时:
①轮密钥的使用顺序与加密过程相反,且除第一个和最后一个轮密钥外,其余轮密钥需要进行逆混合列变换。即:如果加密轮密钥为: ,那么,解密轮密钥为: ;
②相应的S-box中仿射变换为原仿射变换的逆变换;
③右移位向量的分量为原右移位向量分量模 的加法逆:

④混合变换中的变换矩阵为原矩阵的逆矩阵:

密钥生成器:
设密钥块为 ,其中, 是一个字,即4个字节。通过生成器,产生 轮轮密钥,每个轮密钥由 个字组成,共有 个字 。算法下图所示。其中, 是轮常数,其每个分量都视为 中元。
SubByt是S-box在4字节上的运用。RotByt是字节右移1位操作,即:对 , 。
AES加密分组为128位,密钥长度可以为128bits、192bits,256bits三种,分别称为AES-128、AES-192、AES-256,加密过程循环的次数根据密钥长度的不同而不同。下面给出有关的几个定义【5】:
(1)Word:32bits为一个word,128bits的数据序列可以表示成4个word。
(2) :数据列数(每一列有32bits即一个word), 为4。
(3) :密钥的word数,密钥为128bits、192bits、56bits时, 分别为4、6、8。
(4)分组(block):是输入、输出、循环密钥的二进制序列。分组的长度就是序列
的bit数,AES中为128bits。
(5)多项式表示方法和矩阵表示方法。在AES中基本处理单元为一个字节,128bits可以分为16个字节,用 表示每个字节。每个字节又可表示成多项式的形式例如 多项式表示为
(6)伽罗华域乘法(用•表示)
AES定义乘法是在伽罗华域 上的,不可约多项式为:M(x)= + + +x+1例如: 的多项式为( + + +x+1), 的多项式为( +x+1),
那么: ( + + +x+1)( +x+1)= + + + + + + + +x+1+ + + +1= + + + + + + + + +1( + + + + + + + + +1)mod( + + +x+1)= + +1
所以:
AES的加密与解密框图下图所示。

图2.1 AES的加密与解密框图
(1)加密变换
设X是AES的128比特明文输入,Y是128比特的密文输出,则AES密文Y可以用下面的复合变换表示:
Y= R S C R S … C R S
其中“•”表示复合运算。这里 :表示对X的一个变换 ( 为第i轮的子密钥,为比特串的异或运算)。S:S盒置换。即对每一个字节用S-Box做一个置
换。S-Box是一个给定的转换表。R:行置换。C:列置换。
(2)解密变换
解密变换是加密变换的逆变换,这里不再详述
AES的加密过程可以用伪代码表示如下:
CIPhet(byte in[4, ], byte out[a, ], word w[ , ])
Begin
Byte state[4, ]
State = in /*输入值赋给State变量*/
Addroundkey(state,w) /*输入值与密钥逐位异或*/
For round= 1 step 1 to /*循环 次*/
SubBytes(state)
ShiftRows(state)
MixColumns(state)
AddRoundKey(state,w+rouud* )
End for
SubBytes(state) /*第 次循环,不做MixColumns操作*/
ShiftRows(state)
AddRouadKey(state, )
Out=state /*输出结果*/
End
下面具体分析一下每个函数:
(1) Addroundkey():密钥key序列与输入序列按位进行异或操作。
(2) SubBybes():S-盒操作是一个非线性的字节替代变换,输入为8bits,输出仍为8bits,例如,输入字节为{01010011}转换为十六进制表示为{53},行为5,列为3,查S盒得输出为{ed},即输出为{11101101}。十六个字节逐一变换,得到128bits的输出。
(3) ShiftRows():行循环变换矩阵的第0行不做变换,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。在行变换中,中间状态矩阵State的第一行不变;第二至第四行做如下变换,即将表1的状态矩阵变为表2的状态矩阵。

图2.2 行变换
(4)MixColumns():列变换
整个加密过程循环 次,需要128bits的密钥 个。AES算法利用外部输入密钥K(密钥串的字数为 ),通过密钥扩展程序得到共4 字的扩展密钥 。涉及如下三个模块:
1.位置变换RotWord()。把一个四个字节的序列[ ]左移一个字节变为[ ]。
2.SubWord()。对一个四字节的输入字[ ]的每一个字节进行S盒变换,然后作为输出。
3.变换Rcon[]。Rcon[i]表示32比特字符串 。这里x=(02), 是x=(02)的(i-1)次幂的十六进制表示。例如,Rcon[1]=[01000000],Rcon[2]=[02000000 ], Rcon [ 3 ] = [ 04000000 ],Rcon [ 4 ] = [ 08000000 ],…,Rcon[10]=[36000000]。
4.扩展密钥的生成。扩展密钥的前 个字就是外部密钥 以后的字 等于它前一个字 与前第 个字 的异或,即 。但是若 为 的倍数,则 SubWord(RotWord( )) Rcon[ ]。
这里 为按位异或运算,其中的乘法×按照下面介绍的模乘同余规则进行计算。列变换中要用到的模乘同余规则和我们一般用到的乘法有些不同,由于每一个元素都是一个字节,于是可把这个字节看成一个形式上的七次多项式,即将 视为 + + + + + + + ,如{11011001} ={d 9} 可以被看成是 。列变换希望把一个字节变换为一个新的字节,所以需要把两个形式上的七次多项式的乘法结果变为一个新的形式上的七次多项式,然后才能将其恢复为一个字节的长度。这里采用模一个八次不可约多项式的同余乘法,即将两个七次多项式的乘法结果除以这个八次不可约多项式再取其余式。在AES中这个八次不可约多项式为m(x)= 。
在完成了AES分组加密算法实现的基础上,现在利用密文分组链接(CBC)方式将其用于对文件的加密/解密(密钥长度可选),程序的操作步骤如下:
(1)根据文件处理方式选择模块,选择对文件加密、对文件解密或是退出程序。
(2)输入密钥K的长度(128比特、192比特、256比特) 和密钥。
(3)用密钥扩展程序对密钥加以扩展。128比特、192比特、256比特密钥分别对应KeyExpansion128(key),KeyExpansion192(key), KeyExpansion256(key),分别生成72bytes,204bytes,236bytes的扩展密钥。
(4)创建加密/解密文件。文件都是以文本格式存储的。
(5)从等待加密/解密文件中取出16字节。若是未取出16个字节文件就结束,则在结束处标上文件结束符。把取出的数据放入中间变量(STATE)中。
(6)根据密钥的长度对STATE中的数据进行加密/解密。128比特、192比特、256比特分别对应CIPher128(InvCIPher128), CIPher192 (InvCIPher192), CIPher256 (In-vCIPher256)。并把加密/解密后的数据保存在STATE中。把STATE中的数据写入加密/解密文件中。
(7)如果等待加密/解密的文件已经结束,则关闭文件,回到操作(1);否则回到操作(5)。
这样程序就实现了对一个文件的加密/解密操作【6】。

第三章 序列密码的方案设计
数据加密技术是实现网络安全的基础,是网络中最基本的安全技术,主要通过对网络中传输的信息进行数据加密来保障其安全性。这是一种主动安全防御策略,花很小的代价即可为信息提供相当大的安全保护。“一次一密”密码在理论上是不可破译的这一事实使人们感觉到,如果能以某种方式仿效“一次一密”密码,则将可以得到保密性很高的密码,长期以来,人们试图以序列密码方式仿效“一次一密”密码,从而促进了序列密码的研究和发展。日前,序列密码是世界军事、外交等领域应用的主流密码体制。
3.1序列密码原理
3.1.1序列密码的一般原理
现实中的各种消息(报文、语音、图象和数据等)都可以经过量化编码等技术转化为二进制数字序列,因此我们假设序列密码中的明文空间、密文空间和密钥空间均是由二进制数字序列组成的集合。在序列密码系统中,由于明文序列与密钥序列逐位加密,密钥序列一定要具有与明文序列相当的长度。但这样的密钥序列难于分配和管理,实际上的密钥序列都是由密钥空间中较短的密钥经过某些算法生成的。
一个实际的序列密码系统可用 的六元组来描述。M为明文空间,C为密文空间,K为密钥空间。每一个密钥 ,由算法Z确定一个二进制密钥序列 。 和 分别表示密钥 在算法Z作用下生成的密钥序列与明文的加密和解密规则,常用的是模2加运算。当明文为 时,在密钥 下的加密过程为:
(1)由算法Z确定一个二进制密钥序列
(2)对 ,计算 , 密文为 ,其中 表示模2加;
(3)对密文 的解密过程为:对 ,计算 由此恢复明文 。因而序列密码系统可用下图表示

图3.1 序列密码原理图

由上述序列密码系统的工作原理可知,密钥序列 决定了序列密码系统的安全性,因此,序列密码系统设计的主要任务就是研究如何用一个较短的密钥生成一个长的安全的密钥序列。当 是离散无记忆的二进制均匀分布的信源产生的随机序列时,该系统就是一次一密钥密码,它是不可破的。但通常 是一个由 通过确定性算法产生的伪随机序列,此时,密码系统就不再是完全保密了。
3.1.2序列密码安全性
序列密码的安全性主要依赖于密钥序列A(k)=k k …,当k k …是离散无记忆性的二进制均匀分布的信源产生的随机序列时,则该系统就是一次一密密码,它是小可破的。但通常A (k)是一个由k通过确定性算法产生的伪随机序列,因而此时,该系统就不再是完全保密的。设计序列密码的关键是设密钥序列A (k), k K,而破译序列密码也只需求出所使用的密钥序列A (k),因此序列密码系统中的密钥序列的设计应考虑如下几个因素:
(1)系统的安全保密性;
(2)密钥易于分配、保管,更换简便;
(3)产生密钥序列简单、快速。
为了满足上面二个要求,到目前为止,密钥序列的产生大多数是基于移位寄存器,因为移位寄存器结构简单,运行速度快。
3.2分组密码构造序列密码的原理
现代密码学是建立在Shannon的密码系统上的。根据Shannon的密码理论,对于一个完全保密的系统,密钥的数不能少于要传送的明文的数。一个完全的保密系统,不论截获密文多少,对明文的信息量为零。
理论上,一次一密是不可破的,它要求密钥量至少和信息量一样大,若某一密码体制的密文数、密钥数和明文数都相等,则该密码体制是完全保密的。文中把流密码与分组密码结合起来建立一种新型的体制,使该体制既能利用易于产生的伪随机序列作为密钥,又能避免密码分析者从掌握的部分明、密文可得到相应的密钥。对于分组密码体制,每一种分组密码都有其特定的密钥长度,一旦选择了一种分组加密算法,加密者不能随意增加密钥长度。因此,传送者不能通过增加密钥长度的方式来提高安全性。为了提高分组密码的安全性,可将明文的每一分组使用不同的密钥加密,通过序列密码算法产生一伪随机序列,将此随机序列分组,作为每一组的加密密钥。
3.2.1准备知识
(1)分组密码对于相同的明文组,加密后的密文是相同的。
(2)扩散的分组密码在传输中,一个比特的错误会影响以后所有密文的解密。
(3)在分组密码中,密钥长度是特定的(64/128/192/256 bit),密钥长度不可以任意选取且分组长度影响加解密速度。
(4)序列密码由于密钥流与明文通过与或计算得到密文,这样已知明文即可得到密钥流,因此给攻击者破解算法留下漏洞。
3.2.2加密算法
用密钥 产生一密钥流序列,把明文和密钥流按一定长度进行分组,密钥流序列为 ,并分别用 作为每一分组密码的密钥进行分组加密。明文分组为 ,加密后的密文是 。其中的一段分别记为 ,则加密过程为 ,其中E是分组加密算法。对密码分析者来说,在得到充分长的密文条件下,即使拥有一定的明文和对应的密文,也难以求出密钥。在此混合加密方法中,分组密码体制可以选取加密速度较快的算法,为方便起见,以DES作为分组加密算法。

图3.2 密钥与明文相与

随机数对密码的研究有着十分重要的作用,序列密码的关键在于随机数的产生。伪随机数的产生有很多方法,如基于反馈移位寄存器的和基于离散对数算法的伪随机序列生成法。
为描述方便,分组密码体制以DES为例。选取密钥 和密钥种子 ( 且长度不大于64 bit), 是大于64 bit任一长度的数, 为 的平方剩余的任一元素, 和 保密。 为明文, 为密文, 为使用 和 通过平方剩余算法得到的密钥流 。
由于分组加密用的密钥与明文长度相同,因此安全性比单独的分组密码体制和序列密码体制都安全。更安全的加密是,每次随机产生 ,取 的第64位作为第一组分组加密DES用的密钥,对 进行加密得到的第0组的 ,与密文一起传输给接受者。接受者接到密文后,先用 的第64位作为DES解密的密钥对第一个分组 解密得到 ,通过上述算法解密。这样每次加密所使用的密钥流都是不同的,达到了使用固定密钥实现一次一密的目的,所以更加安全保密。只是密文的长度多64bit来传送密钥种子【7】。
3.2.3算法安全性
上述加密体制的安全性是综合分组密码体制和序列密码体制的安全性,比单独使用分组加密或序列密码加密都安全。假定密码分析者掌握该密码体制的全部知识,并得到充分多的密文及与密文对应的明文。由于明文与密文之间是以组为单位对应的。而每组加密的密钥是不同的,因此对于相同的明文分组,加密后的分组密文也不同。即使窃听者通过密码分析得到某个(或某些)分组密钥(如 ),也很难以此推算出整个密钥序列,即 ,因为该加密方法是建立在解平方剩余问题的基础上。上述随机数的产生是一个单向函数,即已知 和 ,求出 既容易且惟一;但反过来,在已知 ,通过计算求出 和 既困难又不惟一。
因此,在窃取者掌握了 的情况下,要想求出 ,则演变成求解平方剩余的问题。在复杂性理论中,求解平方剩余问题属于求解NP完全类问题,目前尚不存在有效算法。所以,这种加密算法是安全的,听者通过 是无法通过计算得到 的。若采用每次加密前先将密钥种子 经第一组加密和其它分组密文一起传送给接收者,则会更加安全,只是密文比明文增加一组分组长度(64 bit)。由于每次加密用的 不同,也无法预测下一加密使用的密钥流,这种方法达到使用固定密钥实现一次一密【8】。
3.3基于AES的序列密码的设计
序列密码设计的一般原则是采用多重密钥,多重环节,多重安全措施等技术,达到“一次一密”。要求在编制泄露而密钥保密时仍能保密,仍能抵抗目前己知的密码攻击,总体上达到序列密码最终靠密钥保密,即密码保密寄寓于密钥之中。一个密码算法,应该是一个科学的艺术品,密码编制设计中各种编制因素的协调和平衡,包括密钥编制与算法编制之间的协调平衡,算法内部各编制环节之间的协调平衡将是这个艺术品具体形象。
3.3.1序列密码设计的基本原则
在实践中,序列密码设计涉及的数学理论较多,但序列密码的设计最终还是靠密码设计者来完成。根据Rainer Rueppel的理论,有四种不同的方法来构造序列密码:
●系统理论方法。使用一套基本的设计原理和准则,保证每一个设计对密码分析者来说是一个困难且未知的问题。
●信息理论方法。使密码分析者不能得到明文,不论密码分析者做了多少工作,永远得不到唯一解。
●复杂性理论方法。使密码系统基于或等同于一些己知的难题,比如因子分解或解离散对数。
●随机性方法。通过迫使密码分析者检测大量无用的数据来产生一个难于控制的大难题。
系统理论方法的优点是设计出的序列密码可直接满足要求,因此目前几乎所有实用的序列密码的设计都是基于系统理论方法。
对基于LFSR的序列密码设计中,长周期序列自动生成、钟控逻辑的设计、非线性组合逻辑的设计和RAM表及参数的使用是最基本的四个方面。其中,长周期序列自动生成的设计是基础,可确保乱数序列具有足够大的周期,另外三种,或通过动作的不规则使得输出序列不再具有原来的线性关系,或通过对输出的线性序列作非线性的组合变换提高复杂度。一个密码体制的设计中,通常复合地采用其中的某几项技术,尤其是RAM表及参数的使用技术有可能可以迅速提高密码算法的整体强度。
序列密码设计最终要达到五个基本目的:长周期;大的线性复杂性,包括线性复杂性曲线和局部线性复杂性;统计特性如理想的k元分布:混乱与扩散,使每个输出比特位必定是所有密钥位的复杂变换,子结构中的冗余度必须扩大到大范围的统计特性中去:布尔函数的非线形准则,比如m阶相关免疫性、与线形函数的距离以及雪崩准则等。需要说明的是,一个乱数序列算法满足所有的设计技术或原理,有可能仍然被证明是不安全的。这是一个哲学问题,最完善的序列发生器(算法)本身就是不完善的。这也是从事密码研究人员要长期研究并不断创新的问题。
3.3.2密钥的设计
序列密码的密钥一般包括初始化密钥、结构化密钥、消息型密钥和系统型密钥等,多种密钥选定后,经过密钥编制(初始化过程)彻底混合形成真正使用的工作密钥。工作密钥应满足不可预测性和每次通讯更换的要求。现阶段有效工作密钥长度安全性下界一般不低于128比特。密钥应以物理的方法随机产生,并符合独立、等概的各种随机性检验,要确保其随机性和变化规模不退化,要经安全渠道预分配,密钥的更换要科学、存储要安全、使用要验证、要以非线性方式充分地扩散在加密过程中等。
得出加密过程为 ,解密过程为 ,加密解密图示如下:

之所以选择字符异或如此简单的序列密码加密方法,是由于在密钥的生成上,本设计使用了一种先进的分组加密算法——AES加密算法,无疑为密码算法的安全性增加了更大的保障。
3.3.3总体设计
将序列密码和AES密码进行混合,就是本设计所要研究的问题。总体设计思路如下:
(1)设置一个初始值,定义为 , 可以是任意的中英文字符,设置AES的加密密钥s,s用于AES的加解密。 通过AES用密钥s进行加密后,形成字符串 ,此 作为序列密码的第一个密钥,与明文进行异或运算,即 , 即为密文。 在通过AES用密钥s进行加密,形成字符串 , 作为序列密码密钥,与明文 进行异或加密,即 , 继续返回AES加密,如此反复,即为如下的过程:
, , , ,…, ,…, …,
(2)利用WINSOCK控件进行密文的传输,即 的传输。
(3)在接收端接收密文,进行解密,密钥的生成如加密端,但解密时,利用的算法为 , 即是最初的明文。这样,就完成了加密传输和解密。
值得注意的是,初始值的设定可以自由设定或提前设定,而AES加密算法的密钥也可以是这种方式,为了在程序设计方面达到设计的简化,我选择讲初始值 预先设定好,这样,在加密传输与解密时,发送和接收双方只要事先约定AES密钥就可以达到保密传输。
由于程序只需要AES进行密钥的生成,根据由 生成密钥流的原理,可以推得,要实现密钥流的生成,只需要使用AES的加密功能即可。AES的加密模块主要设计密钥,密钥空间,密钥长度等方面的内容,我们都知道,AES加密算法提供三种密钥的长度128bits、192bits和256bits,我们可以在这三种密钥长度中任选一种,选择是可以自己控制的,而字区空间,我们就要加以提前的设计,我在本设计中,将字区空间设置为128bits,以提供良好的保密性。
对于密钥的设定,我计划是设置一个可以输入的模块,有消息的发送方和接收方在消息发送前约定密钥,输入相应的密钥,AES开始工作,产生密钥流进行消息的加密和解密。对于 这个预先值,可以是固定,也可以是随时输入,但是考虑到程序在保证安全程度前提下的最大简化,我选择将 直接写如代码中,这样,只是使用AES的密钥来控制加密解密的可变性和安全性。这样做,为的是简化程序的流程。由于AES要多次运行以生成一个适用于序列密码加密解密的密钥流序列,所以,要多次进行AES的加密运算,这样,就要设计AES加密模块能够多次循环进行,并且在每次循环之后取得相对于AES来说为明文的新的 与设定密钥进行加密。
总体设计模块图如下:

在图3.5中,省略了部分内容,就是在 的生成上,需要提前设置一个初始值 ,AES需要运用这个 来加密后得到密钥流密钥 ,同样,在解密端,也要设置一个初始值 ,然后生成 ,然后循环继续。

第四章 序列密码的软件实现
在确定了基本的设计方案后,就要加以实现。在参阅了一些期刊和书籍之后,我决定使用VB6.0这款软件实现我的方案,由于我做的是一款实用的通信软件,那么,人性化、美观的界面就是必不可少的,恰好,VB在实现这一功能上有自己的优势。而且,AES这么复杂的算法,可以直接定义为类,在窗体中直接对类进行引用即可,那么,就可以避免在主程序中出现繁冗的分组加密算法。
4.1加密部分的实现
4.1.1加密部分流程
首先,定义变量。变量定义后,进行一系列的测试,测试包括:
1.在明文输入框中是否有明文输入,如没有,则警告,如有,则继续;
2.测试密钥的输入框中是否有文字输入,如没有,则警告,如有,则继续;
3.测试密钥是否符合规格,如果不符合,则警告,如符合,则继续。
在一系列的测试结束后,则进入加密的过程:
1.将明文输入框中的明文变换成为二进制;
2.将初始值 读入内存,调用AES加密函数,将 进行AES加密,输出加密后的字符 ,将加密后的字符变换为二进制;
3.将明文的输入转化为二进制;
4.将明文的二进制流序列与AES加密后的密钥 进行异或运算,得到密文的二进制;
5.将密文二进制变换为字符,再用AES加密,得到密钥 ,之后将 进行二进制的变换,与明文的二进制进行异或;
6.循环此过程,直到全部明文被加密。
在以上的过程中,比较关键的二进制的转化,因为在VB的环境中,不支持字符之间的二进制转化,所以,必须将字符转化为二进制,这是加密算法的关键,也是一个很容易被忽略的地方。在VB中,二进制的转化用的是StrConv(“字符”, vbFromUnicode)命令。
流程图如下:

4.1.2调用重要函数以及模块
StrConv(“字符”,vbFromUnicode):将字符转换为可以进行异或运算的二进制数据;
StrConv(“二进制数据”, vbUnicode):将二进制数据转换为字符;
Rijndael:AES加密算法,定义为类模块,使得整个工程可以调用;
Xor:二进制进行异或运算,返回值为二进制数据;
MsgBox“”:弹出消息窗口,告知用户。“”内为弹出窗口现实的内容;
HexDisplay():用于AES加密,返回一个由k个十六进制数组转化而来的字符串;
4.2解密部分的实现
4.2.1解密部分流程
1.获取文本框中的密文数据,并将其转化为二进制数据;
2.将初始值 读入内存,调用AES加密函数,将 进行AES加密,输出加密后的字符,将加密后的字符变换为二进制;
3.将密文的二进制流序列与AES加密后的密钥 进行异或运算,得到明文的二进制;
4.继续获得密文字符,在用AES加密,得到密钥 ,之后将 进行二进制的变换,与明文的二进制进行异或;
5. 循环此过程,直到全部密文被解密。
流程图如下:

4.2.2调用重要函数及模块
解密过程中调用的函数和模块与加密过程中相似,不再赘述。
4.3加密解密界面实现:
4.3.1加密界面实现
(1)首先,设置一个可以输入明文的本文框,利用VB中工具的TextBox一项,画出一个文本框,如图4.3:

为了防止密文输入过多,文本框无法全部现实的问题,将文本框的滚动条功能启动,具体操作为:将文本框属性里面的scrollBar一项改为2-Vertical,这样就可以得到如图4.3的效果。
(2)然后,利用同样的工具,设置一个密文呈现的窗口,如图4.4:

(3)设置一个加密按钮,用CommandButton来操作,如下图:

设置了此命令按钮后,要注意为此命令按钮设置合适的名称,并且在编写程序的时候,要相应的为此命令按钮编写正确的程序,至于在按钮上面现实的“加密”二字,可以在按钮的属性里面修改Caption一项为“加密”即可。
(4)最后,将这三部分整合起来,就可以得到加密的界面,如图4.6:

4.3.2解密界面实现
(1)利用TextBox一项,设置明文现实的文本框,如图4.7

(2)利用CommandButton来设计一个解密命令按钮,如图4.8

同加密按钮一样,要为此解密按钮设置适当的名称,并在程序的编写过程中为此按钮编写正确的程序。同样,需要修改按钮属性里面的Caption为“解密”。
(3)点击解密按钮后,需要一个解密后明文显示的文本框,制作原理如(1),制作出来后,将三部分整合,便得到如图4.9的解密界面

第五章 保密通信的实现
5.1WINSOCK编程介绍
5.1.1WINSOCK简介
如今,随着计算机和通讯技术的发展,计算机的网络化已渗透到各个应用领域,尤其是以TCP/IP协议为基础的异机种网络和异网互联发展迅猛。计算机应用系统的开发也由传统方式转向网络环境。对于许多的VB编程者而言,由于网络编程涉及到许多TCP/IP, UDP等之类的专业术语,没有极深厚的专业基础不敢涉足,使网络编程成为一个无法探究的领域。
TCP/IP协议是Internet网最重要的协议,VB提供WINSOCK控件用在TCP/IP的基础上进行网络通信,可以方便快捷地与远程计算机建立连接。WINSOCK提供用户数据文报协议UDP和传输控制协议TCP, TCP协议是一个面向连接、全双工、可靠的、按序传送的传输层协议,允许创建和维护与远程计算机的连接,连接的计算机可彼此进行数据传输。如果创建客户应用程序,就必须知道服务器计算机名或者IP地址(RemoteHost属性),还要知道进行“侦听”的端口(RemotePort属性),然后调用Connect方法。如果创建服务器应用程序,就应设置一个收听端口(LocalPort属性)并调用Listen方法。当客户计算机需要连接时就会发生Connection-Request事件,为完成连接,可在ConnectionRequest事件中调用Accept方法。建立连接后,任何一方计算机都可以收发数据。为发送数据,可调用SendData方法。当接收数据时会发生Data-Arrival事件,在DataArrival事件中调用GetData方法就可获取数据。一个TCP连接需要客户机和服务器都要有一个IP地址和端口,所标识的端口一定不能再让其它应用程序使用。UDP协议是一个无连接、不可靠的协议,跟TCP操作不同,计算机并不建立连接。另外UDP应用程序可以是客户机,也可以是服务器,为传输数据,首先要设置客户计算机的LocalPort属性,然后服务器计算机需将RemoteHost设置为客户计算机的Internet地址,将RemotePort属性设置为跟客户计算机的LocalPort属性相同的端口,并调用SendData方法来发送信息。客户计算机使用DataArrival事件内的GetData方法来获取已发送的信息。由于UDP协议没有建立连接,通信效率高,但可靠性不如TCP协议高,使用UDP发送消息,有时会出现收不到消息的情况。因此在少量数据送、可靠性要求不高的应用环境可选用UDP协议【9】。
5.1.2WINSOCK函数介绍
WINSOCK中常用的API函数有:bind () , connect() ,accept(), listen( )、send()等。Bind函数可将指定的套接字同本地的网络(包括端口)绑定,因为一旦创建了套接字,就必须将套接字绑定到本地接口的网络地址和端口上。listen函数用于在面向连接的通信服务器端,在bind调用之后,将套接字置入监听模式,指示,在bind调用之后,将套接字置入监听模式,指示套接字等候连接传人。和accept函数用于完成一个面向连接的通信的建立。其中connect()用于客户端向服务器发出连接请求,而accept()用于使服务器接受来自某客户进程的实际连接请求。send函数用于在面向连接的通信中,在已经建立连接的套接字上发送数据。
WINSOCK控件可以使用两种协议:TCP协议和UDP协议。TCP协议即数据传输协议,它在两个主机之间建立连接,提供双向、有序且无重复的数据流服务,以及流量控制、差错检测和纠错等服务,保证数据的可靠传输。利用TCP协议通讯必须分别建立客户应用程序和服务器应用程序。UDP协议也称为用户数据报文协议,是一种双向的无连接服务。它把数据发送出去但并不进行差错控制和检查,所以不能保证数据的可靠性,因而一般只用于少量数据的传输。但用它进行连接时,不必象TCP协议那样需要服务器端侦听,客户机端请求连接,服务器端建立连接后双方才能通信。UDP应用程序可以是客户机,也可以是服务器程序,而不必向TCP应用程序那样必须分别建立客户机程序和服务器程序【10】。
本设计的通信部分采用TCP协议,即采用客户端与服务器端两部分。

5.2实现通信的程序分析
5.2.1服务器端
首先在服务器端程序中加一个WINSOCK控件,命名为tcpserver,侦听端口为1000(localPort属性设为1000),并用Listen方法对这个端口侦听,等待客户发送连接请求【11】。
(1)设定服务器侦听端口:
Private Sub Form_Load()
tcpserver.LocalPort=1000 “设置本地机器的通信端口”
tcpserver.Listen
End Sub
其次向窗口中添加两个文本框:SendText(输入发送消息)和DisplayText(显示接收的信息)。当客户端请求连接时,将触发服务器中的ConnectionRequest事件,在此过程中决定是否建立连接。
(2)接收客户端的请求:
Private Sub Server_ConnectionRequest(ByVal requestID As Long)
If Server.State <> sckClosed Then Server.Close
Server.Accept requestID “接收新连接,并将requestID的参数值传给Accept”方法
End Sub
(3)接收数据:
Private Sub Server_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
Server.GetData strData, vbString“将接受到的数据储存在strDate变量中”
Text2.Text = strData
End Sub
(4)数据的发送:
Private Sub miwen_Change()
Server.SendData miwen.Text“将文本框miwen中的数据传输出去”
End Sub
5.2.2客户端
在客户端程序中同样也加入一个WINSOCK控件,命名为tcpclient,其RemoteHost属性为服务器端的计算机名或IP地址,RemotePort属性为服务器的侦听端口,再通过Connect方法与服务器连接。
(1)设置远程服务器的网络地址:
Private Sub Form_Load()
Client.RemoteHost = “218.196.119.189″
Client.RemotePort = 1000
End Sub
(2)设置连接按钮
Private Sub connet_Click()
Client.Connect
End Sub
(3)服务器接收请求,发送数据给客户端,客户端接收并显示
Private Sub Client_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
Client.GetData strData, vbString
Text2.Text = strData
End Sub
(4)数据的发送
Private Sub miwen_Change()
Client.SendData miwen.Text
End Sub
5.3保密通信界面的实现
5.3.1服务器端
结合加密解密的界面设计,在服务器端添加一个WINSOCK控件,设置控件的侦听端口为1000(),具体为写入代码tcpserver.LocalPort=1000,设置好后,形成如下的界面:

5.3.2客户端
客户端的界面与服务器端界面设计相同,不同的是,在客户端上面添加的WINSOCK控件的一些属性与服务器端不同,具体有:
(1)RemoteHost:要设置成为服务器所在机器的IP;
(2)RemotPort: 要设置一个固定的端口,例如1000;
具体设置如下图:

5.4程序演示界面
在设计完所有的程序和界面之后,一个“基于AES的序列密码保密通信软件”就设计完成了,下面,我们分步骤进行软件的演示
(1)首先,程序运行后,需要点击客户端的连接按钮,以连接服务器和客户端。
(2)连接后,在server端的明文输入窗口输入,点击加密,则在密文显示窗口显示密文,如下图:

(3)与此同时,client端的接收框内马上显示与serve端的密文框中相同的字符,如下图:

(4)点击client端的解密按钮,马上还原成之前在server输入的明文,如下图:

(5)在client端输入明文,点击加密

(6)serve端的接收框中显示相应密文,如下图:

(7)点击serve端的解密按钮,还原明文,如下图:

以上就是整个程序的工作过程,可以多次进行输入加密,解密工作,达到保密通信的目的,密文在信道上如果被截获,得不到事先约定的初始值 和AES加密密钥,是很难被破解的。

第六章 总结与展望
当今世界,数据的安全性越来越收到人们的高度关注。随着网络成为信息的一个重要的载体,网络数据传输的安全保证就成为了一个非常值得关注的议题。现如今,各种各样的数据加密算法层出不穷,虽然每种加密算法都有着其自己的优点,但不可否认的是,没有一种加密算法是绝对安全的,我们在设计一种新的加密算法的时候,只能尽可能的提高这种加密算法的安全性,最大限度的保护通过这种加密算法传输的数据的安全性。
6.1总结
AES作为一种新兴的数据加密算法,在当今的数据加密领域被广泛的应用,但他不是不可破解的。而序列密码作为早期的密码算法,优点很多,但不适用于软件实现。那么,基于AES的序列密码算法就将集成这两种算法的优点,最大的提高通信的安全。
本文主要介绍了当今世界加密算法的发展及现状、分组加密算法及AES算法、序列密码的原理及设计方案、WINSOCK通信的原理和软件界面的设计。
在AES算法的介绍上,集中对其加密解密的原理以及重要算法和函数进行了介绍,没有进一步的探讨与研究。这是由于本文的重点在于构造一个序列密码,并且,AES加密算法的标准已经在2000年被制定,具体算法已经被很多人用各种软件编写,故没有赘述。在重点的序列密码构造部分,集中介绍了序列密码的原理与应用,本课题采用的设计思想与构造方法。对加密解密过程中涉及到的重要函数以及方法加以详细的介绍,对整体的设计构造过程进行了全面的介绍。对加密解密的关键部分“异或”以及用AES产生密钥流这一问题进行了详尽的介绍。在通信部分,介绍了WINSOCK通信的原理及重要函数的功能,让读者可以基本了解WINSOCK通信并对下文的理解起到铺垫作用。之后详尽的介绍了本课题如何利用WINSOCK进行通信,对每一条程序进行注释分析,力求做到介绍的详尽。最终,将程序的演示界面进行了介绍,为的是使读者对本课题有一个更加直观的认识。
6.2课题展望
序列密码的发展一直倍受业界的关注,由于它的“一次一密”特性和随机序列密钥的不可破解性,序列密码在影响国家安全,军事战略的领域被广泛应用,随着对安全性要求的进一步提高,自同步流密码的研究、有记忆前馈网络密码系统的研究、多输出密码函数的研究以及混沌序列密码和新研究方法的探索成为了未来序列密码发展的热点。

参考文献
[1] 张照止,杨义先,马晓敏.信息理论密码学的新进展及研究问题[J].电子学报,1998,26(7):9-18.
[2] 冯登国,裴定一.密码学导引[M].北京:科学出版社,1999.
[3]冯登国.国内外密码学研究现状及发展趋势[J].通信学报,2002,23(5):18-26.
[4] 林德敬,林柏钢,林德清.国内外分组密码理论与技术的研究现状[J].天津通信技术,2002,(4):1-8.
[5] 何明星,范平志•新一代私钥加密标准AES进展与评述[J].计算机应用研究,2001,18(10):4-6.
[6] 卢开澄.计算机密码学(第2版)[M].北京:清华大学出版社,1998.172-183.
[7] Schneier B.Applied cryptograph[M].John Wiley &Sons,1993.216-244.
[8] Lai X. On the design and security of block cIPhers[J].ETH Series in Information Processing,1992,(1):41-80.
[9] 施炜.WindowsSockets规范及应用[M].上海:上海交通大学出版社,1996.
[10] 曹宁,冯忠义.基于客户/服务器模式的Socket网络编程[J].计算机工程,1999.72.
[11]ForouzanBA,ChungSF.TCP/IPProtocolSuite[M].TheMcGraw-HillCompaniesInc,2000.602,603,619.

因特网上传输文件的签名与验证程序

Posted by 天际的荒草 | Posted in Docs | 文档 | Posted on 19-09-2009

标签:, , , , , ,

0

目录
摘 要 II
ABSTRACT III
第一章 绪论 1
1.1 课题背景 1
1.2 国内外数字签名技术的研究现状 2
1.3 任务要求和目标 5
1.4实现条件和方案的选择 6
第二章 数字签名技术原理 8
2.1 数字签名的基本原理 8
2.1.1数字签名的定义 8
2.1.2数字签名的功能和应用 9
2.2 数字签名算法 11
2.2.1 数字签名算法概述 11
2.2.2 RSA签名算法 12
2.2.3 MD5算法简介 13
2.3 数字签名在JAVA中的实现方法 15
第三章 软件设计 19
3.1 软件设计思路 19
3.2 系统框图 20
3.2.1 程序流程图 20
3.2.2程序模块图 21
3.3 系统详细设计 23
3.3.1 客户端程序 23
3.3.2 服务器端程序 26
3.3.3 利用Sokcet实现Winsock通信 29
第四章 软件测试与分析改进 33
4.1 系统整体功能测试 33
4.2 客户端功能测试 34
4.3 服务器端功能测试 35
4.4 软件性能整体分析与改进 37
第五章 总结 39
结束语 40
参考文献 41
附录 42
附录Ⅰ 42
附录Ⅱ 47
摘 要
随着Internet的快速发展,对网络信息安全提出了更高的要求,而数字签名技术在保证数据的完整性、私有性和不可抵赖性方面起着极为重要的作用,占据特别重要的地位。
本文设计了一个数字签名及签名验证系统。该系统基于RSA和MD5算法以及 Winsock通信,并利用Java作为编程语言,JCreator作为开发工具,成功实现了对选定文件进行数字签名及其签名验证。
系统由客户端和服务器端两部分组成。客户端能对任意选定文件进行数字签名,并保存签名和公钥,然后通过Winsock通信将签名和公钥发送到服务器端。服务器为多线程服务器,能够处理多个客户端连接,接收它们发送过来的签名和公钥,然后对签名进行验证。
本设计最大的特点是利用了Java安全API中数字签名的功能和Java强大的网络功能,直接调用Java的内部函数实现了数字签名,利用Java中的Socket实现了Winsock通信,使得数字签名和Winsock通信的实现简化了许多。
因此,本文设计的是一个操作方便、功能齐全的简单的数字签名及签名验证系统。

关键词  数字签名,签名验证,RSA, MD5算法, Winsock,通信,Java

ABSTRACT

Rapidly increase of Internet is making more higher demands on the security of network information,while digital signature technology plays a very important role and occupies an especially important place in assureing the integrity , privateness and non-repudiction of data.
  This article designed a digital signature and signature verification system. Using java as program language and JCreator as development tool,this system which is based on RSA and MD5 algorithm and Winsock communication, succeeded in implementing signature and signature verification for any files chosen.
  The system consists of client-side and server-side. The client-side is able to sign any file chosed , save its signature and public key,and then send them to server-side by Winsock communication. The server-side which is a multi-thread server, is able to deal with multiple connections of client-side,receive signature and public key sended by them,and then verify the signature.
This design has a major characteristic,which is that making use of functions of signature in java’s security API and java’s powerful network functions.The design directly used functions inner java to implement digital signature ,used socket inner java to implement winsock communication,which maked it much more simple to implement digital signature and winsock communication.
Therefore,this article designed a simple digital signature and signature verification system with simple operation and complete functions.
KEY WORDS  digital signature, signature verification, RSA, MD5 algorithm, winsock communication,Java

第一章 绪论

1.1 课题背景

我们知道,一般的书信或者文件等纸质文档是根据亲笔签名或印章来证明其真实性的。当今社会,电子文档将逐步代替纸质的文件成为信息交流的主体。证明某一个电子文件是某作者所作的有效办法是模拟普通的手写签名在电子文档上进行电子签名,即在电子化文件中添加可以标记自己的一段特征数据来实现签名。作者可以通过数字签名表明目己的身份,读者可以通过数字签名验证作者的身份。
电子邮件是互联网上最重要的应用之一,传统的电子邮件都是明文传输,并且发送方可以轻松地伪造自己的身份。随着电子邮件的应用扩展到各种信息敏感领域,如:政府间来往、商业谈判等,电子邮件的内容保密和发送方身份确认的重要性便逐步凸现出来。数字签名能很好地解决电子邮件的身份确认问题。
电子商务是互联网上发展最快的应用方向,它是借助于互联网的快速信息传输能力来完成各种商务活动,包括电子数据交换、在线交易系统、网上银行、商业增值网等。互联网是一个开放的空问,任何人都可以进入,而重要的商务信息具有敏感性和保密性,所以通常的商务信息在传输中要进行加密,同时,为了进一步防止欺骗性的篡改,数字签名是必不可少的。电子商务活动中的电子订单、电子帐单、电子收据、电子合同等电子文档都需要作数字签名以确保真实性。
网页数据是互联网上传输量最大的数据,网页已成为发布新闻、广告、招标、招聘等各种信息的重要媒体,己经开始对社会、经济、生活产生出一定的影响。这些信息来源的可靠性对相关人员来说极为重要。
随着数字化时代的到来,作为一种重要且有效的信息安全技术——数字签名将应用到社会的各个领域。
数字签名可以解决否认、伪造、篡改及冒充等问题。具体要求:发送者事后不能否认发送的报文签名,接收者能够核实发送者发送的报文签名,接收者不能对发送者的报文进行部分篡改,网络中的某一用户不能冒充另一用户作为发送者获接收者。数字签名的应用范围十分广泛,在保障电子数据交换的安全性上是一个突破性的进展,凡需要对用户的身份进行判断的情况都可以使用数字签名以确保数据的完整性、私有性和不可抵赖性。

1.2 国内外数字签名技术的研究现状

自从1976年公钥密码的思想提出以来,国际上已经提出了许多种公钥密码体制,如基于大整数固了分解问题的RSA[1](Ron Rivest, AdiShamir 和Leonard Adleman) 体制和Rabin(Miller-Rabin算法)体制、基于有限域上的离散对数问题的Diffie.Hellman公钥体制和E1Gamal体制、基于椭圆曲线上的离散对数问题的Diffie.Hellman公钥件制和E1Gamal体制、基于背包问题的Merkle.Henman体制和Chor-Rivest体制、基于代数编码理论的MeEliece体制、基于有限自动机理论的公钥体制等等。
用抽象的观点来看,公钥密码体制就是一种陷门单向函数。我们说一个函数 是单向函数,若对它的定义域中的任意x 都易于计算f(x ),而对f的值域中的几乎所有的Y, 即使当f为已知时要计算f-1(Y)在讨算上也是不可行的。若当给定某些辅助信息(陷门信息)时易于计算f-1(Y),就称单向函数 是~ 个陷门单向函数 公钥密码体制就是基于这一原理而设计的,将辅助信息(陷门信息)作为秘密密钥。这类密码的安全强度取决于它所依据的问题的计算复杂性。
目前比较流行的公钥密码体制主要有两类:一类是基于大整数因子分解问题的,其中最典型的代表是RSA体制。 另一类是基于离散对数问题的,如E1Gamal公钥密码体制和影响比较大的椭圆曲线公钥密码体制 由于分解大整数的能力日益增强,因此为保证RSA体制的安全性总是要增加模长 目前768bit模长的RSA体制已不安全。一般建议使用1024bit模长,预计要保证20年的安全性就要选择2048bit的模长,增大模长带来了实现上的难度。
而基于离散对数问题的公钥密码在目前技术下512bit模长就能够保证其安全性 特别是椭圆曲线上的离散对数的计算要比有限域上的离散对数的 算更困难, 目前技术下只需要160bit模长即可保证其安全性,适合于智能卡的实现, 因而受到国际上的广 泛关注。国际上制定了椭圆曲线公钥密码标准IEEEP1363。RSA等一些公司声称他们已开发出了符合该标准的椭圆曲线公钥密码。我国学者也提出了一些公钥密码,另外在公钥密码的快速实现方面也做了一定的工作,比如在RSA的快速实现和椭圆曲线公钥密码的快速实现方面都有所突破。公钥密码的快速实现是当前公钥密码研究中的一个热点,包括算法优化和程序优化。另一个人们所关注的问题是椭圆曲线公钥密码的安全性论证问题。
目前,公钥密码的重点研究方向为:
1)用于设计公钥密码的新的数学模型和陷门单向函数的研究:
2)针对实际应用环境的公钥密码的设计:
3)公钥密码的快速实现研究, 包括算法优化和程序优化、软件实现和硬件实现;
4)公钥密码的安全性评估问题,特别是椭圆曲线公钥密码的安全性评估问题。
公钥密码主要用于数字签名和密钥分配。当然,数字签名和密钥分配都有自己的研究体系,形成了各自的理论框架。
数字签名是对电子形式的消息签名的一种方法,一个签名消息能在一个通信网络中传输。基于公钥密码体制和私钥密码体制都可以获得数字签名, 特别是公钥密码体制的诞生为数字签名的研究和应用开辟了一条厂阔的道路。
关于数字签名技术的研究,目前主要集中于基于公钥密码体制的数字签名技术的研究。数字签名的研究内容非常丰富,包括普通数字签名和特殊数字签名。普通数字签名算法有RSA 数字签名算法、E1Gamal数字签名算法、Fiat Shamir数字签名算法、Guillou.Quisquarter数字签名算法、Schnorr数字签名算法、Ong—hnorr-Shamir数字签名算法、美国的数字签名标准,算法(DSS/DSA),椭圆曲线数字签名算法和有限自动机数字签名算法等。特殊数字签名有自签名、代理签名、群签名、不可否认签名、公平盲签名、门限签名、具有消息恢复功能的签名等,它与具体应用环境密切相关 显然, 数字签名的应用涉及到法律问题.美国联邦政府基于有限域上的离散对数问题制定了自己的数字签名标准(DSS),部分州已制定了数字签名法。一些国家如法国和德国已经制定了数字签名法。
2000年1月举行的第六届国际密码学会议对应用于公开钥密码系统的加密算法,推荐了两种:基于大整数因子分解难题的RSA算法和基于椭圆曲线上离散对数计算难题的ECC算法。所以基于RSA算法的数字签名还有一定的发展。
对于未来的加密、生成和验证数字签名的工具需要完善,只有用SSL(安全套接层)建立安全链接的Web浏览器,才会频繁使用数字签名,公司要对其雇员在网络上的行为进行规范,就要建立广泛协作机制来支持数字签名,支持数字签名是Web发展的目标,确保数据保密性、数据完整性和不可否认性才能保证在线商业的安全交易。
和数字签名有关的复杂认证能力就像现在操作、应用环境中的口令保护一样直接做进操作系统环境、应用、远程访问产品、信息传递系统及 Internet防火墙中,像Netscape 支持X.509标准的Communicator 4.0 Web客户机软件;Microsoft支持X.509的Internet Explorer 4.0客户机软件及支持对象签名检查的Java虚拟机等。安全问题是阻碍电子商务广泛应用的最大问题,改进数字签名在内的安全技术措施、确定CA认证权的归属问题是解决电子商务安全问题的关键。
在密钥管理方面,国际上都有一些大的举动,比如1993年美国提出的密钥托管理论和技术、国际标准化组织制定的X.509标准(已经发展到第3版本)以及麻省里工学院开发的Kerboros协议(已经发展到第5版本)等,这些工作影响很大。密钥管理中还有一种很重要的技术就是秘密共享技术,它是一种分割秘密的技术,目的是阻止秘密过于集中,自从1979年Shamir提出这种思想以来,秘密共享理论和技术达到了空前的发展和应用,特别是其应用至今人们仍十分关注。我国学者在这些方面也做了一些跟踪研究,发表了很多论文,按照X.509标准实现了一些CA。但没有听说过哪个部门有制定数字签名法的意向。目前人们关注的是数字签名和密钥分配的具体应用以及潜信道的深入研究。
Hash函数主要用于完整性校验和提高数字签名的有效性,目前已经提出了很多方案,各有千秋。Hash函数主要用于完整性校验和提高数字签名的有效性,目前已有很多方案。这些算法都是伪随机函数,任何杂凑值都是等可能的。输出并不以可辨别的方式依赖于输入。在任何输入串中单个比特的变化,将会导致输出比特串中大约一半的比特发生变化。
目前,设计杂凑函数的基本方法有以下几种:
1)利用某些数学难题比如因子分解问题、离散对数问题等设计杂凑函数。已设计出的算法有Davies.Price平方杂凑算法、CCITT建议、Jueneman杂凑算法、Damgard平方杂凑算法、Damgard背包杂凑算法、Schnorr的FFT杂凑算法等。
2)利用某些私钥密码体制比如DES等设计杂凑函数。这种杂凑函数的安全性与所使用的基础密码算法有关 这类杂凑算法有Rabin 杂凑算法、Winternitz 杂凑算法、Quisquater.Girault杂凑算法、Merkle杂凑算法、N—Hash算法等。
3)直接设计杂凑函数,这类算法不基于任何假设和密码体制。 这种方法受到人们的广泛关注和青睐,是当今比较流行的一种设计方法。美国的安全杂凑算法(SHA)就是这类算法,此类算法还有MD4、MD5、MD2、RIPE—MD、HAVAL等。
美国国家标准技术研究所与美国国家安全局共同设计了一个与美国数字签名算法(DSA) 起使用的安全杂凑算法(SHA),标准是安全杂凑标准(SHS),SHA是用于该标准的算法。SHA于1992年1月31日在联邦记录中公布,1993年5月I1日起采纳为标准。I994年7月l1日作了一次修改,1995年4月l7日正式公布。SHA的设计原则与MD4算法的设计原则极其相似,它很像是MD4算法的一种变形,但SHA 的设计者没有公开SHA 的详细设计准则。SHA的输入的长度限制在2 64bit之内,输出长度为l60bit。由于技术的原因,美国目前正准备更新其Hash标准,加之欧洲也要制定Hash标准,这必然导致Hash函数的研究特别是实用技术的研究将成为热点。
美国早在1977年就制定了自己的数据加密标准(一种分组密码),但除了公布具体的算法之外,从来不公布详细的设计规则和方法。随着美国的数据加密标准的出现,人们对分组密码展开了深入的研究和讨论,设计了大量的分组密码,给出了一系列的评测准则,其他国家,如日本和苏联也纷纷提出了自己的数据加密标准。但在这些分组密码中能被人们普遍接受和认可的算法却寥寥无几。何况一些好的算法已经被攻破或已经不适用于技术的发展要求。比如美国的数据加密标准已经于1997年6月17日被攻破。美国从1997年1月起,正在征集、制定和评估新一代数据加密标准(称作AES),大约于2001年出台,目前正处于讨论和评估之中。AES活动使得国际上又掀起了一次研究分组密码的新高潮。继美国征集AES活动之后,欧洲和日本也不甘落后启动了相关标准的征集和制定工作,看起来比美国更宏伟。同时国外比如美国为适应技术发展的需求也加快了其他密码标准的更新,比如SHA-1和FIPS140-1。我国目前的做法是针对每个或每一类安全产品需要开发所用的算法,而且算法和源代码都不公开,这样一来,算法的需求量相对就比较大,继而带来了兼容性、互操作性等问题。
国外目前不仅在密码基础理论方面的研究做的很好,而且在实际应用方面也做的非常好。制定了一系列的密码标准,特别规范。算法的征集和讨论都已经公开化,但密码技术作为一种关键技术,各国都不会放弃自主权和控制权,都在争夺霸权地位。美国这次征集AES的活动就充分体现了这一点,欧洲和日本就不愿意袖手旁观,他们也采取了相应的措施,其计划比美国更宏大,投资力度更大。我国在密码基础理论的某些方面的研究做的很好,但在实际应用方面与国外的差距较大,没有自己的标准,也不规范。
密码技术特别是加密技术是信息安全技术中的核心技术,国家关键基础设施中不可能引进或采用别人的加密技术,只能自主开发。目前我国在密码技术的应用水平方面与国外还有一定的差距。国外的密码技术必将对我们有一定的冲击力,特别是在加入WTO组织后这种冲击力只会有增无减。有些做法必须要逐渐与国际接轨,不能再采用目前这种关门造车的做法,因此,我们必须要有我们自己的算法,自己的一套标准,自己的一套体系,来对付未来的挑战。实用密码技术的基础是密码基础理论,没有好的密码理论不可能有好的密码技术、也不可能有先进的、自主的、创新的密码技术。因此,首先必须持之以恒地坚持和加强密码基础理论研究,与国际保持同步,这方面的工作必须要有政府的支持和投入。另一方面,密码理论研究也是为了应用,没有应用的理论是没有价值的。我们应在现有理论和技术基础上充分吸收国外先进经验形成自主的、创新的密码技术以适应国民经济的发展。见参考文献[2]。

1.3 任务要求和目标

1.任务要求
本课题要求编程实现:对选定文件进行数字签名,能在因特网上传输文件及其签名,能接收并能验证签名的数字签名系统。该系统应包括以下几项内容:
(1) 数字签名系统初始化;
(2) WINSOCK通信;
(3) 对文件进行数字签名;
(4) 验证文件的数字签名;
(5) 用RSA方法,MD5,可以用系统提供的函数。
该数字签名系统应满足以下要求:
(1).收方能确认或证实发方的签字,但不能伪造;
(2).发方发出签名后的消息,就不能否认所签消息;
(3).收方对已收到的消息不能否认;
(4).第三者可以确认收发双方之间的消息传送,但不能伪造这一过程
数字签名的设计要求:
(1).签名必须是依赖于被签名信息的比特模式;
(2).签名必须使用某些对发送者是唯一的信息,以防止双方的伪造与否认;
(3).必须相对容易生成该数字签名;
(4).必须相对容易识别和验证该数字签名;
(5).伪造该数字签名在计算复杂性意义上具有不可行性,既包括对一个已有的数字签名构造新的消息,也包括对一个给定消息伪造一个数字签名;
(6).在存储器中保存一个数字签名备份是现实可行的。
2.任务目标
本课题的主要目标是编程实现一套数字签名系统,该系统要求能够对选定文件进行数字签名,并通过因特网传输,接收方对该签名进行验证,以检验文件的原文在传输过程中有无变动,确保传输电子文件的完整性、真实性和不可抵赖性,并由达到此确认对方身份的目的。通过本次毕业设计的完成,对数字签名技术能够有更深入理解,能够掌握开发数字签名的系统的基本方法,能够培养独立思考、勤学好问、自己动手解决问题的能力。

1.4实现条件和方案的选择
1.实现条件

本课题所提供的条件是:选择适当的编程语言和编译器设计一套数字签名系统,能够对任意指定文件进行数字签名,签名算法采用RSA和MD5算法,可以自己编写算法,也可以使用系统提供的内部函数;然后由签字方将该签名通过因特网发送到另一方,网络通信部分采用Winsock通信,能够在在两个指定的IP地址之间进行通信,发送文件和消息,服务器方要求是多线程服务器,能够同时处理多个来自客户端的连接请求,接收并保存用户发送过来的签名和公钥;然后由服务器方对所接收的签名进行验证,验证的算法必须采用和客户端同样的算法,即RSA和MD5算法,计算签名所对应的原文件的MD5函数值B,使用签字方所提供的公钥解密签名得到MD5函数值A,最后比较这两个值是否相等,得出结论。

2.方案的选择
数字签名系统的实现方案很多,可以采用Java平台实现,使用VisualBasic 6.0平台实现,使用C++Builder平台实现,使用Windows 本地化程序实现等等。但是综合考虑系统的复杂性、执行效率、时间的紧迫性等等因素,我决定采用第一种方案,即采用Java平台实现。
首先,是因为本人对Java语言比较熟悉,容易上手,而对VB和C++都不甚了解,时间不允许我花很多时间来研究这些语言。
其次,是因为Java语言本身所具有的特点。由于面向对象的程序设计语言Java是为网络环境特殊设计的,具有跨平台运行性能,可适应各种环境要求,并可自动升级其代码,并且Java技术是与平台无关,是当今被各大软件公司可接受为最高级的面向对象设计语言的主流技术;且Java安全API提供了加密、信息融合、密钥管理、认证、存取控制和数字签名等功能,允许开发者进行低层和高层的安全应用,Java安全API数字签名的方法集中在java.security软件包中,在程序开始部分要引入该软件包(import java .security),该软件包中支持基于”MD5WithRSA”算法的数字签名,软件编程时可以直接调用其内部函数,而不必自己重新编写;网络通信方面,利用Java的套接字(Socket)可以很方便的实现Winsock通信,轻松实现各种平台和环境之间的网络通信问题而不存在兼容的问题。而且在Java中,RSA密钥生成、RSA加密解密的功能实现十分简单,因为标准库中集成几乎所有功能,不需要从RSA算法出发进行编码。在j2se标准库中,javax.crypto中的Cipher类用于具体的加密和解密,java.security包直接提供了数字签名的相关方法。因为有强大的标准库支持,文件的读取和保存操作、各环节必要的数据编码转换、图形操作界面的实现也很简单(使用java.io java.awt或javax.swing 等包),如果结合一种快速开发的IDE,比如JBuilder,整个软件可以在很短的时间内编码完成。如果不考虑非PC设备和机器效率等问题,java平台几乎是最佳解决方案。
因此,软件的编程语言决定采用Java语言,编译器则采用JCreator,JDK版本1.5。签名算法按课题要求采用基于RSA、MD5的数字签名算法。签名系统设计为两部分,即客户端和服务器端,功能描述为:客户端要求能够对任意指定文件进行数字签名,并保存签名公钥和签名,并发送给服务器等待对方验证;而服务器端要求能够处理多个来自客户端的连接请求,并将其发送过来的签名和公钥接收保存下来,然后调用签名验证算法,利用对方公钥验证出文件的原文在传输过程中有无变动,确保传输电子文件的完整性、真实性和不可抵赖性。至于Winsock网络通信部分采用Java内部的Socket机制来实现。

第二章 数字签名技术原理

2.1 数字签名的基本原理

2.1.1数字签名的定义
所谓”数字签名[3]“就是通过某种密码运算生成一系列符号及代码组成电子密码进行签名,来代替书写签名或印章,对于这种电子式的签名还可进行技术验证,其验证的准确度是一般手工签名和图章的验证而无法比拟的。”数字签名”是目前电子商务、电子政务中应用最普遍、技术最成熟的、可操作性最强的一种电子签名方法。它采用了规范化的程序和科学化的方法,用于鉴定签名人的身份以及对一项电子数据内容的认可。它还能验证出文件的原文在传输过程中有无变动,确保传输电子文件的完整性、真实性和不可抵赖性。
数字签名在ISO7498-2标准中定义为:”附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据和变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(例如接收者)进行伪造”。美国电子签名标准(DSS,FIPS186-2)对数字签名作了如下解释:”利用一套规则和一个参数对数据计算所得的结果,用此结果能够确认签名者的身份和数据的完整性”。按上述定义PKI(Public Key Infrastructino 公钥基础设施)提供可以提供数据单元的密码变换,并能使接收者判断数据来源及对数据进行验证。
目前的数字签名是建立在公共密钥体制基础上,它是公用密钥加密技术的另一类应用。它的主要方式是:报文的发送方从报文文本中生成一个128位的散列值(又称报文摘要,数字指纹)。发送方用自己的私人密钥对这个散列值进行加密来形成发送方的数字签名。然后,这个数字签名将作为报文的附件和报文一起发送给报文的接收方。报文的接收方首先从接收到的原始报文中计算出128位的散列值,接着再用发送方的公用密钥来对报文附加的数字签名进行解密。如果两个散列值相同、那么接收方就能确认该数字签名是发送方的。通过数字签名能够实现对原始报文的鉴别。更多见参考文献[4]。
该技术在具体工作时,首先发送方对信息施以数学变换,所得的信息与原信息惟一对应;在接收方进行逆变换,得到原始信息。只要数学变换方法优良,变换后的信息在传输中就具有很强的安全性,很难被破译、篡改。这一个过程称为加密,对应的反变换过程称为解密。其工作原理如下图 2-1:

图 2-1数字签名的工作原理

2.1.2数字签名的功能和应用

1.数字签名的功能
数字签名具有目前手签章或印章的功能,用以证明数字文件是经某人认证过的。当信息以传送方的“密钥”加密之后,任何拥有与该“密钥”相对应之“公钥’,均可以将之解密,但因为“密钥”只有传送方拥有,且是保持秘密不公开的,所以以此密钥加密的信息可看作传送方对该信息的签名,其作用类似现行手签名一般,若是配合所谓PKI机制,则可以看作是个人对此文件的签名。
采用数字签名,能够确认以下两点:第一,信息是由签名者发送的;第二,信息自签发后到收到为止未曾作过任何修改。这样数字签名就可用来防止电子信息因易被修改而有人作伪,或冒用别人名义发送信息。或发出(收到)信件后又加以否认等情况发生。
数字签名可以解决否认、伪造、篡改及冒充等问题。具体要求:发送者事后不能否认发送的报文签名、接收者能够核实发送者发送的报文签名、接收者不能伪造发送者的报文签名、接收者不能对发送者的报文进行部分篡改、网络中的某一用户不能冒充另一用户作为发送者或接收者。
概括的说,数字签名主要有以下几方面的功能:
(1)保证了信息的完整性;根据Hash函数的性质,一旦原始信息被改动,所生成的数字摘要就会发生很大的变化,因此,通过这种方式,能防止原始信息被篡改。
(2)抗否认性;使用公开密钥的加密算法,由于只有发送方一人拥有私钥,因此,发送方不能否认发送过信息。
(3)防止接收方伪造一份报文,声称来自于发送方。

2.数字签名的应用
数字签名的应用范围十分广泛,在保障电子数据交换(EDI)的安全性上是一个突破性的进展,凡是需要对用户的身份进行判断的情况都可以使用数字签名,比如加密信件、商务信函、定货购买系统、远程金融交易、自动模式处理等等。
随着电脑的普及应用和互联网的快速发展,电子商务已经逐渐成为人们进行商务活动的新模式;电子商务在提高商务效率、降低商务交易成本的同时,本身安全性也随之而至,成为制约其进一步发展的重要瓶颈。
目前影响电子商务安全主要有计算机网络安全和商务交易信息安全两个方面。计算机网络安全是指作为电子商务交易平台的计算机网络的安全,其内容包括计算机网络设备安全、计算机网络系统安全、数据库安全等;商务交易信息安全则包括防止信息窃听、篡改、伪装等,确保电子商务数据的完整性、可用性、交易双方身份的确定性,交易行为的不可抵赖性等。由于互联网上电子商务交易平台的虚拟性和匿名性,计算机网络安全和商务交易信息安全问题也变得越来越突出,电子签名技术的应用及其立法为电子商务安全运行提供了重要保障。
所谓电子签名,是指数据电文中以电子形式所含、所附用于识别签名人身份并表明签名人认可其中内容的数据。通俗点说,电子签名就是通过密码技术对电子文档的电子形式的签名,并非是书面签名的数字图像化,它类似于手写签名或印章,也可以说它就是电子印章。
目前,可以通过多种技术手段实现电子签名,在确认了签署者的确切身份后,电子签名承认人们可以用多种不同的方法签署一份电子记录。方法有:基于PKI的公钥密码技术的数字签名;以生物特征统计学为基础的识别标识;手印、声音印记或视网膜扫描的识别;一个让收件人能识别发件人身份的密码代号、密码或个人识别码PIN;基于量子力学的计算机等等。
基于PKI的电子签名被称作“数字签名”。有人称“电子签名”就是“数字签名”是错误的。数字签名只是电子签名的一种特定形式。因为电子签名虽然获得了技术中立性,但也带来使用的不便,法律上又对电子签名作了进一步规定,如《电子签名法》中就规定了“可靠电子签名”和“高级电子签名”。实际上就是规定了数字签名的功能,这种规定使数字签名获得了更好的应用安全性和可操作性。目前,具有实际意义的电子签名只有公钥密码理论。所以,目前国内外普遍使用的、技术成熟的、可实际使用的还是基于PKI的数字签名技术。作为公钥基础设施PKI可提供多种网上安全服务,如认证、数据保密性、数据完整性和不可否认性,其中都用到了数字签名技术。
PKI的核心执行机构是电子认证服务提供者,即通称为认证机构CA,PKI签名的核心元素是由CA签发的数字证书。它所提供的PKI服务就是认证、数据完整性、数据保密性和不可否认性。它的作法就是利用证书公钥和与之对应的私钥进行加/解密,并产生对数字电文的签名及验证签名。数字签名是利用公钥密码技术和其他密码算法生成一系列符号及代码组成电子密码进行签名,来代替书写签名和印章;这种电子式的签名还可进行技术验证,其验证的准确度对手工签名和图章的验证无法比拟的。这种签名方法可在很大的可信PKI域人群中进行认证,或在多个可信的PKI域中进行交叉认证,它特别适用于互联网和广域网上的安全认证和传输。
电子签名应用领域包括电子商务,企业信息系统,网上政府采购,金融、财会、保险行业,食品、医药,教育,科学研究以及文件管理等方面。但最主要的还是表现在电子商务方面, 在网上将买方、卖方以及服务于他们的中间商(如金融机构)之间的信息交换和交易行为集成到一起的电子运作方式,如签定合同、订购、付费等。目前主要的发达国家以及其它许多国家,包括第三世界的国家,电子签名都在电子商务中起着非常重要的作用。
随着计算机网络技术和软件技术的蓬勃发展,以及internet的广泛应用对传统的工作方式产生了巨大的冲击,电子政务(E-government)系统就在这样的环境下应运而生了,目前电子政务这种“无纸化”办公方式在政府实际工作中已经发挥了越来越重要的作用,它是依赖于计算机和网络技术而存在的,这就意味着电子政务应用不可避免地存在着由互连网的自由、开放所带来的信息安全隐患,电子政务的所有活动都是政府行为,要求具有高度的可靠性和安全性,因此在电子政务系统上传输的数据必须有具有抗否定性、完整性、安全性以及身份验证机制。数字签名技术这种能保证数据的完整性、机密性、抗否定性的信息安全技术毫无疑问将会在电子政务系统中得到广泛的应用。见参考文献[5]。

2.2 数字签名算法

2.2.1 数字签名算法概述
基于公钥密码体制和私钥密码体制都可以获得数字签名,目前主要是基于公钥密码体制的数字签名。包括普通数字签名和特殊数字签名。普通数字签名算法有RSA、ElGamal、Fiat-Shamir、Guillou-Quisquarter、Schnorr、Ong-Schnorr-Shamir数字签名算法、Des/DSA,椭圆曲线数字签名算法和有限自动机数字签名算法等。特殊数字签名有盲签名、代理签名、群签名、不可否认签名、公平盲签名、门限签名、具有消息恢复功能的签名等,它与具体应用环境密切相关。
应用最为广泛的三种数字签名的算法是: Hash签名、DSS签名和RSA签名。这三种算法可单独使用,也可综合在一起使用。用RSA或其它公开密钥密码算法的最大方便是没有密钥分配问题(网络越复杂、网络用户越多,其优点越明显)。
1. Hash签名
Hash签名不属于强计算密集型算法,应用较广泛。它可以降低服务器资源的消耗,减轻中央服务器的负荷。Hash的主要局限是接收方必须持有用户密钥的副本以检验签名, 因为双方都知道生成签名的密钥,较容易攻破,存在伪造签名的可能。Hash签名是最主要的数字签名方法,也称之为数字摘要法(Digital Digest)或数字指纹法(Digital Finger Print)。它与RSA数字签名是单独的签名不同,该数字签名方法是将数字签名与要发送的信息紧密联系在一起,它更适合于电子商务活动。常用的 Hash算法有MD2、MD5、SHA-1。
2. DSS和RSA签名
DSS 和RSA采用了公钥算法,不存在Hash的局限性。RSA是最流行的一种加密标准,许多产品的内核中都有RSA的软件和类库。与DSS不同,RSA既可以用来加密数据,也可以用于身份认证。和Hash签名相比,在公钥系统中,由于生成签名的密钥只存储于用户的计算机中,安全系数大一些。见参考文献[6]。

2.2.2 RSA签名算法
RSA是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
RSA 是最流行的一种加密标准,许多产品的内核中都有RSA的软件和类库,早在Web飞速发展之前,RSA数据安全公司就负责数字签名软件与Macintosh 操作系统的集成,在Apple的协作软件PowerTalk上还增加了签名拖放功能,用户只要把需要加密的数据拖到相应的图标上,就完成了电子形式的数字签名。RSA与Microsoft、IBM、Sun和Digital都签订了许可协议,使在其生产线上加入了类似的签名特性。与DSS不同,RSA既可以用来加密数据,也可以用于身份认证。和Hash签名相比,在公钥系统中,由于生成签名的密钥只存储于用户的计算机中,安全系数大一些。
用RSA 或其它公开密匙密码算法进行数字签名的最大方便是没有密匙分配问题(网络越复杂、网络用户越多,其优点越明显)。因为公开密匙加密使用两个不同的密匙,其中有一个是公开的,另一个是保密的。公开密匙可以保存在系统目录内、未加密的电子邮件信息中、电话黄页(商业电话)上或公告牌里,网上的任何用户都可获得公开密匙。而保密密匙是用户专用的,由用户本身持有,它可以对由公开密匙加密信息进行解密。
RSA算法中数字签名技术实际上是通过一个Hash函数来实现的。数字签名的特点是它代表了文件的特征,文件如果发生改变,数字签名的值也将发生变化。不同的文件将得到不同的数字签名。一个最简单的Hash函数是把文件的二进制码相累加,取最后的若干位。Hash函数对发送数据的双方都是公开的。
RSA数字签名算法的过程为:A对明文m用解密变换作: sº Dk (m)=md mod n,其中d,n为A的私人密钥,只有A才知道它;B收到A的签名后,用A的公钥和加密变换得到明文,因: Ek(s)= Ek(Dk (m))= (md)e mod n,又 deº1 mod j(n)即de=lj(n)+1,根据欧拉定理mj(n)=1 mod n,所以Ek(s)=mlj(n)+1=[mj(n)]em=m mod n。若明文m和签名s一起送给用户B,B可以确信信息确实是A发送的。同时A也不能否认送给这个信息,因为除了A本人外,其他任何人都无法由明文m产生s.因此RSA数字签名方案是可行的。
但是RSA数字签名算法存在着因计算方法本身同构造成签名易被伪造和计算时间长的弱点,因此实际对文件签名前,需要对消息做MD5变换。
RSA数字签名算法,包括签名算法和验证签名算法。首先用MD5算法对信息作散列计算。签名的过程需用户的私钥,验证过程需用户的公钥。A用签名算法将字符串形式的消息处理成签名;B用验证签名算法验证签名是否是A对消息的签名,确认是A发送的消息;消息没有被攥改过;A一定发送过消息。
1.签名算法
签名算法包括三步:消息摘要计算,RSA加密。
(1) 消息摘要计算。消息在签名前首先通过MD5计算,生成128位的消息摘要 digest。
(2) 对摘要作RSA计算。用加密算法,采用签名者的私钥加密消息摘要,得到加密后的字符串。加密算法中使用的加密块为01类型。
2.验证签名算法
验证签名算法包括两步:RSA解密得签名者的消息摘要,验证者对原消息计算摘要,比较两个消息摘要。验证签名的过程输入为消息,签名者的公钥,签名;输出为验证的结果,即是否是正确的签名。
(1) .RSA解密。签名实际是加密的字符串。用上述的解密算法,采用签名者的公钥对这个加密的字符串解密。解密的结果应为128位的消息摘要。在解密过程中,若出现得到的加密块的类型不是01,则解密失败。签名不正确。
(2).消息摘要计算和比较。验证者对消息用MD5算法重新计算,得到验证者自己的消息摘要。验证者比较解密得到的消息摘要和自己的消息摘要,如果两者相同,则验证成功,可以确认消息的完整性及签名确实为签名者的;否则,验证失败。
RSA数字签名的原理如下图2-2、图2-3所示:

2.2.3 MD5算法简介
MD5[7]函数是一种单向散列函数,它将任意长度的消息压缩成128位的消息摘要。应用MD5的单向性(即给定散列值,计算消息很难)和抗碰撞性(即给定消息M,要找到另一消息M’并满足两者的散列值很难),可以实现信息的完整性检验。另外该函数的设计不基于任何假设和密码体制而直接构造,执行的速度快,是一种被广泛认可的单向散列算法。
MD5的全称是message-digest algorithm 5(信息-摘要算法),在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来,经md2、md3和md4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但md2的设计与md4和md5完全不同,那是因为md2是为8位机器做过设计优化的,而md4和md5却是面向32位的电脑。
这三个算法的描述和c语言源代码在internet rfcs 1321中有详细的描述,这是一份最权威的文档,由ronaldl. rivest在1992年8月向ieft提交。
MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:
MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461
这就是tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算MD5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的”抵赖”,这就是所谓的数字签名应用。
MD5还广泛用于加密和解密技术上。比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。
对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。 在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0×01234567,B=0×89abcdef,C=0xfedcba98,D=0×76543210。
当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。
将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。以一下是每次操作中用到的四个非线性函数(每轮一个)。
   F(X,Y,Z) =(X&Y)|((~X)&Z)
   G(X,Y,Z) =(X&Z)|(Y&(~Z))
   H(X,Y,Z) =X^Y^Z
   I(X,Y,Z)=Y^(X|(~Z))
   (&是与,|是或,~是非,^是异或)
这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。见参考文献[8]。

2.3 数字签名在Java中的实现方法

面向对象的程序设计语言Java是为网络环境特殊设计的,具有跨平台运行性能,可适应各种环境要求,并可自动升级其代码,是当今被各大软件公司可接受为最高级的面向对象设计语言的主流技术。Java技术是与平台无关的,并且是为Internet和Web编写移动代码,它有最突出的2个特点:
(1) Java 源程序经编译后产生的不是机器码,而是字节码(与平台无关),之后再用在各平台上实现解释器对它进行解释执行,即可实现在字节码与各平台兼容,而不必对字节作任何修改。
(2) Java 采用滞后编联技术,各对象的域和方法的内存分布都是在执行时才由解释器确定的。在字节码中是按各字(字符串)来引用的。对编程者而言,允许对解释器的内存作直接访问,这对于Internet的安全有重大意义。见参考文献[9]。
Java 安全 API提供了加密、信息融合、密钥管理、认证、存取控制和数字签名等功能,允许开发者进行低层和高层的安全应用。Java安全API数字签名的方法集中在java.security软件包中,在程序开始部分要引入该软件包(import java .security)。以下介绍密钥生成、数据签名及验证的步骤:
1. 被发送文件计算其摘要;
2. 发送方生成消息的消息摘要,用自己的私钥对消息摘要进行加密,形成发送方的数字签名;
3. 这个数字签名将作为消息的附件和消息一起发送给接受方;
4. 接受方首先从接收到的原始消息中用同样的算法计算出新的消息摘要,再用发送方的公钥对消息附件的数字签名进行解密,比较两个消息摘要,如果值相同,接受方就能够确定数字签名是发送方的。数字签名实现了验证完整性和非否认性。
在java中完成数字签名的类是Signature。只要生成Signature对象,通过initSign( )输入私钥,执行其方法update( ),就可以将原始数据传递给Signature对象,然后执行Sign( )方法,计算出消息验证码。
Java数字签名可以使用几种消息摘要和加密算法的组合。常用的有下列消息摘要算法:MD2(Message Digest Version 2)、MD5(Message Digest Version 5)和SHA1(Secure Hash Algorithm Version 1);公用密钥算法DSA(Digital Signature Algorithm )和RSA(Rivest,Shamir,Adleman Algorithm)。
消息摘要是单向散列函数的输出值,一个散列函数以一个变长的报文作为输人,产生一个定长的输出。消息摘要是报文所有比特的函数值,并有差错检测能力:报文中任意一比特或若干比特发生改变都将导致消息摘要发生改变。
目前比较重要的散列算法有MD5,SHA-1,R IPEMD-160,Java中封装了一个签名类java.security.Signature),它可以提供数字签名的操作。该类可以确定数字签名的算法,对一组数据用用户的私钥进行签名或用用户的公钥进行验签。如果需要对一组数据签名,则首先要确定签名的非对称密钥的算法和消息摘要的算法,才能用getInstance(String algorithm)方法实例化一个Signature对象。之后就可以根据是签名还是验签分别使用私钥或公钥初始化该Signature对象进行操作了。见参考文献[10]。
下面给出一个对指定文件实现RSA数字签名的例子的核心算法,见参考文献[11]。
package DigitalSigntures;
import java.io.*;
import java.security.*;
import java.security.interfaces.*;
public class Testexample {
public static void main(String args[])throws Exception
{
//读要签字的文件内容
FileInputStream in=new FileInputStream(“signdata.dat”);
//获得文件中的字节数
int num=in.available();
byte[] datab=new byte[num];
in.read(datab);
//转变为字符串显示
String msg=new String(datab);
System.out.println(“—要签名的原文—”);
System.out.println(msg);

//计算公私密钥,创建密钥生成器对象,加密算法为RSA
KeyPairGenerator keygen=KeyPairGenerator.getInstance(“RSA”);
//初始化生成器对象,RSA密钥长度为5012-2048
keygen.initialize(1024);
//生成密钥对
KeyPair kp=keygen.generateKeyPair();

//获得公钥
PublicKey pbk=kp.getPublic();

//获得私钥
PrivateKey pvk=kp.getPrivate();

//签名
//获得私钥,计算指数e和模数n
RSAPrivateKey rsapvk=(RSAPrivateKey)pvk;

//用MD5和RSA创建一个签名对象
Signature signer=Signature.getInstance(“MD5WithRSA”);
//初始化签名对象
signer.initSign(pvk);
//向签名对象输入要签名的原文
signer.update(datab);
//计算数字签名
byte[] signb=signer.sign();
//向屏幕输出签名

System.out.println(“—签名—”);
for(int i=0;i {
System.out.print(signb[i]+”,”);
if(i%8==7)
System.out.println();}

//保存签名
//签名保存到文件rsasigned.sig中
FileOutputStream out=new FileOutputStream(“rsasigned.sig”);
for(int i=0;i out.write(signb[i]);
out.close();

//验证签名
//获得公钥
RSAPublicKey rpbk=(RSAPublicKey)pbk;
byte[] kb=rpbk.getEncoded();

//建立文件rsapbkey.dat输出流,保存公钥
FileOutputStream inkb=new FileOutputStream(“rsapbk.dat”);
inkb.write(kb);
inkb.close();

//初始化验证签名
signer.initVerify(rpbk);
//传入要签名的数据
signer.update(datab);
boolean ok=false;

//传入签名
FileInputStream sin=new FileInputStream(“rsasigned.sig”);
int snum=sin.available();
byte[] signdatab=new byte[snum];
sin.read(signdatab);

//验证签名
ok=signer.verify(signdatab);
//显示验证结果
System.out.println(“签名验证结果:”+ok);
}
} 
更多描述见参考文献[12]、[13]。

第三章 软件设计

3.1 软件设计思路

本数字签名系统设计为两部分,即客户端和服务器端。采用客户端产生签名而服务器验证其签名的方式。签名算法采用RSA算法和MD5算法,直接使用Java安全API中封装的签名类(java.security.Signature),它可以提供数字签名的操作。该类可以确定数字签名的算法,对一组数据用用户的私钥进行签名或用用户的公钥进行验签。
客户端的设计的功能为:能够对任意指定文件进行数字签名,并保存签名公钥和签名,并发送给服务器等待对方验证。因此客户端设计了具有打开任意文件、对文件进行签名、保存签名与公钥、发送签名等功能按钮,设计了一个简单的客户端操作界面,并在上面添加以上功能按钮,即打开、签名、发送三个按钮,用来触发相应的事件。也即,打开时就载入要签名的文件,签名时就对打开的文件进行签字,发送时就连接指定IP地址和端口的服务器并将签名发送出去。
服务器端设计的功能为:能够处理多个来自客户端的连接请求,并将其发送过来的签名和公钥接收并保存下来,然后调用签名算法,打开签名文件和签字公钥验证其真实性,得出结论。为此,服务器端也设计了一个简单的操作界面,以实现以上功能。包括打打开公钥、打开签名、验证等功能按钮,执行导入公钥,导入签名,验证签名等操作。服务器设计为多线程服务器,每当有客户端连接进来时,就新建一个线程来处理该连接,保存发送过来的数据。
Winsock网络通信部分采用Java内部的套接字Socket来实现。即,在服务器端创建一个套接字ServerSocket,监听某指定端口,一旦有连接请求时就启动线程,处理该连接;在客户端也创建一个套接字Socket,当用户触发“发送”按钮时就向指定IP和端口PORT的服务器发送连接请求,一旦服务器响应就把文件发送过去。

3.2 系统框图
3.2.1 程序流程图

3.2.2程序模块图

3.3 系统详细设计

3.3.1 客户端程序
客户端界面效果如图 3-4 ,其详细的程序设计过程为:首先创建一个包package,将程序中建立的类class都包含进去,包命名为DigitalSignatures,然后在导入程序所需要用到的包和类,由于程序中需要编写用户界面,并在上面添加一些功能按钮,所以要导入java.awt.*,java.awt.event.*, javax.swing.*, javax.swing.event.*,javax.swing.filechooser.FileFilter这几个包;由于程序中涉及对输入输出流的操作,网络连接,系统时间的调用,所以要导入 java.io.*,java.net.*,java.util.*三个包;由于要对文件进行数字签名,所以要导入java.security.*,java.security.interfaces.*三个包。代码如下:
package DigitalSignatures;
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.filechooser.FileFilter;
import java.security.*;
import java.security.interfaces.*;
客户端程序分为1个主类public class ClientB和ClientB内部的3个子类class OpenFile,class SignFile, class SendFile。

图 3-4客户端界面
ClientB直接从JLabel类继承过来,功能是:编写用户界面,设置窗体布局,添加并监听功能按钮,详细代码见附录Ⅰ。
3子个类为:
1.class OpenFile监听按钮“打开”的动作,当按钮被触发时,就执行打开的动作,即弹出一个打开对话框,选择要签名的文件,最后返回该文件的路径。程序运行结果如图 3-5,详细的实现代码见附录Ⅰ。

图 3-5打开文件对话框
2.class SignFile监听按钮“签名”的动作,当按钮被触发时,就执行签名的动作,即载入“打开”里面返回的文件,然后初始化签名,设置签名的算法、密钥的长度,产生密钥对,利用私钥对选定的文件进行数字签名,然后在控制台输出签名,在当前工作目录下保存签名和公钥,签名保存为“myinfo.dat”,公钥保存为“mypubkey.dat”。签名的具体实现代码如下:
class SignFile implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
try
{
File file1=new File(fileName1);
//读要签字的文件内容
FileInputStream in=new FileInputStream(file1);
//获得文件中的字节数
int num=in.available();
byte[] myinfo=new byte[num];
in.read(myinfo);
System.out.println(“———初始化签名———”);
//计算公私密钥,创建密钥生成器对象,加密算法为RSA
KeyPairGenerator keygen=KeyPairGenerator.getInstance(“RSA”);
//初始化生成器对象,RSA密钥长度为5012-2048
keygen.initialize(1024);
//生成密钥对
KeyPair kp=keygen.generateKeyPair();
//获得公钥
PublicKey pbk=kp.getPublic();
//获得私钥
PrivateKey pvk=kp.getPrivate();
//获得公钥
RSAPublicKey rpbk=(RSAPublicKey)pbk;
byte[] kb=rpbk.getEncoded();
FileOutputStream out=new FileOutputStream(“mypubkey.dat”);
out.write(kb);
out.close();
//发送公钥
System.out.println(“发送公钥…”);
FileInputStream fis=new FileInputStream(“mypubkey.dat”);
client=new Socket(“192.168.0.99″,8088);
//创建网络输出流并提供数据包装器
OutputStream os=client.getOutputStream();
OutputStream spbk=new DataOutputStream(new BufferedOutputStream(os));
//创建文件读取缓冲区
byte[] bf=new byte[1024];
int Num=fis.read(bf);
while(Num!=(-1)) //是否读完文件
{
spbk.write(bf,0,Num);//把文件数据写出网络缓冲区
spbk.flush();//刷新缓冲区把数据写往客户端
Num=fis.read(bf);//继续从文件中读取数据
}
spbk.close();
os.close();
fis.close();
client.close();
//签名
//获得私钥,计算指数e和模数n
RSAPrivateKey rsapvk=(RSAPrivateKey)pvk;
//用MD5和RSA创建一个签名对象
Signature signer=Signature.getInstance(“MD5WithRSA”);
//初始化签名对象
signer.initSign(pvk);
//向签名对象输入要签名的原文
signer.update(myinfo);
//计算数字签名
byte[] signed=signer.sign();
//向屏幕输出签名
System.out.println(“签名结束!”);
System.out.println(“———显示签字———-”);
System.out.println();
for(int i=0;i {
System.out.print(signed[i]+”,”);
if(i%8==7)
System.out.println();
}
System.out.println(“—————————-”);
//保存签名
FileOutputStream fos=new FileOutputStream(“myinfo.dat”);
fos.write(myinfo);
fos.write(signed);
fos.close();
System.out.println(“保存签名结束!”);
}
catch(Exception ex){ System.out.println(ex);}
}
}
更多详细代码见附录Ⅰ。
3.class SendFile则监听按钮“发送”的动作,当按钮“发送”被触发时,就执行发送的动作,即创建 套接字Socket,连接服务器,一旦服务器响应就将签名“myinfo.dat”发送出去,等待对方接收。其详细的实现代码见附录Ⅰ。
最后是程序的主函数部分,主要功能就是设置客户端界面的标题,窗体的大小、位置等属性,在屏幕上输出一些欢迎信息和系统信息,如客户端与服务器进行通信的端口号、当前系统时间等等。其详细代码见附录Ⅰ。

3.3.2 服务器端程序
服务器的界面如图 3-6所示,其详细设软件计过程为:首先创建一个包package,将程序中建立的类class都包含进去,包命名为VerifySignatures,然后在导入程序所需要用到的包和类,由于程序中需要编写用户界面,并在上面添加一些功能按钮,所以要导入java.awt.*,java.awt.event.*, javax.swing.*, javax.swing.event.*,javax.swing.filechooser.FileFilter这几个包;由于程序中涉及对输入输出流的操作,网络连接,系统时间的调用,所以要导入 java.io.*,java.net.*,java.util.*三个包;由于要对文件进行数字签名的验证,所以要导入java.security.*;java.security.interfaces.*;java.security.KeyFactory;java.security.PublicKey;
java.security.spec.X509EncodedKeySpec这几个包。实现代码如下:
package VerifySignatures;
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.filechooser.FileFilter;
import java.security.*;
import java.security.interfaces.*;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.security.spec.* ;
服务器模块包括一个主类public class MultiThreadServer(),主类内部包括acceptConnections()模块,handleConnection()模块,ConnectionHandler()模块,class ServerInterface()模块;class ServerInterface()模块内部又包括打开公钥模块,打开签名模块,验证模块。

图 3-6服务器界面
1.MultiThreadServer()模块的作用是:程序初始化,定义程序所要用到的端口,设置服务器界面的标题和窗体属性,代码见附录Ⅱ。

2.acceptConnections()模块的作用是:创建ServerSocket,循环检测端口上是否有来自客户端的连接;若有,则启动handleConnection()模块。acceptConnections()模块的实现代码请参考附录Ⅱ。

3.handleConnection()模块模块的作用是::处理用户连接,当用户连接进来时,则启动线程ConnectionHandler(),实现代码见附录Ⅱ。

4.ConnectionHandler()模块的作用是:处理来自客户端的连接,运行run ()方法保存用户发送的数据,其相关代码请参考附录Ⅱ。

5.class ServerInterface()模块的作用是:设计服务器界面,添加各功能按钮。内部包括:打开公钥模块,打开签名模块,验证模块。
(1) 打开公钥模块的作用是:弹出打开对话框,选择打开客户端发送过来的公钥
“mykey.dat”,返回其路径。实现代码见附录Ⅱ。

(2) 打开签名模块的作用:弹出打开对话框,选择打开客户端传过来的签名文件“myinfo.dat”,返回签名的绝对路径。实现代码见附录Ⅱ。

(3) 验证模块的作用是:打开公钥和签名,初始化验证签名,选择验证签名的算法,验证客户端发送过来的签名,最后在屏幕显示验证结果。其实现代码如下:
class VerifySignature implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
try
{
//验证签名
System.out.println(“———-验证签名————”);
System.out.println(“Start signature verification!”);
//初始化验证签名
Signature signcheck=Signature.getInstance(“MD5WithRSA”);
//获得公钥
FileInputStream fis1=new FileInputStream(fileName1);
int len1=fis1.available();
byte[] rpbk=new byte[len1];
fis1.read(rpbk);
fis1.close();
String pubkeyvalue=new String(rpbk);
//这是GenerateKeyPair输出的公钥编码
X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(pubkeyvalue.getBytes());
KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);
PublicKey pubKey = keyFactory.generatePublic(bobPubKeySpec);
//初始化验证签名
signcheck.initVerify(pubKey);
//传入要签名的源数据
FileInputStream fis2=new FileInputStream(fileName2);
int len2=fis2.available();
byte[] datab=new byte[len2];
fis2.read(datab);
String myinfo=new String(datab);
fis2.close();
signcheck.update(myinfo.getBytes());
//读入签名
FileInputStream fis3=new FileInputStream(fileName2);
int len3=fis3.available();
byte[] signed=new byte[len3];
fis3.read(signed);
fis3.close();
System.out.println(“——–签名结果————–”);
if(signcheck.verify(signed))
{
System.out.println(“签名正常!”);
}
else
{
System.out.println(“签名不正常!”);
}
}
catch(Exception ex)
{System.out.println(ex);}
} }
更多详细代码见附录Ⅱ。
6.main()函数部分的作用是:设置服务器端口号,输出欢迎词和系统信息,如当前系统时间、服务器端口等,启动服务器程序。详细代码见附录Ⅱ。

3.3.3 利用Sokcet实现Winsock通信

1.Socket的定义
所谓socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。
Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。在Java中,有专门的Socket类来处理用户的请求和响应。利用Socket类的方法,就可以实现两台计算机之间的通讯。这里就介绍一下在Java中如何利用Socket进行网络编程。
在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。
以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。Socket类包含了许多有用的方法。比如getLocalAddress()将返回一个包含客户程序IP地址的InetAddress子类对象的引用;getLocalPort()将返回客户程序的端口号;getInetAddress()将返回一个包含服务器IP地址的InetAddress子类对象的引用;getPort()将返回服务程序的端口号。
对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
重要的Socket API:
java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。
.Accept方法用于产生”阻塞”,直到接受到一个连接,并且返回一个客户端的Socket对象实例。”阻塞”是一个术语,它使程序运行暂时”停留”在这个地方,直到一个会话产生,然后程序继续;通常”阻塞”是由循环产生的。
.getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例,。
. getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。
注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

2.用Socket实现Winsock通信
实现原理:服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
下面介绍如何利用Socket来编写网络通信服务器和客户端程序,实现Winsock通信:
(1).建立服务器类
 Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。
ServerSocket server = new ServerSocket(8088);
这条语句创建了一个服务器对象,这个服务器使用8088号端口。当一个客户端程序建立一个Socket连接,所连接的端口号为8088时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。
Socket incomingConnection = server.accept();
InputStream is= incomingConnection.getInputStream();
OutputStream os=incomingConnection.getOutputStream();
随后,就可以使用is.read ()方法从网络中读取客户端发送的文件或os.write()方法向可户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。在所有通讯结束以后应该关闭两个数据流,关闭的顺序是先关闭输出流,再关闭输入流,即使用语句:
os.close();
is.close();
服务器端的Socket接口程序的Java实现方法,其过程如下所述:
1.首先调用ServerSocket类以某个端口号为参数,创建一个ServerSocket对象,即是服务器端的服务程序在该指定端口监听的Socket。
2.服务器端程序使用ServerSocket对象的accept()方法,接收来自客户机程序的连接请求,此时服务器端将一直保持停滞状态,直到收到客户端发来的连接请求,此时该方法将返回一个新建的Socket类的实例,代表和客户机建立的通讯链路在服务程序内的通讯端点。如果采用Java的多线程编程方法,可以实现并发服务器,继续监听来自其他客户的连接请求。
3.使用新建的Socket对象创建输入、输出流对象。
4.使用流对象的方法完成和客户端的数据传输,按约定协议识别并处理来自客户端的请求数据,并把处理的结果返回给客户端。
5.客户端工作完毕后,则服务器端程序关闭和客户端通讯的流和通讯的Socket。
6.在服务器程序运行结束之前,应当关闭用来监听的Socket.
关于服务器的详细代码请参考附录Ⅱ的MultiThreadServer.java文件。
(2).建立客户端代码
 相比服务器端,客户端要简单一些,客户端只需用服务器所在机器的IP以及服务器的端口Port作为参数创建一个Socket对象。得到这个对象后,就可以用”建立服务器”部分介绍的方法实现数据的输入和输出。
当客户程序需要与服务器程序通讯的时候,客户程序在客户机创建一个socket对象,Socket类有几个构造函数。两个常用的构造函数是 Socket(InetAddress addr, int port) 和 Socket(String host, int port),两个构造函数都创建了一个基于Socket的连接服务器端流套接字的流套接字。对于第一个InetAddress子类对象通过addr参数获得服务器主机的IP地址,对于第二个函数host参数包被分配到InetAddress对象中,如果没有IP地址与host参数相一致,那么将抛出UnknownHostException异常对象。两个函数都通过参数port获得服务器的端口号。假设已经建立连接了,网络API将在客户端基于Socket的流套接字中捆绑客户程序的IP地址和任意一个端口号,否则两个函数都会抛出一个IOException对象。
如果创建了一个Socket对象,那么它可能通过调用Socket的 getInputStream()方法从服务程序获得输入流读传送来的信息,也可能通过调用Socket的 getOutputStream()方法获得输出流来发送消息。在读写活动完成之后,客户程序调用close()方法关闭流和流套接字,下面的代码创建了一个服务程序主机地址为198.168.0.99,端口号为8088的Socket对象,然后从这个新创建的Socket对象中读取输入流,然后再关闭流和Socket对象。
Socket s = new Socket (“198.168.0.99″, 8088);
InputStream is = s.getInputStream ();
is.close ();
s.close ();
客户端程序编写的流程:
1.首先调用Socket类的构造函数,以服务器的指定的IP地址或指定的主机名和指定的端口号为参数,创建一个Socket流,在创建Socket流的过程中包含了向服务器请求建立通讯连接的过程实现。
2.建立了客户端通讯Socket后。就可以使用Socket的方法getInputStream()和getOutputStream()来创建输入/输出流。这样,使用Socket类后,网络输入输出也转化为使用流对象的过程。
3.使用输入输出流对象的相应方法读写字节流数据,因为流连接着通讯所用的Socket,Socket又是和服务器端建立连接的一个端点,因此数据将通过连接从服务器得到或发向服务器。这时我们就可以对字节流数据按客户端和服务器之间的协议进行处理,完成双方的通讯任务。
4.待通讯任务完毕后,我们用流对象的close()方法来关闭用于网络通讯的输入输出流,在用Socket对象的close()方法来关闭Socket。
以上的程序代码建立了一个Socket对象,这个对象连接到IP地址为192.168.0.99的主机上、端口为8088的服务器对象。并且建立了输入流和输出流,分别对应服务器的输出和客户端的写入。
经过以上步骤,就可以建立一个简单的网络通信程序。客户端和服务器端Socket通信的工作模式可以用图 3-7来说明:

图 3-7 客户端和服务器端Socket通信的工作模式

第四章 软件测试与分析改进

4.1 系统整体功能测试

程序设计的最后是对软件的个部分功能进行功能测试,以测试软件的性能并找出软件的不足和缺点,提出改进措施和意见。测试过程如下:
在局域网内选择两台可以正常上网和运行的计算机A和B,计算机A作为服务器,计算机B作为客户端。在两台计算机上分别安装J2SDK 1.5.0或更高版本和JCreator等软件工具,然后运行JCreator,首先在计算机A的JCreator里选择打开服务器文件“MultiThreadServer.java”,然后编译,显示没有错误后,运行服务器程序,屏幕出现一些系统提示信息,并弹出一个服务器界面,服务器此时监听端口上的连接;计算机B在 JCreator里选择打开客户端文件“ClientB.java”,然后编译,显示没有错误后,运行客户端程序,在屏幕上会显示一些设定的系统提示信息,并弹出客户端界面,按提示进行操作,点击“打开”按钮,选择需要签名的文件,这里选择“C:\Documents and Settings\Administrator\桌面\调试DigitalSignature.txt”做为例子;然后点击“签名”按钮,对选定的文件进行数字签名,屏幕显示出签名结果,并在当前工作目录下保存公钥为“mypubkey.dat”文件,同时向服务器发送签名产生的公钥,签名保存为“myinfo.dat”。此时,点击“发送”按钮,将签名“myinfo.dat”发送到服务器。
回到服务器端,首先,当客户端的公钥发送过来时,弹出保存对话框,此时接收文件,选择路径将文件保存到本地硬盘上,命名文件为“mypubkey.dat”,然后依次接收并保存签名文件,命名为“myinfo.dat”,然后点击服务器界面上的“打开公钥”按钮,打开公钥;接着点击“打开签名”按钮,打开签名文件;最后点击“验证”按钮,验证签名的真实性,屏幕显示验证结果“签名正常!” 。
结论:该数字签名系统基本实现了课题目标,即:能够对选定文件运用RSA、MD5算法进行数字签名,并在因特网上传输,实现Winsock通信,然后验证签名的目标。

4.2 客户端功能测试
客户端的基本功能是:打开任意指定的文件,对选定的文件进行数字签名,保存签名和公钥,连接服务器,向服务器发送请求,发送文件。因此,可以从这几个方面进行测试。
首先,打开“ClientB.java”文件,在JCreator里面编译,通过后点击运行(同时在另外一台计算机上运行服务器程序“MultiThreadServer.java”),客户端界面如图 3-4,屏幕出现如下信息,如图 4-1:

图 4-1客户端欢迎词
然后点击“打开”按钮,弹出打开对话框,如图 3-5。选择需要进行数字签名的文件,这里选择“C:\Documents and Settings\Administrator\桌面\调试DigitalSignature.txt”作为测试文件;然后点击“签名”按钮,对文件“DigitalSignature.txt”进行数字签名,屏幕显示出签名结果,保存公钥和签名,同时连接服务器,向服务器发送公钥“mypubkey.dat”,运行结果如图 4-2:

图 4-2对文件进行数字签名
签名并保存签名和公钥结束后,点击“发送”按钮,向服务器发送签名“myinfo.dat”,最后等待服务器接收签名并验证,程序运行到这里,客户端任务基本结束。运行结果如下图 4-3:

图 4-3连接服务器
结论:通过以上测试,我们可以发现,该数字签名系统的客户端程序具备课题要求的基本功能,即:打开任意指定的文件,对选定的文件进行数字签名,保存签名和公钥,连接服务器,向服务器发送请求,发送文件,实现Winsock通信。因此,该程序基本达到了课题目标。

4.3 服务器端功能测试

服务器的基本功能是:能够循环检测来自客户端的连接请求,接收它们发送过来的公钥和签名,打开公钥,打开签名,对签名进行验证,显示验证结果。因此,可以从这几个方面进行测试。
首先,在打开服务器程序“MultiThreadServer.java”文件,用JCreator对其进行编译,编译无误后,则运行程序(同时在另一台计算机上运行客户端程序,并完成相应操作),此时,屏幕显示如下信息,如图 4-4:

图 4-4服务器欢迎词
显示了当前系统时间、服务器端口等信息。服务器操作界面如图 3-6。此时,服务器监听服务器端口是否有数据连接,若有则回弹出一个保存对话框,提示保存文件,如图 4-5:

图 4-5保存对话框
保存用户发送过来的文件,首先发送的是公钥,将文件保存为“mykey.dat” ;然后发送过来的是签名,将其保存为“myinfo.dat”,程序的过程如图 4-6:

图 4-6接收数据
到此,该客户端与服务器端的通信基本结束,下面进入验证过程:点击界面上的“打开公钥”按钮,弹出打开对话框,选择打开公钥文件 “mykey.dat”;然后点击按钮“打开签名”按钮,选择签名文件“myinfo.dat”;接着点击“验证”按钮,对数字签名进行验证,屏幕显示验证结果“签名正常!”,程序运行结果如图 4-7:

图 4-7验证签名
结论:通过以上的测试,我们可以发现,该数字签名系统的服务器端程序基本实现了课题要求的基本功能,即:检测来自客户端的连接请求,接收它们发送过来的公钥和签名,打开签名公钥,打开签名,对签名进行验证,显示验证结果。成功实现了数字签名验证并进行Winsock通信的课题目标。
4.4 软件性能整体分析与改进

通过以上对客户端和服务器端程序的性能测试,我们可做如下分析,并给出相应的改进措施:
1.客户端有待改进的地方
通过测试发现,其性能基本满足课题的要求,即能对选定文件进行数字签名,保存签名和公钥,向服务器发送文件,但仍然存在很多不足之处。不足之处具体体现在:
(1)客户端界面设计的比较简单、粗糙,不够美观,程序运行结果必须依赖于命令提示符的屏幕来显示。
(2)不能与服务器进行即时信息通信,向服务器发送消息或接收服务器发送过来的消息,与服务器进行交流。
(3)当客户端向服务器发送文件时,服务器无法获知发送过来的什么文件,不能显示文件的文件名、大小、位置的相关属性信息,只能按约定先发送公钥再发送签名。
改进措施:
(1) 设计更为精美、大方、人性化的人机操作界面,尽量使更多的系统信息能够脱离命令提示符在界面上显示,提示用户。
(2) 设计一个独立的即时通信模块,用来与服务器之间发送消息,让客户端用户能够及时了解服务器端的验证结果信息。
(3) 改进文件发送模块,使得在服务器发送文件时能够同时告知对方文件的基本信息。
2.服务器端有待改进的地方
通过测试发现,服务器端程序基本满足课题要求,即能够检测并处理多个客户端的连接,接收其发送过来的文件,利用对方发送的签名、原文和公钥验证签名的真实性,得出验证结论。但仍然存在不足之处,具体体现在以下几个方面:
(1) 服务器操作界面比较简单、粗糙,不够美观;
(2) 不能与客户端进行即时信息通信,向客户端发送消息或接收客户端发送过来的消息,与客户端进行交流。
(3) 保存客户端发送过来的文件时无法获知文件信息,不知道文件的文件名、大小、后缀名等相关信息。
(4) 当有多个用户同时连接时必须排队,只有当服务器处理完第一个连接时才会处理下一个客户连接。等待处理的线程将占用大量的系统开销。
(5) 不能将验证结果返回客户端。
改进措施:
(1) 设计更为美观、大方和人性化的人机操作界面,尽量使系统信息能够脱离控制台在操作界面上显示,提示用户。
(2) 设计一个与客户端相对应的即时通信模块,用来与客户端之间发送信息。
(3) 改进保存文件模块,使其能够获取下载文件的文件信息。
(4) 我们可以通过创建带有连接池的Socket服务器来解决该问题,通过维护一个进入的连接池,一定数量的ConnectionHandler将为连接提供服务。在服务器端,在服务器启动时启动时创建一定数量的ConnectionHandler,我们把进入的连接放入“池”中并让ConnectionHandler处理剩下的事情,该措施的好处是:可以限定了允许同时连接的数目;只需启动ConnectionHandler Thread一次,避免了不必要的系统开销。
(5) 改进程序,使得当验证结束时,向客户端返回一个结果,告知对方。

第五章 总结
本文完成了以下工作:
(1).调查了国内外数字签名技术的发展现状,并根据现有条件设计了一套具体实现数字签名系统的方案;
(2).详细介绍了数字签名技术的基本原理和基本算法及其功能应用,并给出了其在Java环境中的一种实现方法。
(3).设计了一套数字签名系统,详细说明了该数字签名系统的设计思路,软件详细设计过程,各部分功能的具体编码实现以及软件的流程图和模块图。
(4).对该数字签名系统各部分功能进行了性能测试,并提出改进措施。
通过本次毕业设计,我掌握了数字签名的基本原理和实现方法,对数字签名技术及其应用有了更为深刻的认识,并具体编码实现了一套数字签名系统。
尽管数字签名技术还不够完善,如签名后的文件可能被接收者重复使用,公开密钥加密算法的效率相当低,不易用于长文件的加密等,但随着Internet的快速发展及其算法的不断改进和完善,其应用领域会日益广泛,有着广阔的发展前景。

参考文献

[1]赖溪松,韩亮,张真诚著;张玉清,肖国镇改编.计算机密码学及其应用.
北京:国防工业出版社.2001.7. 38-138
[2]冯登国.国内外密码学研究现状及发展趋势.通信学报,2002,23(5). 18-26.
[3]What is a Digital Signature 

http://www.youdzone.com/signature.html.

[4] R. Rivest,A. Shamir and L. Adleman;A Method for Obtaining Digital Signatures and Public-Key Cryptosystems;Communications of the ACM. February 1978.
[5] 数字签名在电子商务领域的应用.

http://zhidao.baidu.com/question/7257470.html?fr=qrl3

[6]数字签名算法分析与Hash签名.

http://www.qqread.com/sys-soft/u197706.html

[7]MD5_百度百科.http://baike.baidu.com/view/7636.htm
[8] The MD5 Message-Digest Algorithm .

http://www.ietf.org/rfc/rfc1321.txt.

[9]JAVA加密和数字签名编程快速入门.

http://www.yesky.com/253/1911753.shtml

[10]如何在JAVA中编程实现数字签名系统.

http://www.chinaitlab.com/www/news/article_show.asp?id=20818

[11]殷兆麟,张永平,姜淑娟. JAVA网络高级编程.北京:清华大学出版社,北京交通大学出版社,2005.327-333.
[12] 顾婷婷,李涛. RSA算法和RSA数字签名算法的实现. 成都:四川大学计算机系(西区) 610065.2006.
[13] 刘泉,吴涛.基于Java的数字签名研究与实现.武汉理工大学学报(信息与管理工程版),2004.2.26(1).

附录
附录Ⅰ

具有消息编辑与Harn签名的网络通信软件

Posted by 天际的荒草 | Posted in Docs | 文档 | Posted on 19-09-2009

标签:, , ,

0

目 录
内容摘要 I
ABSTRACT II
第一章 绪论 1
1.1数字签名的研究背景及意义 1
1.2 国内外的研究现状 1
1.3设计的目标 3
第二章 数字签名相关技术的介绍 4
2.1密码技术 4
2.2 数字证书 5
2.3单向散列函数 5
2.4数字签名 6
第三章 Winsock通信软件的实现 8
3.1 winsock通信的原理 8
3.2 winsock规范 9
3.3 C/S模型中Winsock实现通信的过程 10
3.4 Winsock通信编程实现 12
第四章 Harn签名的实现 14
4.1 Harn签名原理 14
4.2 签名参数的设置 14
4.3 签名过程及验证 16
4.3.1 签名 17
4.3.2 签名验证 18
第五章 系统介绍及分析 20
5.1 系统功能介绍 20
5.1.1 私钥管理 20
5.1.2 公钥管理 21
5.2 系统演示 22
5.3 系统综合分析 25
第六章 总结 27
结束语 28
参考文献 29

内容摘要
数字签名是现代密码学主要研究的内容之一。数字签名技术在身份识别和认证、数据完整性、抗抵赖等方面具有其它技术所无法替代的作用,它在电子商务和电子政务等领域有着极广泛的应用。
文中首先介绍了数字签名的研究目的及意义和国内外研究现状。然后详细的介绍了数字签名的相关技术,接着讲述了WINSOCK通信的实现和Harn签名的实现,最后本文介绍了系统的部分功能以及对系统进行了综合分析。
本文实现了一个具有消息编辑与Harn签名的网络通信系统,该系统提供了消息的保密性、认证身份、完整性和不可否认性。

关键词:数字签名,Harn签名,WINSOCK,通信

ABSTRACT
The digital signature is one of main researches in modern cryptography, and it cannot be substituted by other techniques in information security, including authentication, data integrity, and non-repudiation. Digital signatures have many applications in E-commerce and E-government, etc.
Firstly, the paper introduced goal and significance of Digital Signature research and the domestic and foreign research present situation. Then in detail introduced the digital signature related technology,and narrated the realization of Winsock Communication and Harn Signature. At last, the paper introduced the partial functions and Carried on synthesizing analysis to the system.
This paper has realized network communications system with News edition and Harn Signature. The system provided the secrecy, the authentication of status, the integrity and unabled denial.

Keywords: Digital Signature,Harn Signature,Winsock Communication

第一章 绪论
1.1 数字签名的研究背景及意义
我们知道,一般的书信或者文件等纸质文档是根据亲笔签名或印章来证明其真实性的。当今社会,电子文档将逐步代替纸质的文件成为信息交流的主体。证明某一个电子文件是某作者所作的有效办法是模拟普通的手写签名在电子文档上进行电子签名,即在电子化文件中添加可以标记自己的一段特征数据来实现签名。作者可以通过数字签名表明目己的身份,读者可以通过数字签名验证作者的身份。
电子邮件是互联网上最重要的应用之一,传统的电子邮件都是明文传输,并且发送方可以轻松地伪造自己的身份。随着电子邮件的应用扩展到各种信息敏感领域,如:政府间来往、商业谈判等,电子邮件的内容保密和发送方身份确认的重要性便逐步凸现出来。数字签名能很好地解决电子邮件的身份确认问题。
电子商务是互联网上发展最快的应用方向,它是借助于互联网的快速信息传输能力来完成各种商务活动,包括电子数据交换、在线交易系统、网上银行、商业增值网等。互联网是一个开放的空问,任何人都可以进入,而重要的商务信息具有敏感性和保密性,所以通常的商务信息在传输中要进行加密,同时,为了进一步防止欺骗性的篡改,数字签名是必不可少的。电子商务活动中的电子订单、电子帐单、电子收据、电子合同等电子文档都需要作数字签名以确保真实性。
网页数据是互联网上传输量最大的数据,网页已成为发布新闻、广告、招标、招聘等各种信息的重要媒体,己经开始对社会、经济、生活产生出一定的影响。这些信息来源的可靠性对相关人员来说极为重要。
随着数字化时代的到来,作为一种重要且有效的信息安全技术——数字签名将应用到社会的各个领域。

1.2 国内外的研究现状
数字签名是由Diffie和Hellman在他们的著名的论文“New Direction in Cryptography” 中第一次提出来的。基于公钥密码体制和私钥密码体制都可以获得数字签名,目前主要是基于公钥密码体制的数字签名。
自从1976年公钥密码的思想提出以来,国际上已经提出了许多种公钥密码体制,但比较流行的主要有两类:一类是基于大整数因子分解问题的,其中最典型的代表是RSA;另一类是基于离散对数问题的,比如ElGamal公钥密码和影响比较大的椭圆曲线公钥密码。由于分解大整数的能力日益增强,所以对RSA的安全带来了一定的威胁。目前768比特模长的RSA已不安全。一般建议使用1024比特模长,预计要保证20年的安全就要选择1280比特的模长,增大模长带来了实现上的难度。而基于离散对数问题的公钥密码在目前技术下512比特模长就能够保证其安全性。特别是椭圆曲线上的离散对数的计算要比有限域上的离散对数的计算更困难,目前技术下只需要160比特模长即可,适合于智能卡的实现,因而受到国内外学者的广泛关注。国际上制定了椭圆曲线公钥密码标准IEEEP1363,RSA等一些公司声称他们已开发出了符合该标准的椭圆曲线公钥密码。我国学者也提出了一些公钥密码,另外在公钥密码的快速实现方面也做了一定的工作,比如在RSA的快速实现和椭圆曲线公钥密码的快速实现方面都有所突破。公钥密码的快速实现是当前公钥密码研究中的一个热点,包括算法优化和程序优化。另一个人们所关注的问题是椭圆曲线公钥密码的安全性论证问题。
公钥密码主要用于数字签名和密钥分配。当然,数字签名和密钥分配都有自己的研究体系,形成了各自的理论框架。目前数字签名的研究内容非常丰富,包括普通签名和特殊签名。特殊签名有盲签名,代理签名,群签名,不可否认签名,公平盲签名,门限签名,具有消息恢复功能的签名等,它与具体应用环境密切相关。显然,数字签名的应用涉及到法律问题,美国联邦政府基于有限域上的离散对数问题制定了自己的数字签名标准(DSS),部分州已制定了数字签名法。法国是第一个制定数字签名法的国家,其他国家也正在实施之中。在密钥管理方面,国际上都有一些大的举动,比如1993年美国提出的密钥托管理论和技术、国际标准化组织制定的X.509标准 (已经发展到第3版本)以及麻省里工学院开发的Kerboros协议(已经发展到第5版本)等,这些工作影响很大。我国学者在这些方面也做了一些跟踪研究,发表了很多论文,按照X.509标准实现了一些CA。但没有听说过哪个部门有制定数字签名法的意向。目前人们关注的是数字签名和密钥分配的具体应用以及潜信道的深入研究。
目前最为人们所关注的实用密码技术是PKI技术。国外的PKI应用已经开始,开发PKI的厂商也有多家。许多厂家,如Baltimore,Entrust等推出了可以应用的PKI产品,有些公司如VerySign等已经开始提供PKI服务。网络许多应用正在使用PKI技术来保证网络的认证、不可否认、加解密和密钥管理等。尽管如此,总的说来PKI技术仍在发展中。按照国外一些调查公司的说法,PKI系统仅仅还是在做示范工程。IDC公司的Internet安全知深分析家认为:PKI技术将成为所有应用的计算基础结构的核心部件,包括那些越出传统网络界限的应用。B2B电子商务活动需要的认证、不可否认等只有PKI产品才有能力提供这些功能。
“数字签名技术和PKI(公钥基础设施)将在未来10年内得到广泛的应用,它将带来卡应用方面的一场技术革命。”2002年10月,国际知名智能卡公司德国捷德公司董事局主席毕伟力作出这样的判断。当时,数字签名技术和PKI已开始被应用到中国工商银行等一批银行的网上银行项目中。
数字签名卡的功能一般是在PKI的框架基础上实现的。PKI一词被解释成为是一种框广告招租架体系,通过它,互联网上的用户可实现安全信息数据的交换,满足商务对保密性、完整性、真实性及不可否认性的安全需求,其构成主要包括硬件、软件、人员、指导原则及方法。
这项技术已经广泛地应用在智能卡领域。在“2002年中国国际金融技术设备展”上,德国捷德公司展出了他们根据PKI技术和数字签名技术开发的数字签名卡,这种卡可以实现在卡内生成密钥对,进行加解密运算,并安全存放数字证书等多种功能,“此产品可以满足客户对卡片多功能性的需求”。
现在数字签名应用的比较广泛,Harn签名也派生出了许多类,有一种Harn-k密码体制被用来保障移动Agent系统通信的安全 。在1996年祁明﹑ 肖国镇提出了一种基于Harn数字签名的远距离通行字认证方案 。还有施荣华教授也在2001年提出了一种基于Harn数字签名的双向认证访问控制方案 ,在该方案中,用户与系统不必暴露秘密信息就可以进行双向认证,并且用户和系统的共享密钥可用于认证用户访问保密信息体的请求的合法权限。该方案与已有访问控制方案相比要更加安全。该方案能够执行像改变存取权限和插入/删除用户或信息体这样的访问操作,而不影响任何用户的保密密钥,不需重建信息保护系统。

1.3 设计的目标
本次设计的课题是:具有消息编辑与Harn签名的网络通信软件,首先我们要实现的是消息编辑,并通过 Harn算法对消息进行签名,实现Winsock通信。到达接收端后进行身份验证,完成通信。以下是软件的构成顺序也是基本的功能:
(1)HARN参数设置
(2)消息编辑
(3)消息HARN签名
(4)WINSOCK通信
(5)验证
该设计目的在于:了解国内外在网络与信息安全方面的发展以及现状。特别是各国对密码学方面以及数字签名方面的研究。让自己能够进一步的了解数字签名等相关密码技术以及网络通信技术,进一步巩固vc++编程以及Winsock通信。当然在设计的同时了解当今国内外有关数字签名以及网络通信的发展前景。

第二章 数字签名相关技术的介绍
2.1密码技术
信息安全技术 是一门综合性学科,它涉及信息论、计算机科学和密码学等多方面知识,它的主要任务是研究计算机系统和通信网络内信息的保护方法以实现系统内信息的安全、保密、真实和完整。其中,信息安全的核心是密码技术。  
随着计算机网络不断渗透到各个领域,密码学的应用也随之扩大。数字签名、身份鉴别等都是由密码学派生出来的新技术和应用。
在计算机上实现的数据加密,其加密或解密变换是由密钥控制实现的。密钥(Keyword)是用户按照一种密码体制随机选取,它通常是一随机字符串,是控制明文和密文变换的唯一参数。
根据密钥类型不同将现代密码技术分为两类:一类是对称加密(秘密钥匙加密)系统,另一类是公开密钥加密(非对称加密)系统。  
对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。  
对称密码系统的安全性依赖于以下两个因素。第一,加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的;第二,加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性,而需要保证密钥的秘密性。对称加密系统的算法实现速度极快,从高级加密标准(AES)候选算法的测试结果看,软件实现的速度都达到了每秒数兆或数十兆比特。对称密码系统的这些特点使其有着广泛的应用。因为算法不需要保密,所以制造商可以开发出低成本的芯片以实现数据加密。这些芯片有着广泛的应用,适合于大规模生产。  
对称加密系统 最大的问题是密钥的分发和管理非常复杂、代价高昂。比如对于具有n个用户的网络,需要n(n-1)/2个密钥,在用户群不是很大的情况下,对称加密系统是有效的。但是对于大型网络,当用户群很大,分布很广时,密钥的分配和保存就成了大问题。对称加密算法另一个缺点是不能实现数字签名 。
公开密钥加密系统采用的加密钥匙(公钥)和解密钥匙(私钥)是不同的。由于加密钥匙是公开的,密钥的分配和管理就很简单,比如对于具有n个用户的网络,仅需要2n个密钥。公开密钥加密系统还能够很容易地实现数字签名。因此,最适合于电子商务应用需要。在实际应用中,公开密钥加密系统并没有完全取代对称密钥加密系统,这是因为公开密钥加密系统是基于尖端的数学难题,计算非常复杂,它的安全性更高,但它实现速度却远赶不上对称密钥加密系统。在实际应用中可利用二者的各自优点,采用对称加密系统加密文件,采用公开密钥加密系统加密“加密文件”的密钥(会话密钥),这就是混合加密系统,它较好地解决了运算速度问题和密钥分配管理问题。因此,公钥密码体制通常被用来加密关键性的、核心的机密数据,而对称密码体制通常被用来加密大量的数据。
2.2 数字证书
数字证书是驾驶执照、护照及会员卡等类似证件的电子对应物。您可以通过出示电子数字证书等来证明您的身份或访问在线信息或使用服务的权力。数字证书将身份绑定到一对可以用来加密和签名数字信息的电子密钥。数字证书能够验证一个人使用给定密钥的权利。这有助于防止有人利用假密钥冒充其他用户。数字证书与加密一起使用,可以提供一个更加完整的解决方案,确保交易中各方的身份。
数字证书 通常简称为证书,它包括一个公开密钥、拥有对应私有密钥的实体身份以及证书管理机构CA(Certification Authority)对这些内容的数字签名。
CA的签名可以确保证书内容的完整性和真实性。证书的格式一般遵循国际电信同盟ITU(International Telecommunications Union) 制订的 X.509标准,其具体字段及说明如下表 2.1:
表2.1 X.509数字证书字段名及说明
Version 版本号
Serial number 证书唯一序列号
Signature algorithm ID 签名使用算法
Issuer name CA名
Validity period 证书生效日期和失效日期
Subject(user) name 持证人姓名
Subject public key information 持证人公开密钥信息
Issuer unique identifier CA唯一标识(仅在v2、v3中)
Subject unique identifier 持证人唯一标识(仅在v2、v3中)
Extensions 扩充内容(仅在v3中)
Signature on the above field CA对证书的签名

采用数字证书能够实现以下两点:
(1)保证信息是由签名者自己签发的,签名者不能否认或难以否认。
(2)保证信息自签发后到收到为止未曾做过任何修改,签发的信息是真实信息。
2.3 单向散列函数
密码学中使用的单向散列函数将任意长度的消息压缩到某一固定长度的消息摘要。单向散列函数又称为单向Hash函数,它不是加密算法,却在密码学中有着广泛的应用,与各种加密算法有着密切的关系。它的模型为:h=H(m),其中,m是待处理的明文,可以为任意长度;H是单向散列函数,h是生成的报文摘要,它具有固定的长度,并且和M的长度无关。其中H具有以下的单向性质:
(1)给定H和m,很容易计算h;
(2)给定h和H,很难计算m,甚至得不到m的任何消息;
(3)给定H,要找两个不同的 和 ,使得 = 在计算上是不可行的。
根据单向散列函数的安全水平,可以将单向散列函数分成两类:强碰撞自由的单向散列函数和弱碰撞自由的单向散列函数 。上面描述的是强碰撞自由的单向散列函数的性质。如果将第(3)条改为:给定h和一个已知的消息M,找另外一个不同的消息 ,使得h(m)= 在计算上是不可行的,就叫做弱碰撞自由的单向散列函数。
显然强碰撞自由的单向散列函数比弱碰撞自由的单向散列函数安全性要高。因为弱碰撞自由的单向散列函数随着重复使用次数的增加安全性逐渐降低,强碰撞自由的单向散列函数则不会因其重复使用而降低安全性。因此在实际中要求使用强碰撞自由的单向散列函数。除此之外,在实际应用中还要求单向散列函数具有如下特点:
(1)单向散列函数能够处理任意长度的明文(至少是在实际应用中可能碰到的长度的明文),其生成的消息摘要数据块长度具有固定的大小,而且,对同一个消息反复执行该函数总是得到相同的信息摘要。
(2)单向散列函数生成的信息摘要是不可预见的,消息摘要看起来和原始的数据没有任何的关系。而且,原始数据的任何微小变化都会对生成的信息摘要产生很大的影响。
(3)具有不可逆性,即通过生成的报文摘要得到原始数据的任何信息在计算上是完全不可行的。单向散列函数在密码学中有着非常广泛的应用,它被广泛地应用于数字签名、消息的完整性鉴别、消息的起源认证等,另外也和各种密码算法一起构成混合密码系统。
2.4 数字签名
数字签名是指附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据或变换能使数据单元的接收者确认数据单元的来源和数据的完整性,并保护数据,防止被人(如接收者)进行伪造。签名机制的本质特征是该签名只有通过签名者的私有信息才能产生,也就是说,一个签名者的签名只能唯一地由他自己产生。当收发双方发生争议时,第三方(仲裁机构)就能够根据消息上的数字签名来裁定这条消息是否确实由发送方发出,从而实现抵赖性安全服务。
数字签名是认证技术中的一种,数字签名可以用来进行下列认证:
(1)实体认证 在报文通信之前,采用可鉴别协议来认证通信是否在议定的通信实体之间进行。
(2)报文认证 经实体认证后,双方通信实体便可进行报文通信。为了保证数据的真实性,应对报文进行认证,即接收实体应能验证报文的来源、时间性与目的地的真实性。通常也采用数字签名等技术来实现。
(3)身份认证 用户的身份认证是许多应用系统的第一道防线,目的是防止数据被非法用户访问。除了口令控制之外,在身份认证环节采用数字签名技术无疑大大提高了访问控制的力度。
数字签名通过单向散列(HASH)函数对要传送的消息m进行处理得到消息摘要(Message Digest) H(m),然后使用消息发送者的私有密钥D对摘要加密得到签名D(H(m))。
数字签名中的HASH函数是一类特殊的散列函数,具有以下特点:
(1)对接受的输入消息数据没有长度限制。
(2)对输入任何长度的消息数据能够生成固定长度的消息摘要H(m)。
(3)易于计算,对于给定的任何消息M将能够快速地得出H(m)。
(4)单向函数,即给出一HASH值h,难以计算出一特定输入m,使得h=H(m)。
(5)免冲突,又可分为弱免冲突和强免冲突两种。弱免冲突指给出一消息 ,找出一消息 与 相似且 = 是计算不可行的,而强免冲突指找出任意两条消息 、 使 = 也是计算不可行的。
满足上述条件的HASH函数作用于一长文档上时,可以产生该文档的一个“数字指纹”(Digital Fingerprint),可以用这个结果来判断该文档没有被修改过。统计表明,如果消息摘要长度为128位时,则任意两个消息 、 具有完全相同摘要的概率为10的负24次方,即近于零的重复概率。如果取H(m)为384位或512位时,重复概率则更小。我们知道,如果消息 与 相同,则有 = ,改变 或 中的任意一位,其结果将导致 与 中有一半左右对应位的值都不相同。通过数字签名的发散特性就可以很容易地发现消息是否被篡改。
数字签名提供了一种安全的保障数据完整性和真实性的机制,可以检验数据从数据源到目的地的传输过程中是否被篡改以及数据的真实来源。因此,它能够防止下面所示的四类问题:
(1)否认或抵赖:发送(接收)者事后不承认已发送(或接收)过这样一份文件。
(2)伪造:接收者伪造一份来自发送者的文件。
(3)篡改:接收者对接收者的信息进行部分篡改。
(4)冒充:网中的某一用户冒充另一用户作为发送者或接收者。

第三章 Winsock通信软件的实现
3.1 winsock通信的原理
WinSock是Windows下的TCP/IP应用程序的编程接口。应用程序一旦向系统申请到一个socket,就相当于应用程序获得一个与其它应用程序通信的输入输出接口,而该应用程序到底与哪个应用程序通信,取决于其IP地址。简单地讲,程序员可以将socket看作是一个文件指针,只要向指针对应的文件读写数据就可以实现网络通信。
利用socket进行通信,有两种方式 :第一种是流方式(Stream Socket),亦称面向连接方式。在这种方式下,两个进行通信的应用程序之间先要建立一种虚拟的连接关系,每一次完整的数据传输都要经过建立连接、使用连接和终止连接3个过程。本质上,连接是一个管道,其数据收发顺序一致,且内容相同。流方式采用TCP协议。第二种是数据报方式(Datagram Socket),又称无连接方式。每个数据分组都携带完整的目的地址,各分组在系统中独立传输。数据报方式采用的是UDP协议。在网络通信中,由于网络拥挤或一次发送的数据量过大等原因,经常会发生交换的数据在短时间内不能传送完,手法数据的函数不能返回,这种现象叫做阻塞。WinSock对有可能阻塞的函数提供了两种处理方式: 阻塞和非阻塞方式。在阻塞方式下,收发数据的函数在被调用后直到传送完毕或者出错才能返回;在阻塞期间,被阻的函数会不断调用系统函数GetMessage()来保持消息循环的正常运行。对于非阻塞方式,函数被调用后立即返回,当传送完成后WinSock给程序发一个事先约定好的消息。在编程时应尽量使用非阻塞方式,为了实现非阻塞通信,WinSock提供了异步选择函数WSAAsynSelect()。而且WinSock提供了100多个通信函数,其中编写TCP/IP应用程序最常用的几个函数如下表3.1:
表3.1 编写TCP/IP应用程序的常用函数
函数名 目的
Socket() 创建一个socket
Bind() 为创建的socket指定通信对象
connect() 请求连接
Listen() 设置等待连接状态
Accept() 接收连接请求
Send()/ recv() 发送/接收数据
Sendto()/Recvfrom() 发送/接收数据
Closesocket() 关闭指定的socket

基于TCP/IP网络通信的主要模式是客户机/服务器方式。使用WinSock进行网络通信程序设计和其它客户/服务器模式通信应用程序设计过程一样:首先客户机程序(进程)发送请求给服务器(进程),服务器进程对客户机的请求作出响应,并产生结果。一般来说,服务器进程完成一些较通用而特殊的处理,如进行一些复杂的计算,大型数据库的查询等;而客户机进程则由于将上述一些特殊的应用交由服务器进程处理,因而可以专心于其它工作。显然,在C/S模式下,客户机为主动方,即请求方;服务器为被动方,接收请求方。在TCP/IP应用中,服务器进程必须先于客户机进程启动,直到对客户机的需要结束或强迫终止才关闭服务器进程。
客户端应用程序功能为:
1) 打开通信信道(申请一套接字),并连接到服务器在主机的保留端口,该端口对应服务器的TCP/IP进程。
2) 向服务器发出请求报文,等待接收应答。
3) 从服务器方收到最终应答结果,或在不再请求时关闭信道并终止客户机进程。
服务器方应用程序功能为:
1) 打开通信信道(申请一套接字),通知本地主机在某一保留端口接收客户机请求。
2) 等待客户机请求到达指定端口。
3) 接收到请求,启动一新进程处理用户请求,同时释放旧进程以响应新的客户请求,一旦完成,关闭新进程与客户的通信链路。
4) 继续等持客户机请求。
5) 如果不想响应客户机请求,关闭服务器进程。
3.2 winsock规范
Socket是一种文件描述符,网络的Socket数据传输是一种特殊的I/0,它提供了进程之间通信的一种方法。Socket主要有流式套接字(Stream Socket)、数据报套接字(Datagram Socket)和原始数据报套接字(Raw Socket)3种 。其中流式套接字是一种面向连接的Socket,针对面向连接的TCP服务应用。在TCP/IP网络中,流式Socket是进行网络编程的重要手段。
目前通信网的协议多采用TCP/ IP。但是所开发的网络通信应用程序并不能直接与TCP/IP核心打交道,而是与网络应用编程界面Windows Sockets API打交道.Windows Sockets API则可直接与TCP/IP核心进行沟通.Windows Sockets API是Micmsoft Windows的网络程序设计接口,它在继承了Berkeley Sockets主要特征的基础上,又对它进行了重要扩充,如提供了异步处理函数,增加了符合Windows消息驱动特性的网络事件异步选择机制。这些扩充有利于应用程序开发者编制符合Windows编程模式的软件,它使在Windows下开发高性能的网络通信程序成为可能。
Windows Sockets规范定义并记录了如何使用API与互联网协议簇连接,所有的Windows Sockets实现都支持流套接口和数据报套接口。应用程序调用Windows Sockets的API实现相互之间的通信。Windows Sockets又利用下层的网络通信协议功能和操作系统调用实现实际的通信工作。
通信的基础是套接口(Socket),一个套接口是通讯的一端。在这一端上你可以找到与其对应的一个名字。一个正在被使用的套接口都有它的类型和与其相关的进程。套接口存在于通讯域中。通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。Windows Sockets规范支持单一的通信域,即Internet域。各种进程使用这个域互相之间用Internet协议族来进行通信(Windows Sockets 1.1以上的版本支持其他的域,例如Windows Sockets 2)。套接口可以根据通信性质分类;这种性质对于用户是可见的。应用程序一般仅在同一类的套接口间通信。不过只要底层的通信协议允许,不同类型的套接口间也照样可以通信。用户目前可以使用两种套接口,即流套接口和数据报套接口。流套接口提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接口支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接口接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点,数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。
3.3 C/S模型中Winsock实现通信的过程
Socket同时支持数据流Socket和数据报Socket。一般无连接服务器都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互作用。面向连接服务器处理的请求往往比较复杂,不是一来一去的请求应答所能解决的、而且往往是并发服务器。其工作流程如图3.2所示。
由图3.2可以看出,客户机与服务器的关系是不对称的。套接口工作过程是:服务器首先启动,通过调用Socket()建立一个套接口,然后调用bind()将该套接口和本地网络地址联系在一起,再调用Listen()使套接口做好侦听的准备,并规定它的请求队列的长度。然后就调用accept()来接收连接。客户机在建立套接口后就可以调用connect()和服务器建立连接,连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,等待数据传送结束后,双方调用close()关闭套接口。
在具体的实现中,socket之间的连接可以分为三个过程:
(1) 客户端连接:即客户端的Socket提出连接请求,要连接的目标即是服务器端的socket。为此,客户端的Socket通过对服务器的Socket地址和端口号进行探测,如果找到定位服务器端的Socket,并向服务器提出连接请求。如此对服务器端Socket正处于就绪状态,则立即向客户端Socket发出“允许连接”信号。至此客户端Socket与服务器端Socket的连接建立就绪。
(2) 监听连接:服务器端如监听到客户端Socket的连接请求时,即响应客户端Socket的请求而建立一个新的Socket句柄与客户端连接。而服务器端Socket则继续处于监听状态。准备接收其他客户端Socket的连接请求。
(3) 服务器端连接:当服务器端Socket接收到客户端Socket的连接请求后,若它己经处于就绪状态,就把服务器端Socket的描述信息发给客户端,一旦客户端确认了此描述,连接就建立了。
服务器

客户端

建立连接
阻塞 等待 客户连接请求

图3.2 Socket通信工作流程
3.4 Winsock通信编程实现
在WINDOWS 平台上进行WINSOCK开发使用的编程语言有很多,VC++,JAVA, DELPHI, VB等。其中VC时使用最普遍,和WINSOCK结合最紧密的。并且VC++对原来的Windows Sockets库函数进行了一系列封装,继而产生了CAsynSocket, CSocket, Csock}t File等类,它们封装着有关Socket的各种功能,使编程变得更加简单。
在VC中进行WINSOCK的API编程开发 ,需要使用到下面三个文件:
1)INSOCK.H:这是WINSOCK API的头文件;
2) WSOCK32.LIB: WINSOCK API连接库文件。在使用中,一定要把它作为项目非缺省的连接库包含到项目文件中去;
3 ) WINSOCK.DLL: WINSOCK的动态连接库,位于WINDOWS的安装目录下。
一般在使用中,面向连接协议的SOCKET编程模型应用最为广泛,因为面向连接协议提供了一系列的数据纠错功能,可以保证在网络上传输的数据及时、无误地到达对方。总的来说,使用SOCKET接口(面向连接或无连接)进行网络通信时,必须按下面简单的四步进行处理:程序必须建立一个SOCKET;程序必须按要求配置此SOCKET。也就是说,程序要么将此SOCKET连接到远方的主机上,要么给此SOCKET指定一个本地协议端口;程序必须按要求通过此SOCKET发送和接收数据;程序必须关闭此SOCKET。
在MFC中MS为套接口提供了相应的类CAsyncSocket和CSocket,CAsyncSocket提供基于异步通信的套接口封装功能,CSocket则是由CAsyncSocket派生,提供更加高层次的功能,例如可以将套接口上发送和接收的数据和一个文件对象(CSocketFile)关联起来,通过读写文件来达到发送和接收数据的目的,此外CSocket提供的通信为同步通信,数据未接收到或是未发送完之前调用不会返回。此外通过MFC类开发者可以不考虑网络字节顺序和忽略掉更多的通信细节。
创建CAsyncSocket对象,可以调用下列函数:A) BOOL CasyncSocket::DINT nSocketPort=(),int nSocketType=SOCK_STREAM, long Event=FD READ}FD WRITE{FD_OOB}FD_ACCEPT|FD_CONNECT,FD_CLOSE,LPCTSTRlpszSocketAddress=NULL)通过指明Event所包含的标记来确定需要异步处理的事件,对于指明的相关事件的相关函数调用都不需要等待完成后才返回,函数会马上返回然后在完成任务后发送事件通知。
套接口类提供的许多强大的功能,通过这些功能我们可以方便的建立网络连接和发送数据。基本的功能有:
BOOL CasyncSocket::Create(DINT nSocketPort = 0, int nSocketType =
SOCK_STREAM, long lEvent=FD_ READ|FD_ WRITE|FD_ OOB(FD_ ACCEPT|FD_ CONNECT|FD_ CLOSE, LPCTSTR 1pszSocketAddress=NULL):用于创建一个本地套接口,其中nSocketPort为使用的端口号,为零则表示由系统自动选择,通常在客户端都使用这个选择。nSocketType为使用的协议族,SOCK_ STREAM表明使用有连接的服务,SOC义DGRAM表明使用无连接的数据报服务。1pszSocketAddress为本地的IP地址,可以使用点分法表示如10.1.1.30。
BOOLCasyncSocket::Bind(UINTnSocketPort,LPCTSTR1pszSocketAddress=NULL):作为等待连接方时产生一个网络半关联,或者是使用UDP协议时产生一个网络半关联。
BOOL CasyncSocket:: Listen( int nConnectionBacklog=5):作为等待连接方时指明同时可以接受的连接数,请注意不是总共可以接受的连接数。
BOOLCasyncSocket::Accept(CAsyncSocket&rConnectedSocket,SOCKADDR1pSockAddr=NULL, int* 1pSockAddrLen=NULL):作为等待连接方将等待连接建立,当连接建立后一个新的套接口将被创建,该套接口将会被用于通信。
BOOL CasyncSocket::Connect(LPCTSTR 1pszHostAddress, DINT nHost-Port ):作为连接方发起与等待连接方的连接,需要指明对方IP地址和端口号。
void CasyncSocket:: Close():关闭套接口。
int CasyncSocket::Send(const void* 1pBuf, int nBufLen, int nFlags=0)
int CasyncSocket::Receive(void* 1pBuf, int nBufLen, int nFlags=0);建立连接后发送和接收数据,nFlag:为标记位,双方需要指明相同的标记。
大多数的函数都返回一个布尔值表明是否成功。如果发生错误可以通过intCasyncSocket: GetLastError()得到错误值。

第四章 Harn签名的实现
4.1 Harn签名原理
Harn签名是一种基于离散对数的签名方案,它是90年代初Harn提出来的。其主要原理是:p是一个大素数,a是GF(p)中的一个本原元,f是一个单向散列函数。签名者A的私有密钥是x,其中 且 ,通过公式(4.1)计算出公开密钥。
(4.1)
假定所要签名的消息为m,签名者A首先选择一个随机数k,且 。这时只需通过公式(4.2)
(4.2)
计算出r和s,那么 就是消息m的数字签名。
Harn签名的验证过程比较简单,任何用户只要收到集合 ,就可以通过公式(4.3)
(4.3)
来验证签名者A对消息的签名。
4.2 签名参数的设置
本设计没有直接对参数进行设置,而是一种间接的方式,参数设置如下:
1) 在私钥管理中创建用户(输入用户名,QQ以及Email地址);
2) 随机产生大素数p以及私钥x,其中 且 ;
3) 选取固定数a=3,a是GF(p)中的一个本原元;
4) 计算公开密钥 。
随机生成大素数p的程序定义如下:
vlong sqrt( vlong g, vlong p )
{
vlong result;
if (p%4==3)
result = modexp( g, p/4+1, p );
else if (p%8==5)
{
vlong gamma = modexp( 2*g, p/8, p);
vlong i = 2*g*gamma*gamma – 1;
result = g*gamma*i;
}
else
{
vlong Z = g;
vlong P = 1;
while (1)
{
vlong D = (P*P-4*g)%p; if (D<0) D += p;
if ( D==0 )
{
result = half(P,p);
break;
}
if ( modexp( D, (p-1)/2, p ) != 1 )
{
result = half( lucas( P, Z, (p+1)/2, p ), p );
break;
}
P += 1; // Is this ok (efficient?)
}
}
result = result % p;
if ( result < 0 ) result += p;

return result;
还随机生成密钥x。程序定义如下:
static vlong from_str( const char * s )
{
vlong x = 0;
while (*s)
{
x = x * 256 + (unsigned char)*s;
s += 1;
}
return x;
私有密钥x属于vlong类型数据,不适合于保存,故此把vlong类型的x转换成sk文件格式,以文件的形式保存下来。通过私有密钥x,可以计算出公开密钥y,其中属于vlong类型数据的y也必须转换成文件格式保存下来,为了便于区分,这里把公开密钥转换成pk文件格式。当已知p﹑x﹑a,其中p和a是系统的公共参数,当用户A和B要建立连接进行对话时,两者分别选择一个秘密随机数 , 作为他们的随机私钥,并生成随机公钥 , , , ,于是用户A,B可以分别对 , 签名,签名分别为 , 。然后互相向对方发送 , 。用户A,B验证对方的随机公钥后,就可以分别生成本次的会话密钥sk。
(4.4)
4.3 签名过程及验证

SHA

编码

TextTo
MessagePackage

SHA

一致

图4.3 签名及验证过程图

4.3.1 签名
Harn数字签名算法,包括签名算法和验证签名算法(图 4.3完整的描述了签名以及验证的流程图)。首先用MD5算法对信息作散列计算。签名的过程需用户的私钥,验证过程需用户的公钥。A用签名算法将字符串形式的消息处理成签名;B用验证签名算法验证签名是否是A对消息的签名,确认是A发送的消息;消息没有被攥改过;A一定发送过消息。
签名算法一般分二步:
1) 消息摘要计算。消息在签名前首先通过MD5计算,生成128位的消息摘要digest。
2) 对摘要作Harn计算。用加密算法,采用签名者的私钥加密消息摘要,得到加密后的字符串,加密算法中使用的加密块为01类型。
本设计签名的程序表述如下:
当创建好用户,生成所需各项参数后,就可以和客户端用户建立连接,首先进行消息编辑,本设计采用TextToMessagePackage函数将要签名的文本消息转换成消息包,用生成的用户私有密钥对消息包进行签名。当消息到达接收端就用公开密钥进行解签名,它们所代表的函数如下:
1) file.Open(pMain->m_private_key_send.decrypt(package);//用用户私有密钥签名
2) pMain->m_public_key_receive.encrypt(pMain->m_receive_message_package[0]);//用公开密钥解签名。
签名过程程序定义如下:
CFile file;

“d:\\send.txt”,
CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary);
file.Write(
&package,
sizeof(MessageDollop) + 12); //写入信息
file.Close();
*/
pMain->m_private_key_send.decrypt(package);
//用用户私有密钥签名
4.3.2 签名验证
要完成传输必须进行签名的验证,验证签名算法包括两步:Harn解密得签名者的消息摘要,验证者对原消息计算摘要,比较两个消息摘要。验证签名的过程输入为消息,签名者的公钥,签名;输出为验证的结果,即是否是正确的签名。
1) Harn解密。 签名实际是加密的字符串。用Harn解密算法,采用签名者的公钥对这个加密的字符串解密。解密的结果应为128位的消息摘要。在解密过程中,若出现得到的加密块的类型不是01,则解密失败。签名不正确。
2) 消息摘要计算和比较。 验证者对消息用MD5算法重新计算,得到验证者自己的消息摘要。验证者比较解密得到的消息摘要和自己的消息摘要,如果两者相同,则验证成功,可以确认消息的完整性及签名确实为签名者的;否则,验证失败。
要检验消息是否是签名方发送来的,就必须知晓签名方的公开密钥,在此可以请求获得对方的公开密钥,在得到对方的公开密钥后就可以对签名进行验证了。检验代码如下:
if(pMain->m_receive_digital_ID.IsDigitalID())
{
//如果所有消息块的ID不等于消息包的ID这就不是一条完整的消息,那一定通不过签名验证
if(!(pMain->m_receive_message_dollop_ID==pMain->m_receive_message_package_ID))
{
::MessageBox(
NULL,
“这不是一条完整的消息”,
“密聊”,
MB_ICONEXCLAMATION);
}

pMain->send_or_receive_tip(FALSE);
}else
{
//告诉对方我还没识别这条消息的身份
pMain->m_receive_message_package[0].head = HEAD_DIGITAL_SIGNATURE;
pMain->m_receive_message_package[0].ID = HEAD_DIGITAL_SIGNATURE_NO;
pMain->SendData(pMain->m_receive_message_package[0], 12);

::MessageBox(
NULL,
“对方不是 ” + pMain->GetFriendName() + ” 好友或没有 ”
+ pMain->GetUserName() + ” 用户的公钥”,
“接收失败身份不确认”,
MB_ICONEXCLAMATION);
当签名验证获得通过后,就可以正常接收消息了,不过首先用MessagePackageToText函数将发送过来的消息包转换成可读的文本消息,这样才能接收。

第五章 系统介绍及分析
5.1 系统功能介绍
5.1.1 私钥管理

图5.1 私钥管理
如图5.1 私钥管理,在私钥管理这一项有选择﹑创建﹑生出公钥﹑添加﹑编辑﹑删除。在左边有一对话框,可以随意选择所需要的密钥文件(因为用户的私有密钥是以文件的格式保存在这里,每一个私有密钥针对一个用户)。
在创建这一栏中(如图5.2),可以进行用户的创建,内容包括用户名的编辑,QQ以及用户的Email的编辑,编辑好 后就可以生成一个用户了,并且系统会针对此用户随机生成私有密钥和大素数p,方便签名。
通过私有密钥,可以生出公开密钥,如果公开密钥已经存在,再点生出公钥,就会提示,公开密钥已经存在是否对原文件进行覆盖(公开密钥也是以文件的格式保存)。
其它如添加,可以在此添加私有密钥文件,编辑项只可以进行用户的QQ和Email的编辑,但是改变QQ和Email代表着随机生成的大素数p以及私有密钥x的改变。也就是实现了参数的随意设置,当然这参数是不可知的。在删除项可以随意删除所储存的私有密钥文件。

图5.2 新用户的创建
5.1.2 公钥管理

图5.3 公钥管理
如图5.3公钥管理,在公钥管理这一项有选择﹑请求﹑添加﹑编辑﹑和删除。左边也有一对话框,里面储存了通过私有密钥所是生成的公开密钥,当然这些公开密钥是以文件的格式储存在这里的,通过选择项我们可以随意选择公开密钥。当接收方没有发送方的公开密钥而不能接收发送方所传来的消息时,可以通过请求项,获得发送方的公开密钥并验证签名者的身份,从而获得身份验证的通过完成消息的接收。
5.2 系统演示
当一切准备就绪后,就可以建立连接了(当然如果在同一台电脑上,可以打开两个,一个是客户端,一个是服务器)。点击连接可以选择IP地址,如图:

图5.4 选择IP地址

选择Ip后就可以成功连接:(客户端)

图5.5 建立连接(客户端)

服务器

图5.6 建立连接(服务器)

在客户端输入要发送的消息,点击发送,过段时间客户端会出现提示:

图5.7 发送失败
服务器会出现提示:

图5.8 接收失败

在这种情况下消息不能正常进行发送和接收,无法完成通信,此时可以进入服务器的密钥中的公钥管理栏请求获取对方的公开密钥,获得提示如图:

图5.9 获得公钥

然后在密钥匙设置中设置好私有密钥和公开密钥,然后就可以正常通信了。
如图 5.10:

图5.10 密钥管理
通信结果展示:

图5.11 信息发送

图5.12 信息接收

5.3 系统综合分析
此系统采用Harn算法进行消息签名。 通过winsock实现通信。
程序分析:
1) 通信程序用的是MFC Socket,监听套接字类CListenSocket,服务器类CServiceSocket,客户端类CClientSocket。CSecretChatDlg::SendData发送消息包。
2) public_key和private_key是对实现Harn功能的封装类:private_key::create()是创建私有密钥和公开密钥的函数,其他的参数是分别对消息块MessageDollop和消息包MessagePackage进行处理的封装,public_key::vlong_to_PK(PK &pk)是将公开密钥转化成PK结构,这样才能保存下来。public_key::PK_to_vlong(PK pk)把PK结构的公钥转化到vlong类型的公钥,private_key::vlong_to_SK(SK &sk)是将私有密钥转化成SK结构,这样才能保持下来,private_key::SK_to_vlong(SK sk)把SK结构的私钥转化到vlong类型的私钥。
3) MessageDollop和MessagePackage结构是分别是消息块和消息包,他们是重要的数据处理对象。它们的定义有详细的说明;PK和SK是为了将公开密钥和私有密钥变成可以存储的结构体;SecretKey是私钥或公钥文件结构;DWORD128类对128bit信息进行处理。
处理流程:
1) 连接成功后,就会安装用户的私有密钥和好友的公开密钥。
2) 对消息进行签名加密:用TextToMessagePackage函数将要签名的文本消息转换成消息包,用用户私有密钥对消息包进行签名m_private_key_send.decrypt,之后用对方公开密钥对消息包再进行加密m_public_key_send.encrypt,他们在while循环中,是为了使得要加密的数据必须要小于m。
3) 解密消息:用接收方的私有密钥解密m_private_key_receive.decrypt,用发送方的公开密钥解密签名m_public_key_receive.encrypt,用MessagePackageToText函数将要消息包转换成可读的文本消息。
本系统实现了的功能如下:
1. 消息编辑
2. Harn参数设置
3. Harn签名
4. Winsock通信
5. 身份验证,使收件人确信发件人就是他或她就是公开密钥所所对应的那个人
6. 机密性,确保只有预期的收件人能够阅读邮件
7. 完整性,确保消息在传输过程中没有被更改
8. 消息到达确认,发件人确认收件人收到了消息

第六章 总结
随着计算机科学技术和通信技术的飞速发展,网络通信中的安全问题成了现代网络的头号大问题,而数字签名是解决网络通信中特有的安全问题的有效方法。可以保证身份的精确性,分辨参与者所声称身份的真伪,防止伪装攻击。
本文在第一章绪论中详细描述了数字签名的研究目的及意义,概括介绍了国内外数字签名等相关技术的主要研究现状和发展以及此次设计的要求及意义。在第二章中介绍了密码技术﹑数字证书﹑单向散列函数﹑数字签名的原理以及相关的技术知识。第三章则详细介绍了Winsock通信的实现,首先讲述了Winsock通信的原理和规范,接着描述了C/S模型中Winsock实现通信的过程,最后详细介绍了Winsock通信编程的实现。第四章是Harn签名的实现,首先概括了Harn签名的原理,接着讲述了Harn参数的设置,最后描述了签名的过程以及验证。第五章主要是对自己所做成果的介绍和演示。
本论文实现了具有消息编辑与Harn签名的网络通信系统。系统采用vc++编程实现了Winsock通信,并通过Harn签名算法实现了对消息的签名加密。保证了信息的完整性﹑机密性与不可否认性。并实现了身份的验证。
由于时间和能力有限,此系统还不是特别的完善,有些方面还要进一步改进和增强。

参考文献
[1] Harn L. Digital signature system for Diffie一Hellman public keys without using a one一way function[J].Electron Lett,1997.33(2):25-126.
[2]冯登国.国内外信息安全研究现状及发展趋势[EB/OL]. http://www.blog.edu.cn/user1/17074/archives/2006/1209725.shtml,2006-4-3
[3]马涛.基于Harn-k密码体制的移动Agent系统通信安全研究[EB/OL].http://vip.bokee.com/2004092946386.html.2004-8-31
[4] 祁明 肖国镇. 基于Harn签名方案的远距离通行字认证方案[J].通信学报.1996.01.
[5]施荣华.一种基于Harn数字签名的双向认证访问控制方案[J].计算机学报.2001.04.
[6]李彦辉 王述洋 王春艳.网络信息安全技术综述[J].林业劳动安全,2007,01.
[7]贺军.数字签名[M].北京:清华大学出版社,2003.
[8]刘颖.基于身份的数字签名的研究[D]:[硕士学位论文].西安电子科技大学.2006.
[9]刘娇蛟.基于单向散列的双向身份鉴别[J].信息技术.2004.
[10] 徐佑军,吴元保. 基于WinSock的网络实时通信程序的设计[J].计算机工程,1999,25(11):98~100.
[11]冉逾. Winsock替代方法研究及在网络监控上的应用[D]:[硕士学位论文].四川大学.2003.3.23.
[12] 汪翔,袁辉.Visual C++实践与提高——网络编程篇[M].北京:中国铁道出版社,2001.

SS4B电力机车通信板设计

Posted by 天际的荒草 | Posted in Docs | 文档 | Posted on 17-08-2009

标签:, , , , ,

0

摘 要 1
ABSTRACT 1
第一章 绪论 2
1.1 SS4B电力机车简要介绍 2
1.2 SS4B电力机车通信板应用环境 3
1.3 使用RS485接口标准的背景以及相关理论 3
1.3.1 区别RS232和RS485 3
1.4 主控芯片W77E58的基本应用前景 4
第二章 SS4B电力机车通信板开发过程中采用的相关协议 5
2.1电力机车与LCU通信协议描述 5
2.2、RS485接口的设计和实现过程 6
2.2.1 RS485接口的描述 6
2.2.2 RS485接口控制过程 7
2.2.3 RS485通信的基本情况 8
2.3 RS232转换成RS485的过程阐述 8
2.3.1转换电路设计 8
2.4 RS485通信的可靠性设计 11
2.4.1 电路基本原理 11
2.4.2 RS-485的DE控制端设计 11
2.4.3 避免总线冲突的设计 12
2.4.4 RS-485输出电路部分的设计 12
2.5软件编程 13
第三章 通信板设计相关开发平台研究 15
3. 1基于硬件开发平台的介绍 15
3.1.1 基于WINDOWS平台的开发 15
3.1 .2 外部处理器(单片机)的开发 15
3.1 .3 PROTEL 99SE的介绍 15
第四章 通信板硬件设计方案及研究分析 17
4.1研究总体设计思路 17
4.2关于W77E58的研究和分析 17
4.2.1概述 17
4.2.2管脚功能分析以及芯片管脚图 17
4.2.3相关功能分析 21
4.2.5 W77E58的应用原理和使用方法 24
4.3 关于1480b芯片的研究 25
4.3.1 1480b的简要介绍 25
4.3.2 1480b的管脚分布以及管脚功能分析 25
4.3.3 1480b的功能特点 26
4.3.4 MAX1480B芯片的应用范围 27
4.3.5 MAX1480B应用原理和使用方法 27
4.4 根据设计思路,应用各芯片功能设计具体硬件电路图 27
第五章 通信板软件开发过程分析 29
5.1 总体体设计开发思路 29
5.2 对W77E58串口0通信编程的描述 29
5.3 对W77E58串口1通信编程的描述 31
结 束 语 34
参考文献 35

摘 要
SS4B电力机车通信板主要有两个功能:其一是监控两个LCU之间的通信并记录下通信数据;其二是按计算机的指令,将对应数据发送给计算机。为了完成这个功能设计,本次毕业设计主要应用了W77E58和1480b芯片完成整个设计。
本论文主要阐述了通信板中主控芯片W77E58的应用原理,研究了芯片各个管脚功能特性,其中还对芯片的各个特殊寄存器进行了说明。为了完成通信板的通信功能,论文还详细说明了W77E58的两个串口。在说明通信板的通信原理过程中,论文还详细介绍了RS485相关的知识,引导出了1480b芯片的介绍和研究,熟悉和了解了1480b芯片的各个管脚的功能和特性,同时阐述了芯片的使用方法和应用原理。最后,针对整个设计的软件编程过程论文对整个软件设计流程进行了详细的介绍,同时也阐述了利用单片机和汇编语言设计完成通信板通信功能的过程。
本文实现了通信技术的一个应用模型-SS4B电力机车通信板,在此之上,较全面地论述了RS485通信借口标准,充分说明了对于W77E58和1480b芯片的应用过程。

关键词 通信板, RS485,W77E58,1480b,通信,单片机

ABSTRACT
The SS4B electric locomotive communication board mainly has two functions:on the one hand,it monitors the correspondences between two LCU and records the communication data;on the other hand, according to the computer instruction, it transmiss the corresponded data for the computer. In order to complete this functional design, this graduation project has mainly applied W77E58 and the 1480b chip.
The present paper mainly has elaborated the master control chip W77E58 in the correspondence board application principle,studied the chip each base pin function characteristic,and carried on the explanation to chip each special register. In order to complete the correspondence function of the correspondence board , the paper also specifies two serial ports of W77E58. In the process of explaining correspondence theory of correspondence board, this paper has presented the related acknowledge of RS485 in detail and guided the presentation and research of 1480b CMOS chip. It makes us familiar with the functions and characteristics of each pin of the 1480b CMOS chip. Meanwhile, this article also elaborates the chip use methods and the application principles. Lastly, aimed at software programming process, this article has carried on the detailed introduction to the entire software design flow. At the same time, it also elucidates the process of accomplishing the communication function of correspondence board relaying on SCM and assembly language design.
This article has realized a communication application model – SS4B electric locomotive correspondence board. Above this, This article elaborated the RS485 correspondence interface standard comprehensively, and showed the application process of W77E58 and the 1480b chip fully.

Key Words Communication board, RS485, W77E58, 1480b, Communication, One-chip computer

第一章 绪论
1.1 SS4B电力机车简要介绍
SS4B型电力机车是株厂与株所于96年联合研制成功的8轴重载货运电力机车。该型机车遵循我国电力机车标准化、系列化、简统化的设计原则,是在继承SS4型、SS4改进型机车成熟技术的基础上,大量吸收消化国外8K、6K、8G等机车的先进技术、强调安全、可靠、互换性,同时考虑提高机车整体技术性能而设计的品质优良的交直传动电力机车。
SS4B电力机车型是由两节完全相同的四轴电力机车通过内重联环节连接组成的八轴重载货运电力机车。两节车重联处有中间走廊连通,可以很方便地从一节车走到另一节车。机车牵引及制动功率大,起动平稳,加速快,工作稳定可靠。该车不仅动力学稳定性好,粘着利用率高,并且还具备在恶劣工作环境中仍能保持优良运行状态的优点。主电路采用不对称三段半控桥,具有恒流准恒速控制的牵引特性和恒制动力准恒速控制的加馈电阻制动特性。空气制动采用DK-1型电空制动机。机车采用微机控制,具有空电联合制动,防空转防滑行,功率因数补偿和主要技术数据传输和显示等功能。 一系悬挂采用轴箱螺旋弹簧与弹性定位的独立悬挂结构。并配置油压减震器。二系悬挂采用橡胶加油压减振和摩擦减振的简单悬挂结构。采用斜拉杆低位牵引方式传递牵引力。构架设计优良,受力状态良好。 本车装载的TBQ8A-4923/25型变压器是一种先进的一体化变压器,除含有主变压器外,还含有平波电抗器和四个独立磁路的滤波电抗器。而且,它们都装在一个油箱里。共有一个冷却系统,重量轻,性能稳定,适应性强。 牵引电机采用抱轴悬挂式,单边直齿传动。垂直力传递系统由两系悬挂装置组成。
SS4B型电力机车全长约32m,总功率6400kW,最高速度100km/h,起动牵引力628kN。它由两节完全相同的4轴电力机车通过内重联环节连接组成,每节车为一个完整系统,有一个司机室,两节车通过中间走廊连通。SS4B机车具有外重联功能,其主要特点有:
⑴、 转向架采用中央低位斜拉杆推挽式牵引装置,稳定性好、粘着率高;
⑵、 牵引电机采用与日本日立公司联合设计的ZD114型800kW脉流牵引电机,采用滚动轴承抱轴鼻式悬挂、单侧刚性直齿传动;
⑶、 采用有限元法优化设计的整体承载式车体结构,可承受2450kN的静压力时无永久变形,采用大顶盖结构,可以采用预布线和预布管工艺;
⑷、 机车主电路为不等分三段半控桥式电路,转向架独立供电,采用晶闸管分路的无级磁场削弱电路,可实现全运行区无级调速特性;
⑸、 机车设有空转、滑行保护装置和轴重转移补偿环节。在机车接收到空转信号时,先发出撒砂指令,以增加粘着。若空转仍然存在,则使电机自动减载,使机车恢复粘着。轴重转移补偿时,在电机电流大于额定电流时进行补偿,在额定电流与起动电流之间补偿呈线性关系,最高补偿为5%;
⑹、 机车设有功率因素补偿装置,具有较高的功率因素和较小的谐波干扰电流,可大大改善电网的供电质量。

1.2 SS4B电力机车通信板应用环境
通信板应用环境如下图所示

图1.1 通信板的应用环境
上图中的通信板是这次毕业设计的主要设计任务,它以W77E58为主控芯片。其中,串口1主要完成对LCU1和LCU2之间的通信的监控制以及记录接受它们的通信数据;串口0主要向显示屏传送通信数据。因为串口0和串口1通信均才用RS485标准,所以在所有的传输过程中,传输网络设备都有主从之分。具体如下:在串口1通信的过程中,以LCU1为主;串口0通信的过程中,以计算机显示屏为主。
1.3 使用RS485接口标准的背景以及相关理论
1.3.1 区别RS232和RS485
RS-232-C是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号,C表示修改次数。RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道。在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。RS-232-C标准规定的数据传输速率为每秒50、75、 100、150、300、600、1200、2400、4800、9600、19200波特。RS-232-C标准规定,驱动器允许有2500pF的电容负载,通信距离将受此电容限制,例如,采用150pF/m的通信电缆时,最大通信距离为15m;若每米电缆的电容量减小,通信距离可以增加。传输距离短的另一原因是RS-232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于20m以内的通信。
RS-485总线,在要求通信距离为几十米到上千米时,广泛采用RS-485 串行总线标准。RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。RS-485采用半双工工作方式,任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。RS-485用于多点互连时非常方便,可以省掉许多信号线。应用RS-485 可以联网构成分布式系统,其允许最多并联32台驱动器和32台接收器。”见参考文献[5]”
1.3.2 小结,以RS485接口为标准通信的优点和特点
RS485采取差动式半双工方式;传输介质:双绞线;rs485相比rs232的抗干扰性强,rs485抗共模干扰能力强;传输距离远。其中,采取RS485为标准的通信网络中,每个通信过程中均存在主从通信网络设备,本次毕业设计的具体情况图一中已经解释说明。
1.4 主控芯片W77E58的基本应用前景
W77E58是一个非常难得的、功能强大的微处理器产品,尤其特别适合于对存储器资源有一定要求和对软件运行速度有特别要求的场合。由于它与国内目前使用最广泛的8051系列产品兼容,用户使用时不必重新花时间去学习其指令系统,前期也不必在开发仿真装置上重新投资,就可利用原有开发仿真装置对其大部分功能进行直接仿真开发,有些功能进行间接开发,比如第二串口,可先利用第一串口进行调试,最后将程序移植即可。在需要提高原有设计系统的运行速度时,除了需要修改有关靠软件定时的指令,其它几乎不用做任何修改,就可直接替换8051系列使用。在对其新增功能进行软件 开发设计时,只须在汇编软件的REG52.INC中加入新增特殊功能寄存器的定义,就可利用原汇编调试软件对为W77E58写的软件进行调试。因此,W77E58的出现给系 统的开发设计提供了更广阔的应用前景。
第二章 SS4B电力机车通信板开发过程中采用的相关协议
2.1电力机车与LCU通信协议描述
1、概述
SS4B是参照SS7E通讯协议制定,机车彩显与LCU通信采用RS485标准,主从半双工多机通信方式。彩显作为通信主机,通信地址为3CH;LCU作为从机,通信地址为6AH。传送的串行数据格式为每帧11位,分别为:起始位(0)、8个数据位、地址数据判断位(“1”表示地址,“0”表示数据)、停止位(1)。其传送顺序如下:
起始位 D0 D1 D2 D3 D4 D5 D6 D7 地址数据判断位 停止位
2、通信方法
LCU在开机初始化时,即置串行通信口为接收状态。彩显作为通信主机,循环访问LCU。当彩显发出的通信地址为LCU被选定时,LCU即准备接收彩显发来的命令数据块,全部数据接收完后,如检查和校验正确,则LCU转为发送状态。LCU先发送显示器的地址,然后根据接收到的命令,回送相应的数据,最后一个字节为检查和。LCU发送完检查和后,稍作延时,再转为接收状态,等待下一个通信周期。
3、传送速率
通信波特率为28.8kb/s。
4、串行通信线
采用3绞或双绞屏蔽线,分别为A线(+)、B线(-)、参考电平线。
5、通信格式
6、显示器发送到LCU的命令数据格式为8个字节,具体传送顺序如下:
1 2 3 4 5 6 7 8
6AH 年 月 日 时 分 秒 检查和
各个字节均为16进制数。
LCU返回显示器的32个字节的数据格式为:
1 2 3 4 5 6 7 8
3CH 6AH Data1 Data2 Data3 Data4 Data5 Data6

9 10 11 12 13 14 15 16
Data7 Data8 Data9 Data10 Data11 Data12 Data13 Data14

17 18 19 20 21 22 23 24
Data15 Data16 Data17 Data18 Data19 Data20 Data21 Data22

25 26 27 28 29 30 31 32
Data23 Data24 Data25 Data26 Data27 Data28 Data29 检查和

数据块末检查和的形式
传送数据块的最后一个字节为检查和,检查和为数据块内检查和字节前所有地址字节与数据字节的累加和(不计进位)的二进制补码。接收方把接收的数据块内所有数据和检查和相加,如结果为零,表明传送正确;如结果不为零,则认为此次传送失败,接收的数据无效。
通信定时约定
当LCU发送完检查和后,必须在40~60us时间之内转换为接收状态。
当LCU发送完检查和后,必须立即转换为发送状态。
数据块内字节之间的间隔(即上一字节的停止位的结束与下一字节起始位的开始之间的时间间隔)不应大于80us。
显示器对LCU的访问周期平均为120ms,LCU两次被访问的最短间隔不小于90ms。
7、通信失败处理方法
显示器给LCU发出命令后,如在20ms内还未收到返回数据,则判定此次与LCU通信失败。LCU数据区的数据清零。
2.2、RS485接口的设计和实现过程
2.2.1 RS485接口的描述
由于RS-232-C的不足,逐渐采用的接口标准即RS485接口。它具有以下特点:
(1) RS-485的电气特性:逻辑”1″以两线间的电压差为+(2-6)V表示;逻辑”0″以两线间的电压差为-(2-6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL 电路连
(2) RS-485的数据最高传输速率为10Mbps
(3) RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。
(4) RS-485接口的最大传输距离标准值为4000英尺,实际上可达 3000米,另外RS-232-C接口在总线上只允许连接1个收发器,即单站能力。而RS-485接口在总线上是允许连接多达128个收发器。即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。
(5) 因RS-485接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选的串行接口。因为RS485接口组成的半双工网络,一般只需二根连线,所以RS485接口均采用屏蔽双绞线传输。RS485接口连接器采用DB-9的9芯插头座,与智能终端RS485接口采用DB-9(孔),与键盘连接的键盘接口RS485采用DB-9(针)。
2.2.2 RS485接口控制过程
随着通信技术的发展,对通信速率的要求越来越高,距离要求越来越远。根据RS232C标准,他的最高传输速率为20kb/s时,最远距离仅为15m,当然在使用中也可达到60m,但这远远不能满足上述发展对速度及距离所提出的新的要求。美国EIA学会与1977年在RS232C基础上提出了改进的标准RS449,现在的RS422和RS485都是从RS449派生出来的。RS485是利用差分传输方式提高通信距离和可靠性的一种通信标准,它在发送端使用2根信号线发送同一信号(2根线的极性相反),在接收端对这两根线上的电压信号相减得到实际信号,这种方式可以有效的抗共模干扰,提高通信距离,最远可以传送1200m,原理图如下

数据发送 TX+ RX+ 数据接受

图2.1 RS485通信的基本原理
  RS485的电器标准与RS422完全相同,但当RS485线路空闲(即不传送信号)时,线路处于高阻(或挂起)状态这时RS485线路就可以允许被其他设备占用,也就是说具有RS485通信接口的设备连成网络。根据RS485驱动芯片驱动能力的不同,一个RS485数据发送设备可以驱动32~256台RS485数据接收设备。当RS485网络上的设备多于2台时,就必须采用半双工方式进行通信,即数据发送和接收使用同一线路,发送时不允许接收数据进入线路,反之亦然,在RS485网络中只允许有一个设备是主设备,其余全部是从设备;或者无主设备,各个设备之间通过传递令牌获得总线控制权。
由于RS422/RS485具有诸多优点,现已被大量采用,但普通PC机很少直接配置RS422/RS485通信接口,只有工控机提供的ALL-IN-ONE,主板配置有RS422/RS485通信口,可以用跳线选择T通信的工作方式是RS422还是RS485。市场上有大量的RS422/RS485/RS232转换或可以直接插在PC机扩展槽上的RS422/RS485通信卡销售。另一种流行的串行连接方式是电流控制,而不像RS232C标准那样用电压控制。电流控制是把20mA电流作为逻辑“1”,零电流作为逻辑“0”。电流还在许多方面比RS232C接口优越。它内在的双端传输具有对共模噪音的抑止作用,而且由于他采用隔离技术能消除接地回路引起的一些问题,因而他的连接距离比RS232C长的多。EIA把RS232C接口作为正式标准,而20mA电流环的文件在目前还只是非正式标准。所以,大多说制造厂商都提供RS232C串行接口,这样这种连接得到了最广泛的使用。因为RS232C和电流接口之间只在电气连接上存在差别,所以两者可共用I/O接口,设计师常常为串行口提供2个不同的连接器来利用这个公共口。一个接到电流环,另一个接到RS232C。这就允许用户根据具体情况,决定采用2种接口中的一种。市场上也有产品可以直接插在PC机扩展槽上的电流环通信卡销售。“见参考文献[7]”
2.2.3 RS485通信的基本情况
在工业控制及测量领域较为常用的网络之一就是物理层采用RS-485通信接口所组成的工控设备网络。这种通信接口可以十分方便地将许多设备组成一个控制网络。从目前解决单片机之间中长距离通信的诸多方案分析来看,RS-485总线通信模式由于具有结构简单、价格低廉、通信距离和数据传输速率适当等特点而被广泛应用于仪器仪表、智能化传感器集散控制、楼宇控制、监控报警等领域。但RS485总线存在自适应、自保护功能脆弱等缺点,如不注意一些细节的处理,常出现通信失败甚至系统瘫痪等故障,因此提高RS-485总线的运行可靠性至关重要。

图2.2 RS485通信的基本电路图
2.3 RS232转换成RS485的过程阐述
2.3.1转换电路设计
MAX1480B其输入端为TTL电平或CMOS电平,而标准的RS-232通信接口都是经过MC1488、MC1489将TTL电平转换成+12 V标准的RS-232电平,所以转换电路中首先应将+12 V通信电平转换成TTL电平,再送MAX1480B将其转换成RS-485差动传输。其电路原理如下图所示。

图2.3 RS-232与RS-485转换接口电路原理图
图中RS-232电平与TTL电平之间的转换由ICL232芯片完成。该芯片是由两个RS-232接收器和两个发送器组成,且由单一+5 V电源供电。其接口电路原理如图2所示。

图2.4 ICL232接口电路原理图
数据发送由RS-232接收器D1、R7、R1、N1及MAX1480B芯片内光耦器件构成的电流环回路组成。“数据终端准备好” DTR(data terminal ready)使能线由RS-232接收器D2、R8、R2、N2及MAX1480B片内光耦器件构成的电流环回路组成。
该输出除具有DTR功能外,由于ICL232芯片只有两个RS-232接收器,所以用D2的输出和二极管I1组成“请求发送”RTS(req to send)使能。当DTR有效允许发送时,RTS无效,此时只能发送不能接收。而当DTR无效RTS有效时,只能接收数据而不能发送数据,从而保证RS-485通信线上数据的可靠性,避免因失控或干扰造成的收发数据混乱。数据接收由RS-232发送器D3、R3、I2及MAX1480B芯片内集电极开路的光耦器件组成。而MAX1480B隔离副边的A端为正相驱动器输出和正相接收器输入;B端为反相驱动器输出和反相接收器输入。A、B两端构成标准的RS-485数据通信接口。图1中R是网络匹配电阻,一般在网络两端的通信接口中使用。其余通信接口不使用,其阻值在120 Ω左右。
2.3.2 软件实现转换过程
电路是采用两线制差动传输,适合于半双工通信方式。既可应用到双机系统的点对点通信,又可应用于多机系统的网络通信。对于双机系统的点对点通信,其通信软件设计方法类似RS-232,比较简单。但是对于多机系统的通信,在进行RS-485通信软件设计过程中,有几点须注意,如多机通信的地址识别问题、半双工方式通信的时延问题等都是很重要的。下面将讨论在多机系统通信中,如何解决RS-485通信中存在的这些主要问题。
首先从机地址识别:半双工通信时,从机地址的识别是非常关键和重要的。一般解决此问题的方法是:由主机向从机发送不同的控制命令来识别各从机,但是这样的通信方式中,每个从机要接收主机和其他从机所有命令与数据,从而花费很多宝贵时间去接收处理不必要的信息,造成该从机的时间浪费。因此提出了一种简单而又实用的解决从机地址识别问题,那就是利用通信线路的奇偶校验位来识别从机的地址。该方法为:主机发出从机地址时,主机允许奇偶校验位的奇校验,而所有从机只允许奇偶校验的偶校验。一开始主机发地址,所有从机处于听命令状态,从机奇偶校验和主机不一致,从机允许接收中断,收到主机发来的地址,所有从机进入中断服务例程,读取数据,和本机预定地址比较,当确认是本机地址时,设接收数据标志,允许接收数据。当主机发完从机地址时,其奇偶校验转换成偶校验,和从机奇偶校验一致,这样主机就和某一从机建立了数据通信关系。数据交换完毕,主机将奇偶校验位又变为奇校验。发另一从机地址,实现和另一从机的数据交换。从而实现了多从机地址识别。
其次半双工通信的延时:电路中,当采用半双工通信方式时,通信方向的改变是通过DTR来控制的,根据RS-485通信规则,当主机(或从机)发送数据(或命令)时,DTR应置为高电平,这时MAX1480B的驱动输出端(A和B)处于有效状态,即发送状态。当主机(或从机)发送完数据后,DTR置成低电平, 这时MAX1480B的驱动输出端(A和B)处于接收状态。这样,通过DTR的控制就可以容易地实现主机和从机的数据通信。但是在数据发送到接收的转换过程中,DTR由高电平变成低电平时,必须经过一段延时,否则会造成数据发送不完整或接收数据受阻。这主要是因为主机或从机发送的最后一个数据要经过图1的RS-232/RS-485转换接口电路中反相器和MAX1480B内部传输电路的延迟才能到达RS-485总线上去。如果主机或从机发送最后一个数据时,DTR立即由有效转换成无效,该数据还未传输到RS-485总线上就将总线置成接收状态,从而造成最后一个数据发送受阻。因此,在数据发送到接收的转换过程中,DTR的有效到无效转变必须经过一段时间的延迟。该延时可以通过软件编程来实现。在程序设计中,通过一段延迟程序就可容易地解决。
最后软件实现方法:主从机工作方式都采用中断方式,程序中开两个缓冲区,即数据接收缓冲区和数据发送缓冲区,它们的最大长度为BUFsize。当要发送数据时,只要向发送缓冲区写入待发数据,然后允许发送中断,在中断服务程序中自动将缓冲区的数据发出去。接收也采用中断方式,所以只要判断接收缓冲区不空,则说明已接收到数据。所附程序以主、从机初始化串行口程序、中断通信子程序(以COM1)为例。程序实现的是两线制半双工数据交换,数据方向控制开关由3FC寄存器的D0控制,发送数据时,3FC的D0为1,接收时D0为0,此位直接控制线路DTR(见图三)。必须特别注意的是DTR开关换向的时候,发送完数据不能马上将DTR转向接收,如果那样会切断数据发送,必须等到发送寄存器空。
2.4 RS485通信的可靠性设计
2.4.1 电路基本原理
某节点的硬件电路设计如图2.3所示,在该电路中,使用了一种RS-485接口芯片1480b,它采用单一电源Vcc,电压在+3~+5.5 V范围内都能正常工作。与普通的RS-485芯片相比,它不但能抗雷电的冲击而且能承受高达8 kV的静电放电冲击,片内集成4个瞬时过压保护管,可承受高达400 V的瞬态脉冲电压。因此,它能显著提高防止雷电损坏器件的可靠性。对一些环境比较恶劣的现场,可直接与传输线相接而不需要任何外加保护元件。该芯片还有一个独特的设计,当输入端开路时,其输出为高电平,这样可保证接收器输入端电缆有开路故障时,不影响系统的正常工作。另外,它的输入阻抗为RS485标准输入阻抗的2倍(≥24 kΩ),故可以在总线上连接64个收发器。芯片内部设计了限斜率驱动,使输出信号边沿不会过陡,使传输线上不会产生过多的高频分量,从而有效扼制电磁干扰。在图1中,四位一体的光电耦合器TLP521让单片机与SN75LBC184之间完全没有了电的联系,提高了工作的可靠性。基本原理为:当单片机P1.6=0时,光电耦合器的发光二极管发光,光敏三极管导通,输出高电压(+5 V),选中RS485接口芯片的DE端,允许发送。当单片机P1.6=1时,光电耦合器的发光二极管不发光,光敏三极管不导通,输出低电压(0 V),选中RS485接口芯片的RE端,允许接收。SN75LBC184的R端(接收端)和D端(发送端)的原理与上述类似。
2.4.2 RS-485的DE控制端设计
在RS-485总线构筑的半双工通信系统中,在整个网络中任一时刻只能有一个节点处于发送状态并向总线发送数据,其他所有节点都必须处于接收状态。如果有2个节点或2个以上节点同时向总线发送数据,将会导致所有发送方的数据发送失败。因此,在系统各个节点的硬件设计中,应首先力求避免因异常情况而引起本节点向总线发送数据而导致总线数据冲突。以MCS51系列的单片机为例,因其在系统复位时,I/O口都输出高电平,如果把I/O口直接与RS-485接口芯片的驱动器使能端DE相连,会在CPU复位期间使DE为高,从而使本节点处于发送状态。如果此时总线上有其他节点正在发送数据,则此次数据传输将被打断而告失败,甚至引起整个总线因某一节点的故障而通信阻塞,继而影响整个系统的正常运行。考虑到通信的稳定性和可靠性,在每个节点的设计中应将控制RS485总线接口芯片的发送引脚设计成DE端的反逻辑,即控制引脚为逻辑“1”时,DE端为“0”;控制引脚为逻辑“0”时,DE端为“1”。在图1中,将CPU的引脚P1.6通过光电耦合器驱动DE端,这样就可以使控制引脚为高或者异常复位时使SN75LBC184始终处于接收状态,从而从硬件上有效避免节点因异常情况而对整个系统造成的影响。这就为整个系统的通信可靠奠定了基础。
此外,电路中还有1片看门狗MAX813L,能在节点发生死循环或其他故障时,自动复位程序,交出RS-485总线控制权。这样就能保证整个系统不会因某一节点发生故障而独占总线,导致整个系统瘫痪。
2.4.3 避免总线冲突的设计
当一个节点需要使用总线时,为了实现总线通信可靠,在有数据需要发送的情况下先侦听总线。在硬件接口上,首先将RS-485接口芯片的数据接收引脚反相后接至CPU的中断引脚INT0。在图1中,INT0是连至光电耦合器的输出端。当总线上有数据正在传输时,SN75LBC184的数据接收端(R端)表现为变化的高低电平,利用其产生的CPU下降沿中断(也可采用查询方式),能得知此时总线是否正“忙”,即总线上是否有节点正在通信。如果“空闲”,则可以得到对总线的使用权限,这样就较好地解决了总线冲突的问题。在此基础上,还可以定义各种消息的优先级,使高优先级的消息得以优先发送,从而进一步提高系统的实时性。采用这种工作方式后,系统中已经没有主、从节点之分,各个节点对总线的使用权限是平等的,从而有效避免了个别节点通信负担较重的情况。总线的利用率和系统的通信效率都得以大大提高,从而也使系统响应的实时性得到改善,而且即使系统中个别节点发生故障,也不会影响其他节点的正常通信和正常工作。这样使得系统的“危险”分散了,从某种程度上来说增强了系统的工作可靠性和稳定性。
2.4.4 RS-485输出电路部分的设计
在2.4中,VD1~VD4为信号限幅二极管,其稳压值应保证符合RS-485标准,VD1和VD3取12 V,VD2 和VD4取7 V,以保证将信号幅度限定在-7~+12 V之间,进一步提高抗过压的能力。考虑到线路的特殊情况(如某一节点的RS-485芯片被击穿短路),为防止总线中其他分机的通信受到影响,在SN75LBC184的信号输出端串联了2个20 Ω的电阻R1和R2,这样本机的硬件故障就不会使整个总线的通信受到影响。在应用系统工程的现场施工中,由于通信载体是双绞线,它的特性阻抗为120 Ω左右,所以线路设计时,在RS485网络传输线的始端和末端应各接1个120 Ω的匹配电阻(如图1中的R3),以减少线路上传输信号的反射。
2.4.5  系统的电源选择
对于由单片机结合RS-485组建的测控网络,应优先采用各节点独立供电的方案,同时电源线不能与RS-485信号线共用同一股多芯电缆。RS-485信号线宜选用截面积0.75 mm2以上的双绞线而不是平直线,并且选用线性电源TL750L05比选用开关电源更合适。TL750L05必须有输出电容,若没有输出电容,则其输出端的电压为锯齿波形状,锯齿波的上升沿随输入电压变化而变化,加输出电容后,可以抑制该现象。
2.5软件编程
1480B在接收方式时,A、B为输入,R为输出;在发送方式时,D为输入,A、B为输出。当传送方向改变一次后,如果输入未变化,则此时输出为随机状态,直至输入状态变化一次,输出状态才确定。显然,在由发送方式转入接收方式后,如果A、B状态变化前,R为低电平,在第一个数据起始位时,R仍为低电平,CPU认为此时无起始位,直到出现第一个下降沿,CPU才开始接收第一个数据,这将导致接收错误。由接收方式转入发送方式后,D变化前,若A与B之间为低电压,发送第一个数据起始位时,A与B之间仍为低电压,A、B引脚无起始位,同样会导致发送错误。克服这种后果的方案是:主机连续发送两个同步字,同步字要包含多次边沿变化(如55H ,0AAH),并发送两次(第一次可能接收错误而忽略) ,接收端收到同步字后,就可以传送数据了,从而保证正确通信。
为了更可靠地工作,在RS485总线状态切换时需要适当延时,再进行数据的收发。具体的做法是在数据发送状态下,先将控制端置“1”,延时0.5 ms左右的时间,再发送有效的数据,数据发送结束后,再延时0.5 ms,将控制端置“0”。这样的处理会使总线在状态切换时,有一个稳定的工作过程。数据通信程序基本流程图如图2.5所示。

N

Y

图2.5 RS485数据通信程序基本流程图
单片机通信节点的程序基本上可以分为6个主要部分,分别为预定义部分、初始化部分、主程序部分、设备状态检测部分、帧接收部分和帧发送部分。预定义部分主要定义了通信中使用的握手信号,用于保存设备信息的缓冲区和保存本节点设备号的变量。设备状态检测部分应能在程序初始化后,当硬件发生故障时,作出相应的反应。主程序部分应能接收命令帧,并根据命令的内容作出相应的回应。为缩短篇幅,这里仅给出主程序部分的代码。如下所示:
  /* 主程序流程 */
  while(1) {             //主循环    
    if(recv_cmd(&type)==0) //发生帧错误或帧地址与本机
                  //地址不符,丢弃当前帧后返回
  continue;
  switch(type) {
    case __ACTIVE_:    //主机询问从机是否存在
      send_data(__OK_, 0,dbuf);//发送应答信息
      break;
    case __GETDATA_:
      len = strlen(dbuf);
      send_data(__STATUS_, len,dbuf);//发送状态信息
        break;
    default:
        break;    //命令类型错误,丢弃当前帧后返回
    }
  }

第三章 通信板设计相关开发平台研究
3. 1基于硬件开发平台的介绍
3.1.1 基于WINDOWS平台的开发
为了让开发者能够更快地掌握和熟悉通信板的功能,提供了两种可编程的DEMO版本程序。它们分别是Visual Basic向导和Visual C++向导。通过这两个向导,将会为用户自动生成这两种语言版本的DEMO示例程序,而且开发者还可以在此基础上自行编制自己的程序代码,程序里面提供了一个通信控件,开发者只需要了解它的使用方法就能够很容易地运用它来编写自己的实验程序。在向导里,用户只需简单地选择选项,然后直接单击下一步。
3.1 .2 外部处理器(单片机)的开发
提供 51系列单片机的开发环境:在通信板硬件开发平台上,提供了一个完整的51系列单片机(W77E58)的开发环境,用户可以直接编写单片机程序来控制通信板串口的工作情况。另外,提供了一个UART接口,也可以直接连接用户自己的单片机板子来控制通信。在单片机的开发环境中提供了丰富的外部资源,使得开发非常方便。
3.1 .3 PROTEL 99SE的介绍
PROTEL 99SE[18]是用于绘制通信板电路图及制版图的软件。PROTEL 99SE是PROTEL家族中目前最稳定的版本,功能强大。采用了*.DDB数据库格式保存文件,所有同一工程相关的SCH、PCB等文件都可以在同一*.DDB数据库中并存,非常科学,利于集体开发和文件的有效管理。还有一个优点就是自动布线引擎很强大。在双面板的前提下,可以在很短的时间内自动布通任何的复杂线路。
Protel99的组成:原理图设计系统,印刷电路板设计系统,信号模拟仿真系统,可编程逻辑设计系统 ,Protel99内置编辑器。
Protel 99se的运行界面见图3.1

图3.1 Protel 99se的运行界面见

第四章 通信板硬件设计方案及研究分析
4.1研究总体设计思路
在前面的几章中,已经论述了通信板设计开发的相关环境,基于W77E58主控芯片为SS4B电力机车通信板设计提供了清晰的设计思路,即如图2.1所示:
通过W77E58的双串口通信,同时在MAX1480B的作用下,实现RS232到RS485标准通信的转换,以至达到设计要求——通信板应具有双串口通信功能,一个串口用于监控两个LCU之间的通信并记录下通信数据。另一个串口按计算机的指令,将对应数据发送给计算机。
4.2关于W77E58的研究和分析
4.2.1概述
W77E58是一个快速8041 兼容微控制器;它的内核经过重新设计,提高了时钟速度和存储器访问周期速度。经过这种改进以后,在相同的时钟频率下,它的指令执行速度比标准8041 要快许多。一般来说,按照指令的类型,W77E58的指令执行速度是标准8041的1.4-3倍。整体来看,W77E58的速度比标准的8041快2.4倍。在相同的吞吐量及低频时钟情况下,电源消耗也降低。由于采用全静态CMOS设计,W77E58能够在低时钟频率下运行。W77E58内含32KB Flash EPROM,工作电压为4.4v-4.4v,具有 1KB片上外部数据存储器,当用户应用时使用片上SRAM代替外部SRAM,可节省更多I/O口。
4.2.2管脚功能分析以及芯片管脚图
管脚说明:
符号 类型 具体介绍
EA I 外部访问使能:此管脚使处理器访问外部ROM。当EA 保持高电平时,处理器访问内部ROM。如果EA 管脚为高电平且程序计数器指向片内ROM空间,ROM的地址和数据就不会出现在总线上。
PSEN O 程序存储使能:在执行取指令(fetch)和MOVC的操作时,此管脚允许外部ROM数据出现在P0口的地址/数据总线上。当访问内部ROM时,此管脚上不输出PSEN 的选通信号。
ALE O 地址锁存能:ALE用于将P0口地址锁存,使其和数据分离
RST I 复位:振荡器运行时,此管脚上出现两个机器周期的高电平将使器件复位。
XTAL1 I 石英晶体1:晶体振荡器的输入。此管脚可由一个外部时钟驱动。
VSS I 地:地电位
VDD I 电源:电源工作电压
P0.0−P0.7 I/O 端口0:端口0是一个双向I/O口,在访问外部存储器时,端口0可用作低位地址/数据总线。端口0 是一个开漏极端口,在进行编程时需要连接一个外部上拉电路。
P1.0−P1.7 I/O 端口1:端口1是一个具有内部上拉电路的双向I/O 口。有复用功能位,如下:
T2(P1.0): 定时/计数器2的外部计数输入
T2EX(P1.1):定时/计数器2的重装载/捕获控制
RXD1(P1.2): 串行口2 RXD
TXD1(P1.3): 串行口2 TXD
INT2(P1.4): 外部中断 2
INT3 (P1.4): 外部中断 3
INT4(P1.6): 外部中断 4
INT4 (P1.7): 外部中断 4
P2.0−P2.7 I/O 端口2:端口2是一个具有内部上拉电路的双向I/O 口。此端口提供访问外部存储器的高位地址。
P3.0−P3.7 I/O 端口3:端口3是一个具有内部上拉电路的双向I/O 口。所有位都有复用功能,如下:
RXD(P3.0):串行口接收器输入
TXD(P3.1):串行口发送器输出
INT0 (P3.2):外部中断0
INT1 (P3.3):外部中断1
T0(P3.4):定时器0外部输入
T1(P3.4):定时器1外部输入
WR (P3.6):外部数据存储器写选通
RD (P3.7):外部数据存储器读选通
P4.0−P4.3 I/O 端口4:可位寻址的双向I/O 口P4,P4.0也提供WAIT 功能提供等待控制信号。
P4.3 也提供REBOOT 的功能,该功能用来从LD flash 中重启。
表4.1 W77E58管脚说明
芯片管脚图:

图4.1W77E58管脚图

方块图:

图4.2 W77E58方块图
以上分布图“见参考文献[4]”
4.2.3相关功能分析
W77E58与8042在管脚及指令集上兼容。它具有8042的资源如:4个双向8位I/O口,3个16位定时器/计数器,全双工串行和若干中断源。
W77E58中建有一个更加快速,性能更好的8位CPU,它的内核经过重新设计,提高了时钟速度和存储器访问周期速度。性能的提高不仅仅在于使用高频的振荡器,还在于W77E58将多数标准的8042指令的机器周期从12个时钟减少至4个时钟。这样性能就提高了1.4-3倍。另外W77E58还可调整MOVX指令的周期,范围为2个机器周期-9个机器周期。这种设计使得W77E58能够更有效的访问慢速或快速外部RAM及外设。W77E58内含1KB用MOVX 指令访问的数据存储器,地址范围为0000H-03FFH。它只能用MOVX指令来访问,可由软件来选择是否使用这个片上SRAM。
W77E58是与8042兼容的,因此具有8042的特性;相比8042它的速度提高,耗电量减少。他的指令集基本与8041相同;多了一条DEC DPTR (操作码 A4H, DPTR减 1)指令。8041每12个时钟周期为一个机器周期,而W77E58每4个时钟周期为一个机器周期。这样提高了W77E58的指令执行速度。因此与8042相比即使在时钟频率相同的情况下W77E58也可以以更高速度运行。由于采用全静态CMOS设计,W77E58能够在低时钟频率下运行,在相同指令吞吐量的情况下,电源消耗也降低。机器周期缩短至4个时钟周期,是W77E58速度提高的主要原因。W77E58具有所有8042的特性,同时也具有一些新的外设及特性。
I/O 口
W77E58有4个8位I/O口,及一个附加的4位I/O口。当处理器用MOVC或MOVX指令执行外部程序、访问外部设备/存储器时,P0口可用作地址/数据总线。此时它内部有强上拉或下拉功能,无须再使用外部上拉。否则它是带有开漏输出的通用I/O口。P2口主要提供16位地址的高8位。当用作地址线时它同样具有强上拉或下拉功能。P1、P3口是I/O口同时具有不同的功能 。P4口(限PLCC/QFP封装)是和P1、P3相同的通用I/O口。P4.0有CP/RL2 的复用功能是等待状态中的控制信号。当等待状态控制信号使能后,P4.0是输入口。
串行口
W77E58有2个增强型串行口,功能与标准8042串行口相似。W77E58的串行口能以不同的方式运行,以获得时序相似。注意串行口0可以用定时器1或2做波特率发生器,但串行口1只能用定时器1做波特率发生器。串行口有自动地址识别和贞错误检测的增强功能。
定时器
W77E58有3个16位定时器,其功能与8042体系中的定时器类似。当作为定时器使用时,可将它们设置为每4个时钟周期进行一次计数,或者每12个时钟周期进行一次计数。这位用户提供了模拟8042时钟运行的一种方式。W77E58具有特殊的功能,看门狗定时器。该定时器可用作系统监控器,或超长周期定时器。
中断
W77E58的中断系统与标准8042之中断系统有细微的差别。由于存在新增功能和外设,中断源的数量和中断向量都相应得增加。W77E58提供12个中断源2级中断能力,包括6个外部中断,定时器中断及串行I/O口中断。
4.2.4特殊功能寄存器
W77E58用特殊功能寄存器(SFRs)来控制监测系统运行和系统的模式。特殊功能寄存器位于80H-FFH的地址空间内,只能用直接寻址的方式来访问。一些特殊功能寄存器是可位寻址的,这个功能特别适用于只想修改寄存器中的某一位而不影响其他位的场合。可位寻址的特殊功能寄存器,其地址编号是以0或8结尾。W77E58中含有标准8042中所有的特殊功能寄存器,同时也加入了一些新的特殊功能寄存器。在一些应用场合,8042中未被定义的位被赋予了新的功能。下表列出了W77E58中的特殊功能寄存器,每行分了9列。空白项表示该地址空间没有SFR存在,对这些空间的访问将会得到全1的结果。
特殊功能寄存器简介:
端口0 位: 7 6 4 4 3 2 1 0
P0.7 P0.6 P0.4 P0.4 P0.3 P0.2 P0.1 P0.0
助记符:P0 地址: 80h
端口0是一个开漏双向I/O口,在访问外部存储器时,它会分时输出16位地址的低位字节和8位数据。
堆栈指针 位: 7 6 4 4 3 2 1 0
SP.7 SP.6 SP.4 SP.4 SP.3 SP.2 SP.1 SP.0
助记符:SP 地址: 81h
堆栈指针存储暂存RAM中堆栈的起始地址,就是说他总指向栈顶。
数据指针低字节 位: 7 6 4 4 3 2 1 0
DPL.7 DPL.6 DPL.4 DPL.4 DPL.3 DPL.2 DPL.1 DPL.0
助记符:DPL 地址: 82h
标准8042中16位数据指针的低字节。
数据指针1高字节 位: 7 6 4 4 3 2 1 0
DPH1.7 DPH1.6 DPH1.4 DPH1.4 DPH1.3 DPH1.2 DPH1.1 DPH1.0
助记符:DPH1 地址: 84h
W77E58种另一个16位数据指针的高字节,用户可以通过设置DPS在DPL, DPH 和 DPL1, DPH1之间切换。DPS=1时,DPTR指令将访问DPL1和DPH1。如果不需要使用数据指针,那么用户也可将它们用作一般的数据寄存器。
定时器控制 位: 7 6 4 4 3 2 1 0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
助记符:TCON 地址: 88h
TF1: 定时器1溢出标志;在定时器1溢出时该位置1。当程序响应定时器1中断执行相应的中断服务程序时,该位自动清0。软件也可对该位置位或复位。
TR1: 定时器1启动控制:该位由软件来置位或清零来启动或关闭定时器。
TF0: 定时器0溢出标志;在定时器1溢出时该位置1。当程序响应定时器0中断执行相应的中断服务程序时,该位自动清0。软件也可对该位置位或复位。
TR0: 定时器0启动控制:该位由软件来置位或清零来启动或关闭定时器。
IE1: 外部中断1标志;当INT1上出现电平跳变时由硬件置1;若被设置为下沿触发并导致中断转跳的话,会自动清除为0,否则完全根据外部中断。
IT1: 外部中断1触发方式控制;1:低电平边沿触发; 0:低电平触发
IE0: 外部中断0标志;当INT0 上出现电平跳变时由硬件置1;若被设置为下沿触发并导致中断转跳的话,会自动清除为0,否则完全根据外部中断。
IT0: 外部中断0触发方式控制;1:低电平边沿触发; 0:低电平触发
串行口控制寄存器 位: 7 6 4 4 3 2 1 0
SM0/FE SM1 SM2 REN TB8 RB8 TI RI
助记符:SCON 地址: 98h
SM0/FE: 串行口0,模式0控制位或贞错误标志位。PCON特殊功能寄存器中的SMOD0位决定该位的功能。下面会描述SM0的运行功能。当用作贞错误标志时,该位的置位表示一个无效的停止位。该位必须由软件来清除。
SM1: 串行口模式位1:
SM0 SM1 模式 说明 数据长度 波特率
0 0 0 同步 8 时钟的4或12分之一
0 1 1 异步 10 可变
1 0 2 异步 11 时钟的64或32分之一
1 1 3 异步 11 可变
SM2: 多机通信控制。将该位置1,则使能模式2及模式3下的多机通信功能。在模式2或3下,如果SM2置1,那么收到的第九位数据RB8是0的话,RI将不会置位。在模式1下如果SM2置1,那么在没有收到有效的停止位前RI是不会置位的。在模式0下,SM2位控制着串行口的时钟。如果清0,那么串行口的时钟是系统时钟的12分频。这样系统就与标准8042兼容。如果该位置1,那么串行口的时钟是系统时钟的4分频,这样就加快了同步通信的速度。
REN: 接收使能,置1时打开串行口接收功能,否则关闭该功能。
TB8: 模式2和3中要被发送的第九位数据。软件可以根据需求将该位置1或清0。
RB8: 模式2和3中接收到的第九位数据。模式1下,若SM2=0则RB8是接收到的停止位。模式0下该位无意义。
TI: 发送中断标志:模式0下该标志由硬件在发送完8位数据后置位,而在其他模式下在串行发送到停止位的开始时置位。该位必须由软件来清除.
RI: 接收中断标志:模式0下该标志由硬件在接收到8位数据后置位,而在其他模式下在串行接收到停止位的中间时置位。该位必须由软件来清除。以上寄存器的功能描述“见参考文献[6]”。
4.2.5 W77E58的应用原理和使用方法
W77E58单片机其串口增强型特征在于特有的地址自动识别和帧出错诊断功能。其主要应用两个串口进行工作,根据RS485的通信原理以及通信特性,在通信板中,其串口1主要是对两个LCU的通信进行监控;串口0主要将数据通过计算机传送到显示屏。
下面以串口0为例,对W77E58串口的工作过程进行简单介绍串口0通过引脚RXD串行数据接收端)和TXD〔串行数据发送端)进行通信可同时发送和接收数据,具有两个物理上独立的接收、发送缓冲器SBUF,们占用同一地址。串行口的发送和接收都是以特殊功能寄存器SBUF的名义进行读或写的,发送数据完毕或接收到数据都会由硬件置位发送中断标志TI或接收巾断标志RI。值得注意的是,中断标志TI、 RI均需由软件来清零、串口l的工作过程和串口0相类似.只需对其相应的寄存器及标志位进行类似操作即可。W77E58串行口是可编程接口,对它初始化编程只需对特殊功能寄存器SCON或SCON1和电源控制寄存器PCON写人相应的控制字即可。其中的软件编程控制详见第六章。所有以上理论“见参考文献[3]”。
4.3 关于1480b芯片的研究
4.3.1 1480b的简要介绍
MAX1480B将光电耦合器、隔离型DC-DC变换器和RS-484驱动器集成在一个芯片内,是一个完整的输入/输出在电气上隔离的RS-484数据接口芯片,其主要特性如下:
⑴ 隔离的数据接口。典型隔离电压的有效值大于1600V;
⑵ 具有用于无差错数据传送的转换速率限制特性;
⑶ 最高传输速率达240Kb/s;
⑷ 相对于隔离地具有-7~+12V的共模输入电压范围;
⑸ 单一+4 V电源供电;
⑹ 1 μW低功率关断模式;
⑺ 具有电流限制和热关断特性的驱动器过载保护功能。
4.3.2 1480b的管脚分布以及管脚功能分析
管脚分布图:

图4.3 1480b管脚分布图
管脚功能分析
引脚 名称 功能 引脚 名称 功能
1.2 Vcc1 逻辑侧一4V 电源 16.20 ISOGND 隔离地
8.10.14 Vcc 逻辑侧+4V 电源 17 ISO DE DRV 隔离驱动器驱动端
3.4 D1.D2 内部连接端.用作空脚 18.26 ISO Vcc 隔离侧电源
4.12 GND 逻辑侧地 19 ISO DI DRV 隔离驱动器输人驱动端
6 FS 频率开关 21 ISO DE IN 隔离驱动器使能输人端
7 SD 关断正常时触地 22 ISO DI IN 隔离驱动器输人驱动端
9 DI 驱动器输^ 23 A 非反驱动器输出和非反接
收器输人
11 DE 驱动器使能 24 ISO RO DRV 隔离接收器输出驱动端
13 RO 接收器输出 24 B 非反驱动器输出和非反接
收器输人
14 ISORL FD
隔离接收 输出I E1) 27.28 AC2
AC1 内部连接端,用作空脚
表4.2 1480b管脚说明
以上分析说明“见参考文献[9]”
4.3.3 1480b的功能特点
MAX1480B具有如下特点:
⑴ 具有减低转换速率(reduced—slew—ratc)驱动器,它使EMI(电磁干扰)为最小,能耗小由于电缆终端不匹配而引起的反射, 在数据高达240kb/s时能做到无误差的数据传送。
⑵ 器件吸收的静态电源电流的典型值为28mA,并提供低功耗(lW)的关断方式,在此方式下仅消耗0.2 uA 的电流。
⑶ 驱动器具有限制短路电流的功能并由热关断电路保护使之功耗不致过大.热关断电路可把驱动器的输出端置于高阻状态。
⑷ 在典型情况下可承受1600 V (均方根值)或Z000 V (均方根值1s),它们的隔离输出符合所有的RS485技术条件。
⑸ 具有包括电流限制和热关断的驱动器过载保护相对于隔离地的一7至+12V共模输入电压范围。
⑹ 工作温度范围一40℃~+8℃:贮存温度范围一6℃~+160℃。
⑺ 单4V电源。
4.3.4 MAX1480B芯片的应用范围
用于隔离的RS一485数据接口;在对EMI灵敏的应用场合中作收发器与HVAC测控网络及工业控制局域网络;自动测试设备与楼字自动控制网络。
4.3.5 MAX1480B应用原理和使用方法
1480b主要是应用于将RS232通信接口转换成RS485标准通信接口。其中具体转换和设计过程如下:通过RS485接口芯片MAX1480B与W77E58的串行口0进行通信。同时,W77E58串行口1通过MAX1480B传输的数据,经过一个RS485到RS232的电平转换器与计算机显示屏通信。通信电路都采用了光电隔离。其中使用Maxim公司的MAX1480B作为RS485接口芯片,适用于半双工通信。它采用平衡驱动和差分接收、具有抑制共模干扰的能力,可用于恶劣环境中,最大通信距离达1200m。当使能无效时,发送和接收的输出端呈高阻状态。使用MAX1480B构成通信系统时,最大通信速率为0.I25Mb/s,
传输线上最多可挂128个收发器。
4.4 根据设计思路,应用各芯片功能设计具体硬件电路图
首先分析应用主控芯片W77E58的双串口完成本次设计的主要通信功能,分别用下三个图表示:

图4.4主图

图4.5主要是将通信结果输入显示屏

图4.6调节内部数据

分析如何利用1480b芯片将RS323转换成RS485,如下图所示:

图4.7 RS323转换成RS485电路图
综合,利用W77E58和1480b完成通信板的硬件设计

第五章 通信板软件开发过程分析
5.1 总体体设计开发思路
整个软件开发分为两个主要模块,其中一是对W77E58芯片的串口1进行编程控制,主要为了使其完成对LCU1和LCU2之间的通信进行控制以及记录通信数据,其只做接收过程;另外一个模块是对W77E58芯片的串口0进行编程控制,完成数据传输至计算机处理进行显示。其中主要过程如下:
通信




接收到请求后
向显示屏发送数据

图5.1软件开发流程主图
其中,整个设计过程中,要弄清整个网络设备的主从结构,其中在LCU1与LCU2通信的过程中,LCU1是主机;W77E58的串口0与显示屏的通信中,显示屏与计算机是主机。同时,注意1480B的相关设置,理清RS485的通信特点。
5.2 对W77E58串口0通信编程的描述
首先,关于串口0的应用,串口0 RXD/TXD用于监控LCU1与LCU2之间的通信,只接收,用于获取LCU的数据。所有编程都通过学习单片机,具体情况“见参考文献[1]和参考文献[2]”,整个流程图如下:

数据

地址

图5.2 W77E58串口0主要编程控制
主要程序,以及对整个软件开发过程的说明:
SCOM: PUSH ACC ;保护现场
PUSH PSW
JBC RI,RCOM ;为接收数据中断(并清RI)
clr ti
LJMP RETURN ;错误
RCOM:
cpl p1.6
JNB RB8,RDATA ;是数据吗?
MOV A,SBUF ;是地址
mov r0,a
XRL A,#6AH ;是LCU2发给lcu1 的地址6AH吗?
jz readlcu2
mov a,r0
xrl a,#6bh
jz readlcu1
LJMP RETURN

readlcu2:
mov 7eh,#40h ;数据送到40h~4fh
mov 7ch,#6ah
mov 7ah,#6ah ;较验和
MOV 7dh,#10H ;准备接收16个数据
CLR SM2 ;是地址,则允许lcu2发来的数据申请中断
LJMP RETURN
readlcu1:

mov 7eh,#50h ;数据送到50h~5fh
mov 7ch,#6bh
mov 7ah,#6bh ;较验和
MOV 7dh,#10H ;准备接收16个数据
CLR SM2 ;是地址,则允许lcu2发来的数据申请中断
LJMP RETURN

RDATA:
MOV A,SBUF ;是数据
mov r0,7eh
MOV @R0,A ;将数据送40H-60H(17个含CH)
INC 7eh
ADD A,7ah
MOV 7ah,A
dec 7dh
mov a,7dh
jnz return
; MOV A,7ah
; JZ CHECK_OK
; LJMP data_err ;效验和不为零
;CHECK_OK:NOP
data_err:
;………….接收数据正确,数据移动到80h~9fh
整个分析过程在程序和备注里面进行了详细阐述。
5.3 对W77E58串口1通信编程的描述
首先,关于串口1的应用,串口1RXD1/TXD1 用于与彩屏通信,作为从机,向彩屏发送数据。本身地址为6AH 彩屏地址为3cH。整个流程图如下:

A, #11111101b

A, #00000001B

数据 地址

校验和不为零 校验和为零 显示地址正确

图5.3 W77E58串口1主要编程控制
主要程序,以及对整个软件开发过程的说明:
SCOM1: PUSH ACC ;保护现场
PUSH PSW
SETB RS0 ;寄存器区1
CLR RS1
cpl p1.6
MOV A,0C0H
ANL A,#00000001B
JNZ RCOM1 ;为接收数据中断

anl 0c0h,#11111101b ;TI_1清零

LJMP RETURN_1 ;错误
RCOM1:
ANL 0c0h,#11111110B ;执行完 jbc 后 ri_1清零
MOV A,0c0h ;是数据吗?
ANL A,#00000100B
JZ RDATA_1 ;是数据

MOV A,0C1H ;是地址 0C1H是SBUF1
MOV R3,#0B0H ;存储数据的起始位置
MOV R4,#07H ;准备接收7个数据,彩屏发送过来的
MOV R5,#6AH
xrl a,#6ah
jz raddata ;地址正确
LJMP RETURN_1
RADData:
cpl p2.0 ;显示 收到彩屏发送地址数据正确
ANL 0c0h,#11011111B ;地址正确,则允许数据申请中断sm2_1
LJMP RETURN_1
RDATA_1:
cpl p2.1 ;表示收到数据
MOV A,0c1h ;是数据
MOV 08H,0BH ;数据R3送到R0(寄存器区1)
MOV @R0,A ;将数据送B0H-B6H(7个含CH)
INC R3
ADD A,R5
MOV R5,A
DJNZ R4,RETURN_1
MOV A,R5
JZ CHECKOK
LJMP RDATA1 ;效验和不为零
CHECKOK:NOP
RDATA1:
orl 0c0h,#00100000B ;关闭数据申请中断
cpl p2.2 ;显示给彩屏发送数据

LCALL TCOM ;立即给彩显发数据
MOV R0,#25H ;延时12
DELAY13:MOV R1,#12H
DELAY14:DJNZ R1,DELAY14
DJNZ R0,DELAY13
RETURN_1:
CLR RS0 ;寄存器区0
CLR RS1
POP PSW ;恢复现场
POP ACC
RETI
整个分析过程在程序和备注里面进行了详细阐述。
以上的看门狗程序应用“见参考文献[8]”

参考文献
[1]、杨文龙编《单片机原理及应用》 西安电子科技大学出版社 2000
[2]、孙涵芳编《MCS-41系列单片机原理及设计》.北京航空航天大学出版社
[3]、刘慧文 苏建微《基于W77E58双串口通信的监控系统》单片机与嵌入式系统 2003 11
[4]、W77E58.pdf ftp://download.laogu.com/download/W77E58.pdf 或者http://www.winbond.com/PDF/Sheet/W77E58.pdf
[5]、柳义筠 《基于RS485的多机通信的应用》 电脑学习 2006 8
[6]、桂志伟 《高速单片机W77E58的特点及应用》计算机元器件 2000 11
[7]、金勇 潘永才 《一种基于RS 484总线的工控系统的设计与实现》现代电子技术 2006 12
[8]、王法军 王光艳 《C51环境下W77E58 Watchdog的应用》 电子产品世界 2006
[9]、MAX1480A/B/C/MAX1490A/B.PDF MAXIM 英文版
[10]、数据通信接口电路MAX1480B及其应用 张建利 姜永成

附录
附录主要是对整个程序的介绍,同时附加硬件设计电路图。
程序:
;########## SS4B 通信板 程序清单 ##############
;安装在SS4B的LCU2中,每台车两个LCU2,每个LCU2一块卡。
;用于SS4B通信,获取LCU数据,并发送给彩屏。
;使用W77E58作为主控芯片,每块通信板分为AB两组,每组使用一块芯片。
;串口0 RXD/TXD 用于监控LCU1与LCU2之间的通信,只接收,用于获取LCU的数据。
;串口1 RXD1/TXD1 用于与彩屏通信,作为从机,向彩屏发送数据。本身地址为6AH 彩屏地址为3cH
;面板上 A01 灯 表示 电源
;面板上 A02 灯 表示 正确接收彩屏发送的地址
;面板上 B01 灯 表示 正确接收彩屏发送的数据
;面板上 B02 灯 表示 向彩屏发送数据
;面板上 C01 灯 表示 正确接收LCU2发送的数据
;面板上 C02 灯 表示 正确接收LCU1发送的数据

ORG 0000H
START: AJMP MAIN ;进入主程序
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0023H
S
…………………………..

; 10H–1FH: SP区
; 71H 接受数据指针
; 7AH 发送数据校验和
; R5 接收数据校验和(0CH)
硬件电路原理图如下:

移动银行:迟迟未开的盛宴

Posted by 天际的荒草 | Posted in ICT | 通信业界 | Posted on 24-03-2009

标签:, , , , , , ,

0

人人都看到了诱人的美味,盛宴似乎即将开始,但座次还未排定,刀叉还未摆好。

2009年2月25日,一则消息吸引了北京市民的目光。市政交通一卡通可以在全市7家沃尔玛超市和部分医院进行刷卡结算。这就意味着消费者鼓囊囊的钱包可以再瘦点身。

事实上,这只是一个庞大整合前景的一小部分实现。钥匙、钱包和手机—每个人出门必备的“三小件”,正在走向“三合一”。而最具整合者品相的,无疑是承载功能最强大的手机。

公交一卡通虽然方便,但仍然是一种脱机操作的储值卡,不能进入银行的账户系统。卡片损坏或丢失,钱就没了,所以不可能进行大额交易。而手机可以联机支付,通过无线网络访问银行后端系统,无论是发卡、使用、充值或挂失,都能以安全便捷的“空中”方式实现。

但移动支付还只是手机与金融业务结合的一个方面。移动互联网的发展强化了手机的电子银行功能。账户查询、转账结算、炒股、外汇买卖、查看最新行情,这些传统的账户管理、投资和资讯业务,都可以用短信或WAP上网的方式实现。目前国内各大商业银行包括合资银行,50%以上都能提供手机银行的业务。

把银行搬到手机上,然后装进口袋四处走?

移动互联网时代,这不是猜想。

盛宴可以开动了吗?

弗里德曼告诉我们,世界是平的。

在这个越来越相似的世界上,无论你到哪个陌生的城市,只需要掌握两种规则:交通规则和消费规则。

从来没有一个时代像现在这样,发生着如此频繁的个体交易;也没有一个时代像现在这样,对个人的财富管理投入如此高的热情;更没有一个时代像现在这样,个人生活的每个方面都可以如此数字化和移动化。

移动银行的诞生正是个体经济地位提升、商业消费文化盛行以及信息技术发达的产物。

如果要给移动银行下一个定义,看上去会很像移动支付。比如“移动银行是以GPRS移动支付系统为技术支撑,采用当前先进的无线分组交换技术,实现了电子支付方式的无线移动和永久在线”等等。

不过在我们的视野里,移动银行可以宽泛地看作移动通信业与金融业的交叉领域,主要包括手机银行和移动支付两大类服务。后者又进一步分为远程支付和本地支付。远程支付通过无线网络以短信、WAP、语音等方式提出请求;本地支付是使用射频、红外、蓝牙等技术,实现手机与自动售货机、POS机等设备之间的本地通讯。

一直以来,人们似乎对移动支付尤其是本地支付都寄予了更多的关注。这或许因为本地支付涉及的产业面更广泛,看上去更像是一道可以招待很多人共餐的菜肴。银行、运营商、手机厂商、芯片商、独立的支付服务商,甚至电子商务企业和硬件设备商都可以坐在这张餐桌旁。

早在2006年,以手机作为工具的本地移动支付服务就在中国开始了商用的尝试。4月19日,飞利浦、诺基亚、Vodafone公司及德国美因茨交通公司宣布,手机上的近距离无线通信(NFC)技术即将在国际上首次投入商用。仅仅不到两个月后,在中国的美丽海滨城市厦门,就有一些试商用的志愿者拿着诺基亚3220手机,去影院,乘公交,还买了面包。

根据2006年AC尼尔森调研公司在中国的调查,超过80%的消费者希望将公交卡、银行卡等支付工具集成到手机上,而据调研公司ABI预测,到2009年,50%的新增手机将具备NFC功能,2010年NFC手机发货量将达到5亿台。

三年已经过去了。乐观的预言似乎没有得到现实的响应,至少还没有50%的新增手机能装上NFC芯片。对于绝大部分人来说,并没有看到在超市收银台或公交车门口晃一晃手机就能过去的场面。实际上,本地支付的实现需要非常大的初期投资,包括和各商户谈判,更换终端POS机,改变手机本身的硬件特性等等,如果没有一个肯下本钱的强势推动者,本地支付的大规模应用还很遥远。

但消费者的期望仍然在。中国移动重庆分公司在2007年初开始试点手机钱包卡,用于超市购物和轻轨应用。截止2008年底,重庆公司商用的用户数达到了20万—用中国移动方面的话,“这是非常了不起的数字。”中国移动研究院的朱本浩还拿中国移动广州分公司开通手机地铁票业务当天的高人气场面做例子,指出“移动支付在中国的用户基础非常好,用户的接受度和感知度非常高。”

到目前为止,最真实铁通消息及来源

Posted by 天际的荒草 | Posted in ICT | 通信业界 | Posted on 15-03-2009

标签:, , ,

4

从过年到现在,铁通的哥们都在彷徨中,看着这样,那样的小道消息.虽然工作照做但影响了大家的情绪.

     3月12日,铁通总部召开了全国财务系统的一个筹划培训会议,在会议上,总部熊总的讲话,涉及到一些,网友们登出!

实际上内容提要是:
    一,专网回铁路是定局.细节问题由于财务很多内容未确定,资产分割要6月份以后才能具体.
    二,.铁公网未来做为移动上市公司的类似附属(三产类)公司,为上市公司服务,工资待遇,要有所提高,肯定要高于现在的水平.

   这是目前,铁通最高层面,在正式场合,说的关于大家关心的事情!

希望大家把得来的消息,好好的说给大家.别扰乱大家的情绪.调大家胃口!!
未来这么大的变化,肯定要涉及部分人,大家关心的清理之中.
不管怎么样,我们也是该干什么干什么!
有知情权!未必都是坏事!!
朋友们!
保重!
回去,留下,好与坏!因人而异.
自己感觉好!就好!!