// 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);
}
一次性口令实验重置部分
最新推荐文章于 2023-10-17 16:40:17 发布