# 文件加密传输系统 **Repository Path**: tangguangmin/FileTransmission ## Basic Information - **Project Name**: 文件加密传输系统 - **Description**: No description available - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-10-13 - **Last Updated**: 2022-06-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # **文件传输系统设计** ## 1. **Socket通信** Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 socket()函数 int socket(int domain, int type, int protocol); socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。 socket函数的三个参数分别为: | **名称** | **含义** | **名称** | **含义** | | -------------------------- | ----------------- | ---------------------- | ------------------------ | | **PF_UNIX,PF_LOCAL** | 本地通信 | **PF_X25** | ITU-T X25 / ISO-8208协议 | | **AF_INET,PF_INET** | IPv4 Internet协议 | **PF_AX25** | Amateur radio AX.25 | | **PF_INET6** | IPv6 Internet协议 | **PF_ATMPVC** | 原始ATM PVC访问 | | **PF_IPX** | IPX-Novell协议 | **PF_APPLETALK** | Appletalk | | **PF_NETLINK** | 内核用户界面设备 | **PF_PACKET** | 底层包访问 | domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。 type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。 | **名称** | **含义** | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------- | | **SOCK_STREAM** | Tcp连接,提供序列化的、可靠的、双向连接的字节流。支持带外数据传输 | | **SOCK_DGRAM** | 支持UDP连接(无连接状态的消息) | | **SOCK_SEQPACKET** | 序列化包,提供一个序列化的、可靠的、双向的基本连接的数据传输通道,数据长度定常。每次调用读系统调用时数据需要将全部数据读出 | | **SOCK_RAW** | RAW类型,提供原始网络协议访问 | | **SOCK_RDM** | 提供可靠的数据报文,不过可能数据会有乱序 | | **SOCK_PACKET** | 这是一个专用类型,不能呢过在通用程序中使用 | protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。 TCP通信 ![](file:///C:/Users/Lenovo/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)![](image/README/1634109531330.png) tcp 编程一般的步骤: | | **server(服务端)** | **client(客户端)** | | ----------- | ------------------------ | ------------------------------- | | **1** | new个socket | new个socket | | **2** | bind(IP,port) | bind(IP,port) | | **3** | listen,等待客户端的连接 | | | **4** | accept接受客户端的连接 | connect (server.ip,server,port) | | **5** | 接收(recv)发送数据(send) | 接收(recv)发送数据(send) | | **6** | 关闭连接 | 关闭连接 | **2. ****文件传输** 文件发送将文件进行分片传输,每次传输不大于4096字节。 **1. ** **file_length = File_Length(fr); ** **//** **得到文件大小**** ** **2. ****n = (file_length%DEFAULT_BUFFER)? ** **3. ** ** ((file_length/DEFAULT_BUFFER)+1):(file_length/DEFAULT_BUFFER);** **//** **对文件进行切片,每****4096****字节一片**** ** **4. ** **rmd = (file_length%DEFAULT_BUFFER)?(file_length%DEFAULT_BUFFER):DEFAULT_BUFFER; ** **//** **剩余最后一片长度的字节**** ** 每一片文件信息传输包的格式定义如下: ```cpp typedef struct { 2. int file_tag; [//]()是否最后一片标志位 3. int file_rmd; //最后一片文件字节长度 4. char buffer[DEFAULT_BUFFER]; //要发送的文件字节 5. }File_Info; ``` 若发送的文件大小是4096个字节,则file_tag=0; file_rmd=0; 若发送的文件为最后一片,则file_tag=1; file_rmd=rmd; **1. ****fread(file_packet.buffer, 1, DEFAULT_BUFFER, fr); ** **2. **** ** **if** **(i!=n) ** **3. **** file_packet.file_tag = 0; file_packet.file_rmd = 0; ** **4. **** ****else**** ** **5. **** file_packet.file_tag = 1; file_packet.file_rmd = rmd; ** **6. ** ** sendto(sock, (** **char**** *)&file_packet, ** **sizeof** **(file_packet), 0, ** **7. ** ** (** **struct**** sockaddr far *)&raddr, ** **sizeof** **(raddr)); ** 文件接收:接收到文件并直接保存。 **1. ** **recv(udp_receiver, (** **char**** *)&file_packet, ** **sizeof** **(File_Info), 0); ** **2. **** ****if** ** (file_packet.file_tag == 0) ** **//** **是否最后一片标志位** **3. --- fwrite(file_packet.buffer, 1, DEFAULT_BUFFER, fp); ** **//** **非最后一片接收****4096****字节** **4. **** ****else**** ** **5. **** { ** **6. ** ** fwrite(file_packet.buffer, 1, file_packet.file_rmd, fp); ** **//** **最后一片接收****rmd****个字节** **7. **** ** **break** **; ** **8. **** } ** **3. ****RSA加密** RSA加解密公式 加密:公钥(E,N) 密文=(明文^E) mod N 解密:密钥(D,N) 明文=(密文^D) mod N RSA的安全基于大数分解的难度。公钥和私钥是一对大素数的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积。 **RSA密钥产生的过程:** 1) ``` 随机选择两个不相等的质数p和q。 ``` 2) ``` 计算p和q的乘积n,n=pq。 ``` 3) ``` 计算n的欧拉函数φ(n)。 ``` 4) ``` 随机选择一个整数e,条件是1