课程设计:FTP的设计与实现
一、目的
Internet提供了很多类型的网络服务,这些服务实际上都是应用层的服务。FTP服务是基于TCP协议的网络服务。
文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议。通过完成一个文件传送协议FTP的实现,学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP网络应用程序基本的设计方法和实现技巧。
二、内容和要求
每两人一组,分别实现FTP协议客户端程序和服务器程序。
客户端程序具有文件列表、下载文件、上传文件等常用功能。服务器程序支持改变工作目录、文件列表、下载文件等常用的服务。
因为FTP协议比较复杂,为了简单起见,客户端只实现FTP客户端协议的一个子集,总的来说有以下几个功能:
连接到指定的FTP服务器;
断开和主机的连接;
进入子目录;
退出子目录;
列出服务器当前目录下的所有文件
从服务器下载指定的文件到本地(可以同时指定多个文件连续下载)
从本地上传指定的文件到服务器
实现以上几个功能时会涉及到下面的几个FTP命令:
USER username
PASS password
CWD directory-name
PORT host-port
TYPE A or I
RETR filename
STOR filename
LIST directory
用户界面应该能够为程序输入下面的信息:
服务器主机名
用户名、口令
数据的传送类型
要进入的服务器目录
要下载的远程文件名
要上载的本地文件名和远程文件名
同时,界面也为用户输出以下的信息:
FTP服务器上的文件和目录列表
从服务器返回的应答
使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1)创建Socket;
(2)打开连接到Socket的输入/出流;
(3)按照一定的协议对Socket进行读/写操作;
(4)关闭Socket.
第三步是程序员用来调用Socket和实现程序功能的关键步骤,其他三步在各种程序中基本相同。
/********************************/
#include <>
#include <>
#include <>
#pragma comment(lib,"")
#define DEFAULT_PORT 2302
#define DEFAULT_BUFFER 2048
#define DEFAULT_MESSAGE "This is a test of the emergency \ broadcasting system" char szServerip[128], delDEL;szMessage[7]='t';
.",strlen("125 Transfering...") )==0)
{
if( (fpre=fopen(filename,"w")) == NULL )
{
printf("open errer");
return 1;
}
printf("bSendOnly=%d\n",bSendOnly);
while(!bSendOnly)
{
n",filename);
. \r\n");
ret = send(sClient, szBuffer, strlen(szBuffer), 0);
fclose(fpse);
return 0;
}
int pwdfun(SOCKET sClient)
{
int ret;
char *MSG="pwd$";
char szBuffer[160];
strcpy(szMessage, MSG);
ret = send(sClient, szMessage, strlen(szMessage), 0);
if (ret == 0)
return 1;
else if (ret == SOCKET_ERROR)
{
printf("send() failed: %d\n", WSAGetLastError());
return 1;
}
printf("Send %d bytes\n", ret);
printf("bSendOnly=%d\n",bSendOnly);
while(!bSendOnly)
{
deldeldeldel LOOPLOOP del. \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
sy_error=0;
break;
}
\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
}
} n",inet_ntoa,ntohs);
} . \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
while (fgets(temp_buffer,80,fin)!=NULL)
{
sprintf(sbuffer,"%s",temp_buffer); . \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
system("del ");
. \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
ns_data = socket(AF_INET, SOCK_STREAM, 0);
}
sy_error=0;
return 0;
}
int sgetfun(SOCKET newsocket)
{
printf("RETR mode.\r\n");
int i=4,k=0;
char filename[20],temp_buffer[80];
Please try again.\r\n",filename);
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
sprintf(sbuffer, "226 Transfer completed... \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
return 1;
}
else
printf("The file %s found,ready to transfer.\n",filename);
sprintf(sbuffer, "125 Transfering... \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
while (fgets(temp_buffer,80,fp)!=NULL)
{
sprintf(sbuffer,"%s",temp_buffer); . \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
}
sy_error=0;
return 0;
}
int sputfun(SOCKET newsocket)
{
printf("Equivalent to put. \n");
int i=4,k=0;
char filename[20];
n",filename);
while(1)
{
. \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
char temp_buffer[160];
while (fgets(temp_buffer,80,fin)!=NULL)
temp_buffer[strlen(temp_buffer)-1]='\0';
printf("temp_buffer=%s",temp_buffer);
. \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
system("del ");
. \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
ns_data = socket(AF_INET, SOCK_STREAM, 0);
}
sy_error=0;
return 0;
}
int scdfun(SOCKET newsocket)
{
int i=3,k=0;char name[20],name2[20];
int j,count=0;",2)==0)
{
pathlen=strlen(path);
for(j=pathlen-1;j>=0;j--)
{
if(path[j]=='\\')
{
path[j]='\0';
count++;
}
if(count==2)
{
. \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
deldel. \r\n");
bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);
if (bytes == SOCKET_ERROR)
{
HandleError("recv()");
sy_error=1;
return 1;
}
sy_error=0;
return 0;
}
void HandleError(char *func)
{
char info[65]= {0};
_snprintf(info, 64, "%s: %d\n", func, WSAGetLastError());
printf(info);
}
RSA算法 1978年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。 RSA的安全性依赖于大数难于分解这一特点。公钥和私钥都是两个大素数(大于100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。 密钥对的产生。选择两个大素数,p 和q 。计算:n = p * q 然后随机选择加密密钥e,要求e 和( p - 1 ) * ( q - 1 )互质。最后,利用Euclid 算法计算解密密钥d, 满足e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q 不再需要,应该丢弃,不要让任何人知道。加密信息m(二进制表示)时,首先把m分成等长数据块m1 ,m2,..., mi ,块长s,其中2^s <= n, s 尽可能的大。对应的密文是:ci = mi^e ( mod n ) ( a ) 解密时作如下计算:mi = ci^d ( mod n ) ( b ) RSA 可用于数字签名,方案是用( a ) 式签名,( b )式验证。具体操作时考虑到安全性和m信息量较大等因素,一般是先作HASH 运算。RSA 的安全性。RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA 就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前,RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解140多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。 由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。 */ #include
RC4 加密算法 C 语言实现 代码文件名 RC4.cpp Encrypt.h (代码详见后文) 备注:将以上两个文件放在相同的路径(建议不要放在中文路径 下)编译执行!编译环境 Microsoft Visual C++ 6.0 C-Free 5.0 代码解释 RC4 加密算法是大名鼎鼎的RSA 三人组中的头号人物Ron Rivest 在1987 年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box 长度可为任意,但一般为256字节。该算法的速度可以达到DES 加密的10倍左右。 RC4 算法的原理很简单,包括初始化算法和伪随机子密码生成算法两大部分。假设S-box 长度和密钥长度均为为n。先来看看算法的初始化部分(用类C伪代码表示): for (i=0; i } 得到的子密码sub_k用以和明文进行xor运算,得到密文,解密过程也完全相同。 RC4加密算法在C++中的实现: RC4函数(加密/解密):其实RC4只有加密,将密文再加密一次,就是解密了。 GetKey函数:随机字符串产生器。 ByteToHex函数:把字节码转为十六进制码,一个字节两个十六进制。十六进制字符串非常适合在HTTP中传输。 HexToByte函数:把十六进制字符串,转为字节码。。 Encrypt函数:把字符串经RC4加密后,再把密文转为十六进制字符串返回,可直接用于传输。 Decrypt函数:直接密码十六进制字符串密文,再解密,返回字符串明文。 源代码 以下为Encrypt.h文件代码 #ifndef _ENCRYPT_RC4_ #defi ne _ENCRYPT_RC4_ #in clude 课程设计报告 课程设计名称: C语言程序设计 指导教师: 学生: 学号: 学院:电子信息工程学院 完成时间: 2011年9月27日 嘉应学院电子信息工程学院 1 C语言课程设计说明书 目录 1 需求分析 (1) 2总体设计 (2) 3详细设计 (3) 3.1 换位加密流程图 (3) 3.2 换位解密流程图 (4) 3.3 替代加密流程图 (5) 3.4 替代解密流程图 (6) 4调试与测试 (8) 5测试结果 (8) 6附录 (11) I 1 需求分析 问题描述(实验指导书中已经给出) ①数据的输入和输出;要求使用文件操作。文件(明文,仅限于英文字母)存放在某一已知文本文件中,加密后的文件(密文)存放在另一文件中。 ②换位加密和解密: 加密:根据密钥(即移位位数,用户从键盘输入)将对应字符进行移位操作,输出密文;解密:输入密文后再输入移位位数则可输出明文; ③凯撒加密和解密: 加密:根据密钥(即移位位数,用户从键盘输入)将对应字符进行移位操作,输出密文;解密:输入密文后再输入移位位数则可输出明文; ④统计单词的个数; ⑤退出。 2总体设计 (程序设计总流程图,可以画带流程线的流程图) 此处只需要写出一个流程图就可以了,就是总的那个流程图,请规范的画图。不需要分出2.1和2.2. 开始 welcome() caidan() transpen( ); transpde( ) caesaren( ) caesarde() mingwent miwentongji(byebye() 3详细设计 (各模块功能说明,如函数功能、入口及出口参数说明,函数调用关系描述等 这块大家问题最多了,这里不是写程序代码,而是写流程图里面各个主要函数的作用,函数之间关系的说明。 以第1题为例,此处应为: 3.1 换位加密流程图 流程图 (对流程图加以说明。可以把关键语句放在此处,加以注释说明) 建立mingwen.txt 和miwen.txt 文件 输入密钥n 输入明文到数组r k=strlen(r)j 计算数组r 长度 for i=0 to k 关闭并保存mingwen.txt 文件 打开mingwen.txt 文件 space(h,r) 将明文去空格并放到数组h 中 m=strlen(h) 计算数组h 长度 m%n==0 是 否 hang=m/n hang=m/n+1 j=0 for i=0 to hang for i=m to hang*n z=0 fputc(r[i],mingwen) 将明文存放到mingwen.txt 文件中 for j=0 to n h[i]='a'+j j++ for i=0 to hang zl[i][j]=h[z] z++ for j=o to n zl[i][j]=h[z] z++ C语言实现文件的des加解密实例 c语言中的正则 ,d3.js画矢量图+可拖拽的实现思路 DOM2级事件处理程序跨浏览器兼容事件 ,exel导入/导出和csv文件导入、导出 ,Go http访问使用代理 golang进行socket通讯 ,hessian+hibernate 懒加载处理 ,HTML+CSS代码橙色导航菜单html5 撞球游戏 // get 网络请求 func Get(api string,params .Values)(rs[]byte ,err error){ var *. ,err=.Parse(api) if err!=nil{ fmt.Printf("解析错误:\r\n%v",err) return nil,err } //如果参数中有中文参数,这个方法会进行Encode //iOS KVO注册和监听方法 //C语言websocket编程 .RawQuery=params.Encode() resp,err:=http.Get(.String()) if err!=nil{ fmt.Println("err:",err) return nil,err } defer resp.Body.Close() return ioutil.ReadAll(resp.Body) } // post 网络请求 ,params 是.Values类型 func Post(api string, params .Values)(rs[]byte,err error){ resp,err:=http.PostForm(api, params) if err!=nil{ return nil ,err } defer resp.Body.Close() return ioutil.ReadAll(resp.Body) } //代码描述:基于GO的黄金数据接口调用代码实例 //关联数据:黄金数据 //css之before and after [代码] [C#]代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ;(完整word版)电子系c语言程序设计加密解密
C语言实现文件的des加解密实例
RSA加解密算法C语言的实现