一种基于ICMP协议的文件安全传输方法与流程

文档序号:12182714阅读:834来源:国知局
一种基于ICMP协议的文件安全传输方法与流程

本发明属于网络安全领域,涉及一种基于ICMP协议的文件安全传输方法。



背景技术:

传统的互联网上的文件传输方法一般是基于HTTP协议、HTTPS协议、FTP协议、SFTP协议、TFTP协议等进行文件传输的。按照国际标准化组织(ISO)制定的OSI(Open System Interconnection)7层模型,这些文件传输协议都是属于应用层上的文件传输协议。

然而,在某些使用场合,并没有使用TCP或者UDP协议的条件,由于防火墙限制或者其他网络方面的限制等原因,会导致这些传统的文件传输方法失效。有些防火墙经过管理员配置后,会限制一些端口比如21、22、69、80、443的访问,或者过滤特定目标端口的报文,从而导致基于TCP、UDP的文件传输方法失败。

ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。它是TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。此IP报文由IP头、ICMP头、数据区构成。如图1所示,ICMP有一个8字节长的报文头,其中前4个字节是固定的格式,包含1字节类型字段,1字节代码字段和2字节的校验和;后4个字节根据ICMP包的类型而取不同的值。一般数据区是用来存储4字节的时间信息,用于计算网络传输的延迟大小。数据区也可以承载其他用户定义信息。

ICMP提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。我们在网络中经常会使用到ICMP协议,比如我们经常使用的用于检查网络通不通的Ping命令(Linux和Windows中均有),这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的网络命令如跟踪路由的Tracert命令也是基于ICMP协议的。ICMP协议的传统用途并不是为了用于文件传输。

文件传输协议按照是否加密分为两类,明文传输和密文传输。文件明文传输在传输的过程中容易被窃听,安全程度不高,但处理的效率相对高些。密文传输协议传输过程中很难被破译得到实际文件内容,安全程度很高,但进行加密解密操作相对比较消耗CPU时间。由于目前硬件设备的计算速度提高,并且人们对信息安全的要求越来越高,所以数据传输过程中一般都进行适当加密,满足数据的高速传输同时也同时防止信息被窃听。



技术实现要素:

一种基于ICMP协议的安全文件传输方法,本发明中将此方法暂命名为SFTIP(Secure File Transmission based on ICMP Protocal)。

本发明公开了一种在网络层上进行文件传输的方法,能够实现基于ICMP协议的网络层上的文件传输,并且传输过程中信息处于加密状态,无法被窃听;采用滑动时间窗传输方法发送和接收报文,保证信息的传输效率;基于文件分块与校验和确认技术,支持数据的重传并保证数据的完整一致性。相比传统的基于应用层上的文件传输方法,本发明有着特殊的用途。本发明兼容目前的各种路由器并能够穿越一些防火墙,实现文件的安全高效传输,具有较高的实用价值。

本发明涉及到通讯双方之间的文件传输,这里将连接的发起端命名为A端,连接接收端命名为B端。A端指的通讯客户端,用于上传文件到服务器或者下载文件到本机。B端指的是服务端,用于接收A端发送的文件或者将文件下传给A端。

一种基于ICMP协议的安全文件传输方法,主要的步骤包括:

步骤701,将ICMP协议数据分区。基于ICMP协议,构造双方的全部的通讯报文。将ICMP协议数据区分为3个部分,SFTIP类型(或称子类型),SFTIP数据(或称子数据),SFTIP校验和(或称子校验和),如图2所示。SFTIP类型为1字节整数,表示SFTIP此帧报文的类型,按照SFTIP报文的类别统一进行编码,相互区分。SFTIP数据为承载的文件分块内容或者其他通讯控制内容,是数据收发的关键部分。SFTIP校验和为2字节整数,为SFITP类型与SFITP数据全部字节的校验和,用于验证报文的准确性。

步骤702,过滤无效的ICMP报文。通讯双方创建原始套接字,用于发送和接收ICMP报文。接收时候接收全部IP网络报文,且只保留ICMP报文。若接收到的报文中的SFTIP类型和本方法规定的报文类型不一致,或者SFTIP校验和不一致,则忽略此报文,有可能路由器等其他设备发送的干扰ICMP报文信息,可以直接忽略,数据接收到后只处理有效的报文。

步骤703,通讯双方协商秘钥。通讯初始化,双方协商获取用于传输文件加密的秘钥。

这里将初始通讯请求端称为A端,初始通讯接收端称为B端。A端采用RSA算法,生成公钥Pu_A,私钥Pr_A,文件秘钥Pf_A。B端采用RSA算法,生成公钥Pu_B,私钥Pr_B,文件秘钥Pf_B。其中文件秘钥Pf_A用于加密A端的文件报文,文件秘钥Pf_B用于加密B端的文件报文。私钥用于对文件秘钥进行解密,公钥用于对文件秘钥进行公开加密。

步骤704,文件传输初始化。A端请求进入文件传输状态,将公钥发送给B端;B端同时生成通讯唯一的会话编号sessioin_id,此编号在一次会话中唯一;一次会话表示的是从A端开始连接直到A端主动退出传输状态或者超时退出传输状态的时间范围;B端采用公钥A端的公钥加密自己的公钥后发送给A端。

A端采用B端的公钥加密文件秘钥Pf_A后发送给B端,B端采用采用A端的公钥加密文件秘钥Pf_B发送给A端。加密算法采用RSA加密算法。

文件传输按传输方向分为Put模式(上传)和Get模式(下载),Put模式表示文件由A端发往B端,Get模式表示文件由B端发往A端。用户选择是否为文件上传或者文件下载。若为文件上传,将上传的文件名,文件长度,文件编号信息发送给B端,请求B端文件上传;若为文件下载,只将需要下载的文件名发送给B端。

步骤705,文件传输。文件发送端,对文件进行分块,并计算每块的校验和,组织数据后发送。

文件发送和接收采用滑动时间窗方法,定义k,w两个参数。其中k表示发送方在有k个文件分块报文未得到对方的确认时,将停止数据传送。w表示接收方最迟在接收了w个文件分块报文后应发出认可。k,w的取值范围为1到32767,一般k取值12,w取值8。

分块确认帧中包含部分最需要传输的文件块范围,用于通知发送端重新发送或者继续发送,支持文件续传。

采用本发明中的方法,由于通讯双方基于ICMP协议进行通讯,能够避开防火墙对一些通讯端口的限制。由于采用的非对称算法RSA加密,即使数据被窃听也无法被解密。采用滑动时间窗的数据收发方法, 能够大大减少发送端和接收端之间的交互频率,从而提高发送效率。基于文件分块与校验和确认技术,使得能够支持数据部分重传并保证数据传输过程中的一致性。

本发明并没有采用更为复杂的证书服务器进行通讯端身份认证,主要是从协议的使用方便角度考虑,因此和没有身份认证的应用层数据传输协议一样,仍然存在“中间人攻击”方法,使得数据传输过程中可以被窃取。攻击的方法为,双向欺骗方法。假设有一台服务器C,可以全面拦截A与B之间的任何数据通讯,C伪造A的公钥用一个假的公钥Pu_C1发送给B,同时伪造一个假的公钥Pu_C2发送给A,使得A,B之间的相互使用的公钥都是假冒的,C用自己的两个私钥来解密A,B之间的通讯,于是C可以获得任何A,B方的任何文件秘钥Pf_A,Pf_B。不过攻击此方法并不一定能够次次成功,因为需要至少成功拦截3次ICMP发送接收响应请求,才能成功欺骗通讯双方,得到文件传输的秘钥。如果不存在中间人攻击者,第三方无法从嗅探的报文中逆向得到任何私钥信息,从而数据无法被解码。即使存在中间人攻击者,实施此中间人攻击也将具有一定的难度。从实用的角度上来说,此协议仍然是安全的。

附图说明

图1表示现有的用于传输ICMP信息的IP帧报文;

图2表示本发明用于传输数据的SFTIP报文区,对应着图1中的数据区;

图3表示本发明数据请求端(A端或客户端)执行文件发收的流程图;

图4表示本发明数据接收端(B端或服务端)执行文件收发的流程图;

图5表示本发明A端流程图3中的一个子模块,A端文件接收流程图;

图6表示本发明B端流程图4中的一个子模块,B端文件发送路程图;

图7表示基于ICMP协议的文件传输总体步骤;

表1表示本发明用于传输数据的通讯报文类型(SFTIP类型)定义。

具体实施方式

本发明中,将初始连接请求端称为A端,可以接收与发送文件;将初始连接接收端称为B端,等待A端的指令来进行发送或者接收文件。A端也可以称为客户端,B端也可以称为服务端。本发明中采用非对称加密算法采RSA进行秘钥协商,采用对称加密算法DES或者AES算法加密进行文件传输加密,RSA_Encrypt表示RSA加密算法,RSA_Decrypt表示RSA解密算法,DES_Encrypt表示DES加密算法,DES_Decrypt表示DES解密算法,详细步骤包括:

构造ICMP通讯数据区,将ICMP数据区分为3个部分,分别承载不同类型的数据信息。包含SFITP类型,SFITP数据,SFITP校验和。SFITP类型表示通讯的报文类型编号,详见参考表1。其中SFITP校验和为SFITP类型与SFITP数据全部字节的校验和。SFTIP数据区用于承载本发明中的各种类型数据,包括秘钥协商信息、通讯初始化信息、文件传输信息。

通讯双方创建原始套接字,用于发送和接收ICMP报文,并过滤无效ICMP报文。接收时候接收全部IP网络报文,且只保留ICMP报文。若接收到的报文中的SFTIP类型和本方法规定的报文类型不一致,或者SFTIP校验和不一致,则忽略此报文,有可能路由器等其他设备发送的干扰ICMP报文信息,可以直接忽略,数据接收到后只处理有效的报文。

步骤301,A端,首先生成A端的公钥Pu_A,私钥Pr_A,随机A端文件秘钥Pf_A,通讯双方第一次握手请求,发送表1中PacketReqest1报文,告知B端自己的公钥Pu_A。创建原始套接字进行收发ICMP报文信息,秘钥协商初始化开始。

步骤401,B端,首先创建原始套接字,设置为可接收网卡所有的IP网络层报文信息,并只处理ICMP报文信息,过滤其他干扰信息。生成B端的公钥Pu_B,和私钥Pr_B,B端文件随机秘钥Pf_B。

步骤402,B端,得到A端的公钥Pu_A。

步骤403,B端,生成一个状态session_id编码,表示唯一的会话状态,直到文件全部收发完毕,期间的session_id都是不变的。构造信息块Block2:(session_id,Pu_B)构造第一次握手响应报文,采用A端的公 钥Pu_A加密。PacketReply2:E_Block2=RSA_Encrypt(Block2,Pu_A),发送表1中PacketReply2报文。

步骤302,A端,得到B端的公钥Pu_B。其中信息采用Pr_A进行解密。

步骤303,A端,通讯双方第二次握手请求发送表1中PacketReqest3:(E_Block3)报文,其中Block3:(session_id,Pf_A),然后采用B端的公钥加密,E_Block3=RSA_Encrypt(Block3,Pu_B)。

步骤404,B端,接收E_Block3,采用B端私钥解密,Block3=RSA_Decrpt(E_Block3,Pr_B),其中Block3:(session_id,Pf_A)得到A端文件秘钥Pf_A。

步骤405,B端,构造信息块Block4:(session_id,Pf_B),采用A端的公钥加密E_Block4=RSA_Encrypt(Block4,Pu_A),发送表1中PacketReply4报文。

步骤304,A端,接收PacketReply4:(E_Block4),Block4=RSA_Decrpt(E_Block4,Pr_A),其中Block4:(session_id,Pf_B),得到B端的文件秘钥Pf_B。到此,秘钥协商初始化完成。

步骤305,用户选择是上传模式(Put或Upload)模式还是下载(Get或Download)模式。如果是Get(文件下载)模式,则进入步骤312A端文件下载子流程图,默认则进入PUT(文件上传)模式。

PUT(文件上传)模式开始,步骤306,A端将要上传的文件摘要信息发送给B端,发送表1中PacketReqU1报文:(E_Block5),其中Block5:(session_id,filename1,file_id,file_length),E_Block5=DES_Encrypt(Block5,Pf_A),session_id为会话的唯一编号,filename1指的是要上传的文件名,file_id是A端生成的唯一文件编号,用于区分不同的文件,file_length为文件的长度。

步骤406,B端,接收报文,根据接收到的SFTIP类型,并验证报文是否正确。如果为SFTIP类型PacketReqU1请求,则进入文件上传模式。

步骤407,B端,解码PacketReqU1:(E_Block5)报文,其中Block5=DES_Decrypt(E_Block5,Pf_A),Block5:(session_id,filename1,file_id,file_length),得到需要上传的文件描述信息。

步骤408,B端,文件上传响应,发送表1中PacketRepU2:(E_Block6)报文,其中Block6:(session_id,msg),msg信息用于描述当前文件是否已经存在的状态编码。E_Block6=DES_Encrypt(Block6,Pf_A)。

步骤307,A端,收到PacketRepU2:(E_Block6),Block6=DES_Decrpt(E_Block6,Pf_A),其中Block6:(session_id,msg),得到文件的上传信息编码。

步骤308,A端,进入文件发送流程。对文件filename1分块,每块一般采用1024字节,记录块号,并计算每块的校验和block_checksum。

步骤309,A端,文件块单独发送PacketFileRequest报文。发送的文件块编号之间并不一定连续。每一个文件分块报文info_block_i,由文件编号file_id和文件的块号block_id,构造info_block_i=(session_id,file_id,block_id,file_block_i,block_checksum),其中file_block_i为当前文件块的内容。采用DES算法加密报文,得到e_info_block_i=DES_Encrypt(info_block_i,Pf_A)。发送表1中PacketFileRequest报文。一段时间内最多发送K组未经过确认的报文。如果已经有K组报文没有确认了,则等待被确认了再发送,等待超时后可以选择继续等待或者退出文件发送流程。

步骤409,B端,文件分块接收PacketFileRequest报文。对每一个文件分组info_block_i,由文件秘钥Pf_A进行解密info_block_i=DES_Decrypt(E_info_block_i,Pf_A)。得到info_block_i=(session_id,file_id,block_Id,file_block_i,block_checksum)。

一段时间内最多接收w组报文,就必须发送410中的确认报文。

步骤410,B端,构造确认信息块block_reply:(session_id,file_id,from_block_id1,block_count1,from_block_id2,block_count2,...,from_block_idN,block_countN),from_block_id和block_count指的是还需要发送的文件块起始编号和还需要发送的连续文件块个数。确认信息块中不必包含所有的未发送的文 件块范围值,只需要最近的范围就行,假设这样的待传文件块范围共有N组。当文件全部接收到以后,N=0,则不存在待传文件范围块字段,表示文件传输完毕。E_block_reply=DES_Encrypt(block_reply,Pf_A)。发送表1中PacketFileReply:(E_block_reply)报文。继续409和410的步骤,直到全部文件分块成功接收完毕。

步骤310,A端,接收确认帧,获取未接收到的数据信息和需要重新传送帧的信息,重新进行文件分组发送,直到全部文件分块成功发送完毕。

步骤411,B端,将所有的文件分组合并生成文件filename1。然后再接收或者发送其他文件。

步骤311,A端,继续发送或者接收其他文件,直到用户主动退出。到此,PUT模式完成。

步骤312流程和步骤412流程为GET(下载)模式,与PUT(上传)模式类似。当用户选择文件下载流程的时候,如图5、图6所示。

GET(下载)模式开始,步骤501,A端,发送请求下载文件指令表1中PacketReqD1:(E_blockD1)报文,其中BlockD1:(session_id,filename2),filename2为请求获取的文件名,其中E_BlockD1=DES_Encrypt(BlockD1,Pf_B)。

步骤601,B端获取下载请求PacketReqD1,接收获取A端的请求E_BlockD1,解码后得到文件名:BlockD1=DES_Decrypt(E_BlockD1,Pf_B),其中BlockD1:(session_id,filename2),filename2为请求获取的文件名。

步骤602,B端,打开文件filename2,获取文件长度按1024字节分块,记录块号,并计算每一块的校验和。

步骤603,B端发送表1中PacketReplyD2下载响应,构造信息块,BlockD2:(session_id,filename2,file_id,file_length),采用A端的公钥Pu_A加密。PacketReplyD2:E_BlockD2=DES_Encrypt(BlockD2,Pf_B)。

步骤502,A端接收下载响应PacketReplyD2,解码,BlockD2=DES_Decrypt(E_BlockD2,Pf_B)BlockD2:(session_id,filename2,file_id,file_length),得到目标文件的大小,编号信息。

步骤604,B端,文件块分组发送。文件块之间并不一定连续。每一个文件分组info_block_i,由文件编号file_id和文件的组号block_id,构造info_block_i=(session_id,file_id,block_id,file_block_i,checksum),其中file_block_i为当前文件块的内容,采用DES算法加密报文,得到e_info_block_i=DES_Encrypt(info_block_i,Pf_B),发送分组表1中PacketFileRequest:(e_info_block_i),一段时间内最多发送k组未经过确认的报文,如果已经有k组报文没有确认了,则等待确认了再发送,等待超过一定的时间可以选择退出文件传输流程。

步骤503,A端,文件块分组接收。文件接收块之间并不一定连续。对每一个文件分组info_block_i,由文件秘钥Pf_B进行解密info_block_i=DES_Decrypt(E_info_block_i,pf_B),

其中info_block_i:(session_id,file_id,block_id,file_block_i,block_checksum)。

步骤504,A端,一段时间内最多接收到w组报文,就必须发送确认报文。发送确认帧,获取未接收到的数据信息和需要重新传送帧的信息,继续进行文件分块发送,直到全部文件块成功发送完毕。block_ReqD:(session_id,file_id,from_block_id1,block_count1,from_block_id2,block_count2,...,from_block_idN,block_countN),发送表1中PacketFileReply:E_block_ReqD=DES_Encrypt(block_ReqD,Pf_B),为确认报文。继续步骤503,直到接收任务全部成功。

步骤605,B端,接收确认帧,获取需要继续传送的文件块范围信息,从确认范围处开始继续发送文件。继续604步骤,直到发送任务全部成功。

步骤505,A端,当所有文件块接收完毕后,合并全部文件块,生成得到filename2。文件下载完毕。 到此,GET(下载)模式完毕。

表1 通讯报文类型定义

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1