一种基于AES的序列密码保密通信软件
Posted by 天际的荒草 | Posted in Docs | 文档 | Posted on 19-09-2009
标签:AES密码, Winsock, 分组密码, 密钥, 序列密码, 通信
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.






