毕业设计(论文)-Linux下的网络层加密解密的实现1.doc_第1页
毕业设计(论文)-Linux下的网络层加密解密的实现1.doc_第2页
毕业设计(论文)-Linux下的网络层加密解密的实现1.doc_第3页
毕业设计(论文)-Linux下的网络层加密解密的实现1.doc_第4页
毕业设计(论文)-Linux下的网络层加密解密的实现1.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux下的网络层加密解密的实现摘 要随着网络技术在各行各业中的广泛应用,网络安全逐渐成为一个重要的问题。Linux是一个优秀的、开源的操作系统,非常适合作为一些新技术的测试平台。本文修改Linux操作系统内核的网络协议,以实现对网络通信数据的加密。先介绍了网络数据加密的发展和现状。接着分析了网际协议、DES加密算法和Linux下的网际协议的实现和套接字结构。然后,实现了DES算法,对内核进行了修改,添加了一些功能性内核模块。在此基础上设计和实现了一个位于IP层的端到端加密的系统,整个系统嵌入到Linux内核中,可以通过内核模块对其进行操作,来实现其功能。该系统的主要特点是针对IP地址判断是否进行加密操作。最后,通过测试验证了系统设计的正确性。关键字:网络层;Linux内核;端到端;加密;模块;网络通信目 录论文总页数:23页1 引言12 网络数据加密技术12.1 链路加密12.2 节点加密22.3 端到端加密23 系统的总体分析33.1 网际协议分析33.2 套接字结构分析53.3 Linux下IPv4的实现63.4 DES算法介绍84 系统的设计与实现124.1 系统的总体设计124.2 模块部分的设计与实现134.3 DES算法实现154.4 对内核函数的修改185 网络层加密系统的测试18结论21参考文献21致谢22声明231 引言随着网络技术的发展,网络安全也就成为当今网络社会的焦点中的焦点,几乎没有人不在谈论网络上的安全问题,病毒、黑客程序、邮件炸弹、远程侦听等这一切都无不让人胆战心惊。病毒、黑客的猖獗使身处今日网络社会的人们感觉到谈网色变,无所适从。 但我们必需清楚地认识到,这一切一切的安全问题我们不可一下全部找到解决方案,况且有的是根本无法找到彻底的解决方案,如病毒程序,因为任何反病毒程序都只能在新病毒发现之后才能开发出来,目前还没有哪能一家反病毒软件开发商敢承诺他们的软件能查杀所有已知的和未知的病毒,所以我们不能有等网络安全了再上网的念头,因为或许网络不能有这么一日,就象“矛”与“盾”,网络与病毒、黑客永远是一对共存体。现代的网络加密技术就是适应了网络安全的需要而应运产生的,它为我们进行一般的电子商务活动提供了安全保障,如在网络中进行文件传输、电子邮件往来和进行合同文本的签署等。其实加密技术也不是什么新生事物,只不过应用在当今电子商务、电脑网络中还是近几年的历史。当今网络社会选择加密已是我们别无选择,其一是我们知道在互联网上进行文件传输、电子邮件商务往来存在许多不安全因素,特别是对于一些大公司和一些机密文件在网络上传输。而且这种不安全性是互联网存在基础TCP/IP协议所固有的,包括一些基于TCP/IP的服务;另一方面,互联网给众多的商家带来了无限的商机,互联网把全世界连在了一起,走向互联网就意味着走向了世界,这对于无数商家无疑是梦寐以求的好事,特别是对于中小企业。为了解决这一对矛盾、为了能在安全的基础上大开这通向世界之门,我们只好选择了数据加密和基于加密技术的数字签名。2 网络数据加密技术2.1 链路加密对于在两个网络节点间的某一次通信链路, 链路加密能为网上传输的数据提供安全保证。对于链路加密(又称在线加密), 所有消息在被传输之前进行加密, 在每一个节点对接收到的消息进行解密, 然后先使用下一个链路的密钥对消息进行加密, 再进行传输。在到达目的地之前, 一条消息可能要经过许多通信链路的传输。由于在每一个中间传输节点消息均被解密后重新进行加密, 因此, 包括路由信息在内的链路上的所有数据均以密文形式出现。这样, 链路加密就掩盖了被传输消息的源点与终点。由于填充技术的使用以及填充字符在不需要传输数据的情况下就可以进行加密,这使得消息的频率和长度特性得以掩盖, 从而可以防止对通信业务进行分析。尽管链路加密在计算机网络环境中使用得相当普遍, 但它并非没有问题。链路加密通常用在点对点的同步或异步线路上, 它要求先对在链路两端的加密设备进行同步, 然后使用一种链模式对链路上传输的数据进行加密。这就给网络的性能和可管理性带来了副作用。在线路/信号经常不通的海外或卫星网络中,链路上的加密设备需要频繁地进行同步, 带来的后果是数据丢失或重传。另一方面, 即使仅一小部分数据需要进行加密, 也会使得所有传输数据被加密。在一个网络节点, 链路加密仅在通信链路上提供安全性, 消息以明文形式存在, 因此所有节点在物理上必须是安全的, 否则就会泄漏明文内容。然而保证每一个节点的安全性需要较高的费用, 为每一个节点提供加密硬件设备和一个安全的物理环境所需要的费用由以下几部分组成: 保护节点物理安全的雇员开销, 为确保安全策略和程序的正确执行而进行审计时的费用, 以及为防止安全性被破坏时带来损失而参加保险的费用。在传统的加密算法中, 用于解密消息的密钥与用于加密的密钥是相同的,该密钥必须被秘密保存, 并按一定规则进行变化。这样, 密钥分配在链路加密系统中就成了一个问题, 因为每一个节点必须存储与其相连接的所有链路的加密密钥, 这就需要对密钥进行物理传送或者建立专用网络设施。而网络节点地理分布的广阔性使得这一过程变得复杂, 同时增加了密钥连续分配时的费用。2.2 节点加密尽管节点加密能给网络数据提供较高的安全性, 但它在操作方式上与链路加密是类似的:两者均在通信链路上为传输的消息提供安全性,都在中间节点先对消息进行解密,然后进行加密。因为要对所有传输的数据进行加密,所以加密过程对用户是透明的。然而,与链路加密不同, 节点加密不允许消息在网络节点以明文形式存在,它先把收到的消息进行解密, 然后采用另一个不同的密钥进行加密, 这一过程是在节点上的一个安全模块中进行。节点加密要求报头和路由信息以明文形式传输, 以便中间节点能得到如何处理消息的信息。因此这种方法对于防止攻击者分析通信业务是脆弱的。2.3 端到端加密端到端加密允许数据在从源点到终点的传输过程中始终以密文形式存在。采用端到端加密(又称脱线加密或包加密), 消息在被传输时到达终点之前不进行解密, 因为消息在整个传输过程中均受到保护, 所以即使有节点被损坏也不会使消息泄露。端到端加密系统的价格便宜些, 并且与链路加密和节点加密相比更可靠,更容易设计、实现和维护。端到端加密还避免了其它加密系统所固有的同步问题, 因为每个报文包均是独立被加密的, 所以一个报文包所发生的传输错误不会影响后续的报文包。此外,从用户对安全需求的直觉上讲, 端到端加密更自然些。单个用户可能会选用这种加密方法, 以便不影响网络上的其他用户, 此方法只需要源和目的节点是保密的即可。端到端加密系统通常不允许对消息的目的地址进行加密, 这是因为每一个消息所经过的节点都要用此地址来确定如何传输消息。由于这种加密方法不能掩盖被传输消息的源点与终点, 因此它对于防止攻击者分析通信业务是脆弱的。3 系统的总体分析3.1 网际协议分析网络层是TCP/IP协议栈的核心组件,网际协议(Internet Protocol)是网络层的最重要协议。它为Internet以及其他基于IP的网络上的所有数据通信提供了基本服务。IP的首要任务是:隐藏各种数据传输层之间的差异,并且为不同的网络技术提供一种统一的表示。总的来说,IP实现了如下功能: 提供了无连接的、不安全的数据报服务; 定义了IP数据报是数据传输的基本单元; 定义了IP寻址机制; 在各种互联网络之间路由、转发IP数据报; 验证包的生存期; 分片、组装包; 使用ICMP输出错误。IP的开发思路是,即使有一些传输故障存在,仍能维持两个之间的通信。因此,IP的开发基础是数据报交换原理。IP的头字段如图1:图1 IP首部 4位版本号:表示IP的版本,现有IPv4和IPv6; 4位首部长:表示IP首部长,值域为515; 8位TOS字段:包括3位优先权字段(已废弃),4位TOS子字段和1位未用位(必须为0); 16位IP数据报总长度,包括头部; 16位标志位:为此IP数据报的唯一标志(同一数据报分片后此相同); 3位标志:用于分片于组装的标志位; 13位片偏移:用于确定组装分片的顺序; 8位生存时间:限定路由次数,避免无用数据报长期占用网络资源; 8位协议:标记上层协议类型; 16位首部检验和:首部检验和存放与其中,作用为检验IP头正确性;在Linux系统中IP头部以结构体方式实现,定义在include/linux/ip.h中:struct iphdr #if defined(_LITTLE_ENDIAN_BITFIELD)_u8ihl:4,version:4;#elif defined (_BIG_ENDIAN_BITFIELD)_u8version:4, ihl:4;#else#errorPlease fix #endif_u8tos;_u16tot_len;_u16id;_u16frag_off;_u8ttl;_u8protocol;_u16check;_u32saddr;_u32daddr;/*The options start here. */;3.2 套接字结构分析NextPrevListStampDevHNhMacDstLen.HeadDataTailendSk_buff_headHeadroomMac地址Ip头传输层头数据tailroomSk_buffSk_buff图2 套接字缓存结构图在Linux系统TCP/IP协议栈设计中的一个基本概念就是套接字缓存,称作sk_buff,在整个联网代码中用于存储各种信息。它满足了网络协议对内核的存储器管理能力提出的很多要求。这些要求包括能方便的操作可变长缓存,能在缓存的头部和尾部填加数据,能从缓存中移除数据,并能尽量减少这些操作所做的数据复制。它被定义在include/linux/skbuff.h中,其结构表示如图2:由图2可见,套接字缓存由两部分组成: 报文数据:该存储区域保存了实际在网络中传输的数据; 管理数据:当一个报文在Linux内核中进行处理时,内核需要额外的数据,这些数据没有必要存储在实际的报文当中。这些主要是实现方式中特有的数据(指针、计数器等)。他们构成了协议实例间交换的接口控制信息。套接字缓存是用来定位和管理一个报文在内核中被处理的整个周期的。当应用程序向一个套接字传输数据后,该套接字就创建相应的套接字缓存并将有效数据的地址存入此结构的变量中。在报文穿过层的过程中,每一层的报文的头信息被插入到有效数据之前。由于为报文头申请了足够的空间,所以避免了在报文头之后对有效数据的多次拷贝。有效数据只被拷贝了两次,一次是从用户空间到内核空间,一次是到达网卡的时候。3.3 Linux下IPv4的实现对于基于TCP/IP协议实现的网络来说,IP层是完成数据传输的必要层,网络层以上的包都要经过网络层。数据包可以从三处进入具体的网络层: 通过网络适配器抵达计算机的包会存储在对应的输入队列中。判定了数据链路层中的三层协议后,上层协议为IP的包会传递给ip_rcv()函数。 第二处入口位于传输层协议接口处。这些是TCP、UDP等协议用到的包。这些协议使用ip_queue_xmit()函数将他们打包成IP包并发送出去。还有一些其他函数也能生成IP包。 第三种情况就是:IP层自动主动生成IP包。这些包主要是新的多播包、大型包的碎片及不含专门有效负载的ICMP包或者IGMP包。这些包是用特殊的方法创建的(如icmp_send())。包一旦进入了网络层,就会有多种退出选择。对IP而言,我们一般只区分计算机可扮演的两种不同角色,其中第一种是第二种的特例。 终端系统:Linux计算机正常情况下会配置成终端系统它会用作工作站或者服务器。主要负责的任务是运行用户应用程序或者提供应用程序服务。终端系统的基本属性是,它们不会转发IP包。也就是说,如果系统实际上只有一块网络适配器,即可认定它是终端系统。即使有多种网络访问的系统也可以配置成终端系统只要禁用包转发即可。 路由器:路由器将抵达一块网络适配器的IP包传递给另一块网络适配器。也就是说,路由器拥有多块在本地接口之间转发包的网络适配器。包抵达路由器之后,一般有两种选择:可以本地投寄(即传递给上层协议处理);或者,可以转发包。因此,路由器可以看作是终端系统的一般化,它还有额外的包转发功能。与终端系统相反,路由器一般不会启动任何应用程序,以此确保尽可能快的转发包。Linux内核中IP包流经网络层时,其主要途径如图3。首先分析传入包的情况。Ip_rcv()进行一些IP协议工作。首先,该函数丢弃那些并非去往本地计算机的包;接着过滤掉包头错误的包,主要是检验它的尺寸是否至少相当于IP包头,包是否是IPv4,检验和是否正确,包的长度是否错误。然后再把包传递给ip_rcv_finish()。Ip_rcv_finish()中激活ip_route_input()函数以决定包的路由。接下来,ip_rcv_finish检查IP头是否含有选项。如果确定含有选项,则分析这些选项并创商业源代码,全套计算机毕业设计免费下载 更多全套设计联系QQ:1042897696最新设计大全 /sf/20100915/3539.html建一个ip_options的结构;所有选项设置都会有效的存储在这个结构中。最后在ip_rcv_finish()中,IP流程走到了一个岔路口:包是去往本地还是被转发: 遇到应该投递给本地计算机的单播包或多播包时,则进入ip_local_deliver(); 遇到需要转发的单播包则进入ip_forward(); 遇到需要转发的多播包则交给ip_mr_input()处理;由于这里路径出现分支,而针对个人计算机,一般不开启转发功能,在这里只描述包的本地投寄。不需要转发的数据包被ip_rcv_finish()传递给ip_local_deliver()。Ip_local_deliver()的首要任务是利用ip_defrag()组装那些分片后的包。接着,流程流向ip_local_deliver_finish()。在这里会需要为下一步处理判定传输协议。在这里,分析包的传出流程。本地创建的包在处理时与传入时是完全独立的。首先,创建IP头的函数不只一个,而是多个,其中包括了ip_queue_xmit()、ip_build_and_send_pkt()和ip_push_pending_frames()。每个函数针对某项特殊用法进行了定制和优化。其中ip_build_and_send_pkt()只处理TCP连接过程中的SYN/ACK等包,而ip_queue_xmit()函数来自上层协议的其他包,ip_push_pending_frames()处理ip层自身的包。它们首先会检查套接字结构中路由。若尚未选择路由,则启用ip_route_output()选出一个路由。接着会填充IP包的各个字段(版本、包头长度、TOS字段、碎片偏移量、地址级协议字段)。然后,会由ip_options_build()添加可能存在的IP选项。最后计算检验和。然后流程流经ip_queue_xmit2()等函数,最后到达链路层,由链路层继续处理。3.4 DES算法介绍美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。加密算法要达到的目的(通常称为DES 密码算法要求)主要为以下四点: 提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改: 具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握; DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础; 实现经济,运行有效,并且适用于多种完全不同的应用。 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES/Data Encryption Standard)。 目前在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。图4 DES流程图通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。DES算法是把64位明文输入块变成64位密文输出块,其流程图如图4:其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则见下表:58,50,12,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17, 9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,即将输入的第58位换到第一位,第50位换到第2位,.,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0 是右32位,例:设置换前的输入值为D1D2D3.D64,则经过初始置换后的结果为:L0=D58D50.D8;R0=D57D49.D7。经过16次迭代运算后。得到L16、R16,将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置的逆运算,例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位,其逆置换规则如下表所示:40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,34,2,42,10,50,18,58 26,33,1,41, 9,49,17,57,25,放大换位表32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32, 1,单纯换位表16,7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,2,8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25,在f(Ri,Ki)算法描述图中,S1,S2.S8为选择函数,其功能是把6bit数据变为4bit数据。下面给出选择函数Si(i=1,2.8)的功能表:选择函数SiS1:14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,S2:15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,S3:10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,S4:7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,S5:2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,S6:12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,S7:4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,S8:13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,在此以S1为例说明其功能,我们可以看到:在S1中,共有4行数据,命名为0,1、2、3行;每行有16列,命名为0、1、2、3,.,14、15列。现设输入为: DD1D2D3D4D5D6令:列D2D3D4D5行D1D6然后在S1表中查得对应的数,以4位二进制表示,此即为选择函数S1的输出。下面给出子密钥Ki(48bit)的生成算法:初始Key值为64位,但DES算法规定,其中第8、16、.64位是奇偶校验位,不参与DES运算。故Key 实际可用位数便只有56位。即:经过缩小选择换位表1的变换后,Key 的位数由64 位变成了56位,此56位分为C0、D0两部分,各28位,然后分别进行第1次循环左移,得到C1、D1,将C1(28位)、D1(28位)合并得到56位,再经过缩小选择换位2,从而便得到了密钥K0(48位)。依此类推,便可得到K1、K2、.、K15,不过需要注意的是,16次循环左移对应的左移位数要依据下述规则进行:循环左移位数1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1以上介绍了DES算法的加密过程。DES算法的解密过程是一样的,区别仅仅在于第一次迭代时用子密钥K15,第二次K14、.,最后一次用K0,算法本身并没有任何变化。4 系统的设计与实现4.1 系统的总体设计内核嵌入部分主要实现对套接字缓存的数据即skbuff-data进行加密、解密。在内核中定义的函数均在linux/include/net/ip.h中声明。对于IP包的加密状况,这里采用设置加密位来标志该IP包是否被加密,而由于IP头中的TOS字段作为优先权的高3位已经废弃,为了减少内核的大小,采取把TOS最高位置1作为加密标志。以次判断包是否应该解密。对于如何判断一个包是否应该加密,设计为判断目的IP地址。设计思路为把需要加密发送的目的IP地址存放到一个定义为全局变量的链表中。该链表在内核运行期间始终有效,并声明为模块可读写。链表结构体定义在ip.h中:extern struct iplistunsigned int ip;struct iplist *next;iplist;定义一个全局变量:struct iplist *list;并声明为模块可读写:EXPORT_SYMBOL(list);通过模块对用户文件/home/ip.list和/home/rm_ip.list读取实现对list的插入和删除。通过对list的查询来判断发送包是否应该加密。4.2 模块部分的设计与实现由于模块主要是针对链表和文件的操作,为了能够使多个模块都能使用到这些函数,采取把一些主要函数定义在内核中。具体位置为net/ipv4/myfile.c,里面的函数主要是涉及到对全局变量list的操作。首先定义直接对链表操作的函数: void init_iplist(struct iplist *list),初始化链表,EXPORT_SYMBOL(init_iplist)声明为模块可用; void insert_iplist(struct iplist *list, unsigned int ipaddr),链表插入操作函数,插入位置为紧接头部之后。由于网络通信的特点是短时间内发往同一目的地址的数据包一般情况下最频繁。这样可以减少查询链表的时间; int query_iplist(struct iplist *list, unsigned int ipaddr)。链报查询操作函数,在链表未初始化时返回2,链表中存在ipaddr时返回1,不存在则返回0,EXPORT_SYMBOL(query_iplist)声明为模块可用。定义对文件的操作,文件部分的函数均声明为模块可用: struct file *list_fopen(const char *filename, int flags, int mode),定义在内核中打开文件的操作; void list_fclose(struct file *filp),定义对文件的关闭操作; int list_fread(char *buf, int len, struct file *filp),定义对文件的读操作。由于内核中对文件的读写操作要求缓存buf为用户空间变量,所以操作的时候要避免内核对变量地址的检查; int list_fgetc(struct file *filp),通过调用list_fread()函数实现按1个字节读取;其他函数的定义,以下函数也均声明为模块可用: void my_atoi(char *buf, unsigned int *ipaddr),把点分十进制的IP地址转换为32位无符号整形数。但是按点分段从右到左转换,以保证于套接字缓存中的目的IP地址方式一致; void init_iplist_byfile(struct file *fp, struct iplist *list),根据文件对list进行插入操作。功能模块主要包含对list的插入操作、删除操作和读操作,对DES密匙的修改。模块是Linux系统为防止内核不断扩大而设计的一种体系,它能运行于内核态,可以自由加载和删除,增加了系统的灵活性。针对2.6版本内核,模块的编写方法大致如下,egmodule.c:#include #include int function1().函数体.void functionx().函数体.void functiony().函数体.module_init(functionx);module_exit(functiony);MODULE_LICENSE(GPL);然后利用make,gcc编译成可执行的模块,makefile内容为:ifneq ($(KERNELRELEASE),) obj-m := egmodule.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif分别编写模块insertlist、deletelist、showlist、和repdeskey: insertlist主要实现读取文件/home/ip.list中的点分十进制IP地址插入 list中,如果list中已经存在的IP地址则不需再插入; deletelist主要实现读取文件/home/rm_ip.list中的点分十进制IP地址,并删除list中与之相同的IP地址; showlist主要实现查看list中的IP地址; repdeskey主要实现修改DES加密算法的密匙。4.3 DES算法实现与DES相关函数全部定义在文件net/ipv4/des.c中。由于套接字缓存中skbuff-data为数据开始,但是其并不是标准字符串(即不是以0结尾)的头指针。所以在次先多DES加密算法做一些修改,即添加一个参数,表示需加密的长度。而由于IP包的一个特点是,数据的长度为8的整数倍,所以这里的DES算法可以不考虑对字符串的填充。DES算法的主要实现思想为定义一个长度为64的unsigned char类型的字符数组把字符串的每8字节按位存储在该字符数组中。密匙也用基本相同的方法处理。加密算法的所有操作都以数组元素为单位操作,减少了位操作的烦琐。Des.c中定义的所有函数如下: extern void bytetobit(unsigned char *, unsigned char *),16轮迭代过后,把字符数组,每字节用位表示; extern void initper(unsigned char *, unsigned char *),对传入数据的初始置换,同时按每位没字节存放到字符数组中; extern void expper(unsigned char *, unsigned char *),数据右半部分的扩展置换; extern void keyper(unsigned char *, unsigned char *),密匙替换; extern void pper(unsigned char *),P盒置换; extern void tailper(unsigned char *),末置换; extern void cvrtdata(int, unsigned char *, unsigned char *),把数据分成8字节每块; extern void packper(int, int, unsigned char *, unsigned char *),生成每轮密匙; extern void sproc(unsigned char *, unsigned char *),S盒处理; extern void des(int, unsigned char *, int, unsigned char *),DES主函数; extern void decskb(struct sk_buff *skb)和extern void encskb(struct sk_buff *skb)实现对套接字缓存的操作。在这里给出几个重要函数的实体:DES算法主程序:void des(int mode, unsigned char *data, int datalen, unsigned char *key)unsigned char *s, keyw48, keybyte56, databyte64, bufdata64, expdata48, tempdata32;int i, iternm, len = 0;s = data;keyper(key,keybyte);/*密匙置换,每位以1字节表示*/while (len datalen) for (i = 0; i 8; +i, +len) cvrtdata(i, s ,databyte);/*数据分块,并扩展为每位用1字节表示*/initper(bufdata, databyte);/*初始置换*/for(iternm = 0; iternm 16; +iternm) /*16轮迭代*/packper(mode, iternm, keybyte, keyw);/*得到压缩的48位密匙*/for (i = 0; i 32; +i)tempdatai = bufdata32 + i;expper(tempdata, expdata);/*得到扩展的48位数据*/for (i = 0; i 48; +i)expdatai = keywi;/*数据密匙异或*/sproc(expdata, tempdata);/*s盒子处理*/pper(tempdata);/*p盒置换*/for (i = 0; i 32; +i)tempdatai = bufdatai;/*与左半部异或*/if (iternm 15) /*前15轮左右交换*/for (i = 0; i 32; +i) bufdatai = bufdata32 + i;bufdata32 + i = tempdatai;else /*最后1轮不交换*/for (i = 0; i tail - skb-data;unsigned char *data;data = skb-data + (skb-nh.iph-ihl * 4);des(1,data, i, DES_KEY);;Decskb函数实体:void decskb(struct sk_buff *skb)int i = skb-tail - skb-data;unsigned char *data;data = skb-data +(skb-nh.iph-ihl * 4);des(0, data, i, DES_KEY);;4.4 对内核函数的修改修改的内核函数主要在net/ipv4/ip_output.c和net/ipv4/ip_input.c中。主要通过对list的查询和加密位的检查调用加密算法实现对数据的加密解密。在ip_input.c中的ip_local_deliver()函数中decskb()需被调用,对套接字缓存中IP头以后的数据进行解密。并检查list,如果list中没有该源IP地址,则插入:/* * Decrypt the skb whose destination is in the list. */if (skb-nh.iph-tos) & 128) skb-nh.iph-tos &= 127;printk(KERN_ALERT ip_local_deliver(),decrypt!n);/*测试语句*/decskb(skb);if (list = NULL)init_iplist(&list);if (!query_iplist(list, skb-nh.iph-saddr)insert_iplist(list, skb-nh.iph-saddr);而由于数据包传出过程中有多处进入IP层的接口,所以在ip_output.c中也分别在ip_build_and_send_pkt()、ip_queue_xmit()和ip_push_pending_frames()中encskb()需被调用。由于在加密过程中需要对TOS字段进行设置,所以应该在计算IP头检验和之前调用,以避免多次计算检验和。/* * Set the bit that is for encryption and encrypt. */if (!(iph-t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论