一次性口令实验重置部分

 // chongzhi.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#include <windows.h>
#include <fstream>
#include<iostream>

#include "md5.h"
using namespace std;

void update();
void record();

struct inf  //用户存储的信息结构
{
	char uid[50]; //用户名
	char password[50]; //密码
	char answer[50]; //应答值
	int r;   //随机数
	int N;   //挑战值 
};
inf infor[300];  //最多有300个用户 
int i,n=0;       //全局变量n,用于表示是目前系统中用户数,目前是五个 
FILE *p,*p2;
 

void init()    
{
	char uid[50],password[50],answer[50];
	int r,N;
	fstream file; 
	file.open("d:\\lib.txt",ios::in);
	if(!file);
	else
	{
		while(file>>uid>>answer>>r>>N)     //将文件中的uid、password赋值给结构体 
		{
			strcpy(infor[n].uid,uid);
			//strcpy(infor[n].password,password);
			strcpy(infor[n].answer,answer);
			infor[n].r=r;
			infor[n].N=N;
			//cout<<infor[n].uid<<"  "<<infor[n].password<<"  "<<endl;  //读出原来文件的uid、password
			n++;
		}
	}
	file.close();
}

int main()
{ 
	init();
	int i,j,r,N,temp;
	FILE *fp;
	char uid[10]={'\0'},password[50]={'\0'},answer[50],ans[100]={'\0'};
	 
	fp=fopen("d:\\client用户名.txt","r");
	fscanf(fp,"%s",uid) ;
	fclose(fp);


	fp=fopen("d:\\pwd.txt","r");
	fscanf(fp,"%s",password);	 
	fclose(fp);

	for(i=0;i<n;i++)
	{
		if(strcmp(infor[i].uid,uid)==0)
		{

			srand(time(0));
			r=rand();
			infor[i].r=r;  //相当于服务器给用户一个随机数r 

			N=rand()%999/11; 
			infor[i].N=N; //相当于服务器给用户一个挑战值N 

			j=0; 
			temp=r;
			while(temp!=0)
			{
				j++;
				temp/=10;
			}

			while(r!=0)
			{
				j--;
				ans[j]=r%10+'0';
				r/=10;
			}
			strcat(ans,password);  //将r与password拼接  

			for(j=0;j<N;j++)
			{
				strcpy(ans,MD5String(ans));  //计算n次数的md5值 
			} 

			strcpy(answer,MD5String(ans));	// 再进行一次md5存放在answer中
			strcpy(infor[i].answer,answer);			 
			 
			update();

			MessageBox(NULL,TEXT("已重置"),TEXT("提示"),MB_OK | MB_SYSTEMMODAL);
			 

		}
	}
	 
	return 0;
}   

void update()
{

	FILE *fp;
	fp = fopen("d:\\lib.txt","w+");//打开模式可以换成其他
	for(i=0;i<n;i++)
	{
		fprintf(fp,"%s %s  %d %d \n",infor[i].uid,infor[i].answer,infor[i].r,infor[i].N);//就这么简单用fprintf函数写数据
	}
	fclose(fp);
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值