学习笔记之网络软件设计(三)

任务三 认证与数据传输


一、要求

模拟一种CHAP的认证方法
用户与服务器之间都持有密码:12345
连接上服务器后,服务器将向客户机发送质询数据,该质询数据由N个整数构成,N是随机的,整数长度可能是两个字节,也可能是4个字节。
客户机将这N个整数相加,把总和与密码相异或,得到质询结果,传回给服务器

服务器收到质询结果后,验证这个结果是否正确,并给与响应

二、与任务相关的实验

06-网络字节序
07-服务与协议
11-多路复用
14-状态与有限状态机设计

三、完成过程

定义结构体:
struct Message
{
	int num_2bit;
	int num_4bit;
	int result;
	char buf[MAXSIZE];
};

随机生成N个整数,并计算求和:
struct Message message;

//随机产生2字节和4字节的整数
srand(time(NULL));
int n = rand()*255/RAND_MAX;
message.num_2bit = rand()*n/RAND_MAX;
message.num_4bit = n-message.num_2bit;

//将整数存入char数组
for(i=0; i<message.num_2bit; i++)
{
	int temp = rand()*65535/RAND_MAX;
	message.buf[i<<1] = temp;
	message.buf[i<<1|1] = temp>>8;
}

for(i=0; i<message.num_4bit; i++)
{
	double temp = (double)rand()*0x7fffffff/RAND_MAX;
	message.buf[message.num_2bit*2+i*4] = (int)temp;
	message.buf[message.num_2bit*2+i*4+1] = (int)temp>>8;
	message.buf[message.num_2bit*2+i*4+2] = (int)temp>>16;
	message.buf[message.num_2bit*2+i*4+3] = (int)temp>>24;
}

服务器与客户端对所有整数进行求和:
int sum;

for(i=0; i<message.num_2bit; ++i)
{
	sum += (int)message.buf[i<<1];
	sum += (int)message.buf[i<<1|1]*256;
}
for(i=0; i<message.num_4bit; ++i)
{
	sum += (int)message.buf[message.num_2bit*2+i*4];
	sum += (int)message.buf[message.num_2bit*2+i*4+1]*256;
	sum += (int)message.buf[message.num_2bit*2+i*4+2]*256*256;
	sum += (int)message.buf[message.num_2bit*2+i*4+3]*256*256*256;
}

再让结果与相应的密码异或,得到用来验证身份的结果:
message.result = sum^12345;

sock通信中还可以直接传送结构体:
int sndlen = 12 + message.num_2bit*2 + message.num_4bit*4 + 1;

send(ns, (char*)&message, sndlen, 0);

四、小结

了解了下简单认证的过程。。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值