1、 简述网络层加密的实现 摘 要 随着网络技术在各行各业中的广泛应用,网络安全逐渐成为一个重要的问题。Linux是一个优秀的、开源的操作系统,非常适合作为一些新技术的测试平台。本文修改Linux操作系统内核的网络协议,以实现对网络通信数据的加密。先介绍了网络数据加密的发展和现状。接着分析了网际协议、DES加密算法和Linux下的网际协议的实现和套接字结构。然后,实现了DES算法,对内核进行了修改,添加了一些功能性内核模块。在此基础上设计和实现了一个位于IP层的端到端加密的系统,整个系统嵌入到Linux内核中,可以通过内核模块对其进行操作,来实现其功能。该系统的主要特点是针对IP地址判断是
2、否进行加密操作。最后,通过测试验证了系统设计的正确性。 关键字:网络层;Linux内核;端到端;加密;模块;网络通信 The Implementation of Encryption and Decryption at Net Layer based on Linux Abstract With the abroad use of network technology in various trades, network security is becoming an important issue. Linux is an excellent Open-source
3、Operating System and is very suitable for the test of some new technology. In this paper, the network protocol stack of the Linux operating system kernel is changed to encrypt network communication data. Firstly, introduces the development and actuality of the network data encryption. Secondly, anal
4、yses the inernet protocol, the DES encryption algorithm, and the implementation of internet protocol and the socket structure in the linux kernel. Whereafter, realizes the DES algorithm, changes the kernel, and adds some functional kernel modules. And then, an IP end-to-end encryption system is desi
5、gned and implemented, and it is embeded in the linux kernel, we can achieve its function through kernel module. Lastly, a test is given to testify the correctness of the design. Key Words: Net layer; Linux kernel; End-to-end; Encrypt; Module; Network communications 目 录 论文总页数:23页 1 引言 1
6、 2 网络数据加密技术 1 2.1 链路加密 1 2.2 节点加密 2 2.3 端到端加密 2 3 系统的总体分析 3 3.1 网际协议分析 3 3.2 套接字结构分析 5 3.3 Linux下IPv4的实现 6 3.4 DES算法介绍 8 4 系统的设计与实现 12 4.1 系统的总体设计 12 4.2 模块部分的设计与实现 13 4.3 DES算法实现 15 4.4 对内核函数的修改 18 5 网络层加密系统的测试 18 结 论 21 参考文献 21 1 引言 随着网络技术的发展,网络安全也就成为当今网络社会的焦点中的焦点,几乎没有人不在谈论
7、网络上的安全问题,病毒、黑客程序、邮件炸弹、远程侦听等这一切都无不让人胆战心惊。病毒、黑客的猖獗使身处今日网络社会的人们感觉到谈网色变,无所适从。 但我们必需清楚地认识到,这一切一切的安全问题我们不可一下全部找到解决方案,况且有的是根本无法找到彻底的解决方案,如病毒程序,因为任何反病毒程序都只能在新病毒发现之后才能开发出来,目前还没有哪能一家反病毒软件开发商敢承诺他们的软件能查杀所有已知的和未知的病毒,所以我们不能有等网络安全了再上网的念头,因为或许网络不能有这么一日,就象“矛”与“盾”,网络与病毒、黑客永远是一对共存体。 现代的网络加密技术就是适应了网络安全的需要而应运产生的,它为我们
8、进行一般的电子商务活动提供了安全保障,如在网络中进行文件传输、电子邮件往来和进行合同文本的签署等。其实加密技术也不是什么新生事物,只不过应用在当今电子商务、电脑网络中还是近几年的历史。 当今网络社会选择加密已是我们别无选择,其一是我们知道在互联网上进行文件传输、电子邮件商务往来存在许多不安全因素,特别是对于一些大公司和一些机密文件在网络上传输。而且这种不安全性是互联网存在基础——TCP/IP协议所固有的,包括一些基于TCP/IP的服务;另一方面,互联网给众多的商家带来了无限的商机,互联网把全世界连在了一起,走向互联网就意味着走向了世界,这对于无数商家无疑是梦寐以求的好事,特别是对于中小企业。
9、为了解决这一对矛盾、为了能在安全的基础上大开这通向世界之门,我们只好选择了数据加密和基于加密技术的数字签名。 2 网络数据加密技术 2.1 链路加密 对于在两个网络节点间的某一次通信链路, 链路加密能为网上传输的数据提供安全保证。对于链路加密(又称在线加密), 所有消息在被传输之前进行加密, 在每一个节点对接收到的消息进行解密, 然后先使用下一个链路的密钥对消息进行加密, 再进行传输。在到达目的地之前, 一条消息可能要经过许多通信链路的传输。 由于在每一个中间传输节点消息均被解密后重新进行加密, 因此, 包括路由信息在内的链路上的所有数据均以密文形式出现。这样, 链路加密就掩盖了被传输
10、消息的源点与终点。由于填充技术的使用以及填充字符在不需要传输数据的情况下就可以进行加密,这使得消息的频率和长度特性得以掩盖, 从而可以防止对通信业务进行分析。 尽管链路加密在计算机网络环境中使用得相当普遍, 但它并非没有问题。链路加密通常用在点对点的同步或异步线路上, 它要求先对在链路两端的加密设备进行同步, 然后使用一种链模式对链路上传输的数据进行加密。这就给网络的性能和可管理性带来了副作用。 在线路/信号经常不通的海外或卫星网络中,链路上的加密设备需要频繁地进行同步, 带来的后果是数据丢失或重传。另一方面, 即使仅一小部分数据需要进行加密, 也会使得所有传输数据被加密。 在一个网络节
11、点, 链路加密仅在通信链路上提供安全性, 消息以明文形式存在, 因此所有节点在物理上必须是安全的, 否则就会泄漏明文内容。然而保证每一个节点的安全性需要较高的费用, 为每一个节点提供加密硬件设备和一个安全的物理环境所需要的费用由以下几部分组成: 保护节点物理安全的雇员开销, 为确保安全策略和程序的正确执行而进行审计时的费用, 以及为防止安全性被破坏时带来损失而参加保险的费用。 在传统的加密算法中, 用于解密消息的密钥与用于加密的密钥是相同的,该密钥必须被秘密保存, 并按一定规则进行变化。这样, 密钥分配在链路加密系统中就成了一个问题, 因为每一个节点必须存储与其相连接的所有链路的加密密钥,
12、这就需要对密钥进行物理传送或者建立专用网络设施。而网络节点地理分布的广阔性使得这一过程变得复杂, 同时增加了密钥连续分配时的费用。 2.2 节点加密 尽管节点加密能给网络数据提供较高的安全性, 但它在操作方式上与链路加密是类似的:两者均在通信链路上为传输的消息提供安全性,都在中间节点先对消息进行解密,然后进行加密。因为要对所有传输的数据进行加密,所以加密过程对用户是透明的。 然而,与链路加密不同, 节点加密不允许消息在网络节点以明文形式存在,它先把收到的消息进行解密, 然后采用另一个不同的密钥进行加密, 这一过程是在节点上的一个安全模块中进行。 节点加密要求报头和路由信息以明文形式传输
13、 以便中间节点能得到如何处理消息的信息。因此这种方法对于防止攻击者分析通信业务是脆弱的。 2.3 端到端加密 端到端加密允许数据在从源点到终点的传输过程中始终以密文形式存在。采用端到端加密(又称脱线加密或包加密), 消息在被传输时到达终点之前不进行解密, 因为消息在整个传输过程中均受到保护, 所以即使有节点被损坏也不会使消息泄露。 端到端加密系统的价格便宜些, 并且与链路加密和节点加密相比更可靠,更容易设计、实现和维护。端到端加密还避免了其它加密系统所固有的同步问题, 因为每个报文包均是独立被加密的, 所以一个报文包所发生的传输错误不会影响后续的报文包。此外,从用户对安全需求的直觉上讲
14、 端到端加密更自然些。单个用户可能会选用这种加密方法, 以便不影响网络上的其他用户, 此方法只需要源和目的节点是保密的即可。 端到端加密系统通常不允许对消息的目的地址进行加密, 这是因为每一个消息所经过的节点都要用此地址来确定如何传输消息。由于这种加密方法不能掩盖被传输消息的源点与终点, 因此它对于防止攻击者分析通信业务是脆弱的。 3 系统的总体分析 3.1 网际协议分析 网络层是TCP/IP协议栈的核心组件,网际协议(Internet Protocol)是网络层的最重要协议。它为Internet以及其他基于IP的网络上的所有数据通信提供了基本服务。IP的首要任务是:隐藏各种数据传输
15、层之间的差异,并且为不同的网络技术提供一种统一的表示。 总的来说,IP实现了如下功能: Ø 提供了无连接的、不安全的数据报服务; Ø 定义了IP数据报是数据传输的基本单元; Ø 定义了IP寻址机制; Ø 在各种互联网络之间路由、转发IP数据报; Ø 验证包的生存期; Ø 分片、组装包; Ø 使用ICMP输出错误。 IP的开发思路是,即使有一些传输故障存在,仍能维持两个之间的通信。因此,IP的开发基础是数据报交换原理。IP的头字段如图1:图1 IP首部 Ø 4位版本号:表示IP的版本,现有IPv4和IPv6; Ø 4位首部长:表示IP首部长,值域为5—15; Ø
16、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 { #
17、if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix
18、addr; __u32 daddr; /*The options start here. */ }; 3.2 套接字结构分析 3.3 Linux下IPv4的实现 3.4 DES算法介绍 美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。加密算法要达到的目的(通常称为DES 密码算法要求)主要为以下四点: Ø 提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改: Ø 具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握;
19、 Ø DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础; Ø 实现经济,运行有效,并且适用于多种完全不同的应用。 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES/Data Encryption Standard)。 目前在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。 DES算法的入
20、口参数有三个: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加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点
21、数据到达目的地后,用同样的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,
22、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次迭代
23、运算后。得到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,2
24、5, 放大换位表 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...
25、S8为选择函数,其功能是把6bit数据变为4bit数据。下面给出选择函数Si(i=1,2......8)的功能表: 选择函数Si S1: 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
26、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
27、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,
28、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,
29、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
30、列,命名为0、1、2、3,......,14、15列。 现设输入为: D=D1D2D3D4D5D6 令:列=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位
31、合并得到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进行加密、解密。在内核中定义的函数均
32、在linux/include/net/ip.h中声明。 对于IP包的加密状况,这里采用设置加密位来标志该IP包是否被加密,而由于IP头中的TOS字段作为优先权的高3位已经废弃,为了减少内核的大小,采取把TOS最高位置1作为加密标志。以次判断包是否应该解密。 对于如何判断一个包是否应该加密,设计为判断目的IP地址。设计思路为把需要加密发送的目的IP地址存放到一个定义为全局变量的链表中。该链表在内核运行期间始终有效,并声明为模块可读写。链表结构体定义在ip.h中: extern struct iplist{ unsigned int ip; struct iplist *next;
33、 }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
34、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
35、时返回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为
36、用户空间变量,所以操作的时候要避免内核对变量地址的检查; Ø 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),根据文件对li
37、st进行插入操作。
功能模块主要包含对list的插入操作、删除操作和读操作,对DES密匙的修改。模块是Linux系统为防止内核不断扩大而设计的一种体系,它能运行于内核态,可以自由加载和删除,增加了系统的灵活性。
针对2.6版本内核,模块的编写方法大致如下,egmodule.c:
#include
38、nctiony() { ... 函数体 ... } 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:
39、 $(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主要实现修改D
40、ES加密算法的密匙。 4.3 DES算法实现 与DES相关函数全部定义在文件net/ipv4/des.c中。 由于套接字缓存中skbuff->data为数据开始,但是其并不是标准字符串(即不是以‘\0’结尾)的头指针。所以在次先多DES加密算法做一些修改,即添加一个参数,表示需加密的长度。而由于IP包的一个特点是,数据的长度为8的整数倍,所以这里的DES算法可以不考虑对字符串的填充。 DES算法的主要实现思想为定义一个长度为64的unsigned char类型的字符数组把字符串的每8字节按位存储在该字符数组中。密匙也用基本相同的方法处理。加密算法的所有操作都以数组元素为单位操作,减少了
41、位操作的烦琐。 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 *
42、 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 *,
43、 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) { uns
44、igned char *s, keyw[48], keybyte[56], databyte[64], bufdata[64], expdata[48], tempdata[32]; 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(bu
45、fdata, databyte);/*初始置换*/ for(iternm = 0; iternm < 16; ++iternm) {/*16轮迭代*/ packper(mode, iternm, keybyte, keyw);/*得到压缩的48位密匙*/ for (i = 0; i < 32; ++i) tempdata[i] = bufdata[32 + i]; expper(tempdata, expdata);/*得到扩展的48位数据*/ for (i = 0; i < 48; ++i) expdata[i] ^= k
46、eyw[i];/*数据密匙异或*/ sproc(expdata, tempdata);/*s盒子处理*/ pper(tempdata);/*p盒置换*/ for (i = 0; i < 32; ++i) tempdata[i] ^= bufdata[i];/*与左半部异或*/ if (iternm < 15) {/*前15轮左右交换*/ for (i = 0; i < 32; ++i) { bufdata[i] = bufdata[32 + i]; bufdata[32 + i] = tempdata[
47、i]; } } else {/*最后1轮不交换*/ for (i = 0; i < 32; ++i) bufdata[i] = tempdata[i]; } }/*迭代结束*/ tailper(bufdata);/*末置换*/ bytetobit(s, bufdata);/*把以字节表示的位转换为位表示*/ s += 8; } }; Encskb函数实体: void encskb(struct sk_buff *skb) { int i = skb->tail - skb->data;
48、 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 对内核函数的修改 修改的内
49、核函数主要在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
50、 &= 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






