资源简介
一次性口令机制鉴别流程
第一步:认证请求(用户名)。第二步:依据用户名,查找并发送挑战(R,N)。第三步:计算并发送应战(HN(PW‖R ))。第四步:计算应战HN (PW‖R ) 的散列值
。第五步:取出HN+1 (PW‖R ),H(HN (PW‖R))=HN+1 (PW‖R) ?
代码片段和文件信息
#include “md5.h“
#include
#include
#include
#include
#include
using namespace std;
struct inf //用户存储的信息结构
{
char uid[50]; //用户名
char answer[50]; //应答值
int r; //随机数
int N; //挑战值
char password[50]; //密码
};
inf infor[300]; //最多有300个用户
int n=0; //全局变量n,用于表示是目前系统中用户数
void init()
{
char uid[50]answer[50]password[50];
int Nrtemp;
fstream file;
file.open(“lib.txt“ios::in);
if(!file);
else
{
while(file>>uid>>answer>>r>>N>>password) //将文件中的uid、answer、r、N、password赋值给结构体
{
strcpy(infor[n].uiduid);
strcpy(infor[n].answeranswer);
infor[n].r=r;
infor[n].N=N;
strcpy(infor[n].passwordpassword);
//cout< n++;
}
}
file.close();
}
void reg() //用户注册
{
char uid[50]password1[50]password2[50]ans[100]={0}answer[50];
int Nritemp;
while(1)
{
cout<<“请输入用户名: “;
cin>>uid;
for(i=0;i if(strcmp(infor[i].uiduid)==0)
{
cout< break;
}
if(i==n) break; //如果没有用户名不重复,则下一步
}
while(1)
{
cout<<“请输入密码: “;
cin>>password1;
cout<<“请再次输入密码: “;
cin>>password2;
if(strcmp(password1password2)==0) break;
else
{
cout< }
}
srand(time(0));
r=rand();
infor[n].r=r; //相当于服务器给用户一个随机数r
N=rand()%999/11;
infor[n].N=N; //相当于服务器给用户一个挑战值N
//N=3; //用于测试
//infor[n].N=N;
i=0;
temp=r;
while(temp!=0)
{
i++;
temp/=10;
}
while(r!=0)
{
i--;
ans[i]=r%10+‘0‘;
r/=10;
}
strcat(anspassword1); //将r与password拼接
for(i=0;i {
strcpy(ansMD5String(ans)); //计算n次数的md5值
}
strcpy(answerMD5String(ans)); // 再进行一次md5存放在answer中
strcpy(infor[n].uiduid);
strcpy(infor[n].answeranswer);
strcpy(infor[n].passwordpassword1);
n++;
cout< system(“pause“);
system(“cls“);
}
void check() //身份认证
{
char uid[50]answer[50]ans[100]={0}password[50];
int Nrijtemp;
char ch;
cout<<“请输入用户名: “;
cin>>uid;
for(i=0;i {
if(strcmp(infor[i].uiduid)==0)
{
cout<<“随机数r为: “< cout<<“挑战值N为: “< cout<<“是否返回进行应答值计算(y/n): “;
cin>>ch;
if(ch==‘y‘) cout<
else if(ch==‘n‘)
{
cout<<“请输入应答值: “;
cin>>answer;
if(strcmp(MD5String(answer)infor[i].answer)==0)
{
printf(“\n“);
cout<<“认证通过!“;
printf(“\n“);
strcpy(infor[i].answeranswer);
infor[i].N=infor[i].N-1;
fstream f;
f.open(“lib.txt“ios::out);
for(j=0;j {
f<
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 354 2019-04-02 18:50 一次性口令\lib.txt
文件 792 2019-05-08 21:45 一次性口令\Makefile.win
文件 8210 2019-04-01 18:45 一次性口令\md5.h
文件 6274 2019-04-02 18:42 一次性口令\OTP.cpp
文件 1008 2019-04-01 19:58 一次性口令\OTP.dev
文件 1367409 2019-05-08 21:45 一次性口令\OTP.exe
文件 192 2019-05-09 22:03 一次性口令\OTP.layout
文件 70655 2019-04-02 18:42 一次性口令\OTP.o
目录 0 2019-05-10 12:31 一次性口令
----------- --------- ---------- ----- ----
1454894 9
评论
共有 条评论