电子科技大学电子工程学院课程设计(一次性口令设计)课程名称:信息安全概论任课老师:熊万安专业:信息对抗技术小组成员:张基恒学号:2011029180014一、【实验目的】(1)了解口令机制在系统安全中的重要意义。(2)掌握动态生成一次性口令的程序设计方法。二、【实验要求】(1)编写一个一次性口令程序(2)运行该口令程序,屏幕上弹出一个仿Windows窗口,提示用户输入口令,并给出提示模式。(3)用户输入口令,按照一次性算法计算比较,符合,给出合法用户提示;否则给出非法用户提示。(4)再一次运行口令程序,如果输入与第一次同样的口令,系统应当拒绝,提示非法用户。每次提示和输入的口令都是不一样的。(5)写出设计说明(含公式、算法,随机数产生法,函数调用和参数传递方式)。三、【实验设备与环境】(1)MSWindows系统平台(2)设计语言:C语言四、【实验方法步骤】(1)选择一个一次性口令的算法(2)选择随机数产生器(3)给出口令输入(密码)提示(4)用户输入口令(密码)(5)给出用户确认提示信息(6)调试、运行、验证。五、【程序流程和功能】密码系统设计为两个部分:一个服务器上的密码系统和一个用户手持的密码器。程序使用两重认证,分别在于认证密码系统用户的真伪和认证密码生成器的真伪。使用方法为:a)用户分别登陆服务器和密码器,这分别需要两个用户自己掌握的密码。b)登陆服务器后,服务器自动生成一个9位数随机码。c)用户将随机码输入手持的密码器,由密码器生成一次性密码;同时,服务器用相同的算法生成该一次性密码。d)用户在服务器上输入一次性密码,如果密码吻合,则可以进入功能性页面操作。系统的优点在于:a)将两种密码按网络和物理分开,两者由相同的一次性密码算法相关,但是密码器本身没有能力生成关键的9位随机码。b)用户只能通过密码器获得最终的一次性密码,而密码器本身和密码器的密码由用户自己掌握,从物理上隔绝了密码攻击的风险。由于能力问题和演示方便,我将系统简化,并且把两个密码部分放在一个程序里模拟。设计流程为:程序流程为:六、【实验结果截图】1、用户登录2、密码验证3、生成99位随机码4、随机码输入验证5、生成一次性密码七、【心得体会】通过本次课程设计,我对密码算法特别是一次性密码有了更深的理解,对密码安全的实现有了新的体会。通过结合课上知识和生活实际设计密码系统并用CC程序实现,我对这么课的理解有了进一步加深。同时通过课程设计加强了我运用用C语言编写程序解决实际问题的思维能力。由于个人能力问题,我设计的系统不能真正实现,我编写的程序和密码算法也相对简单,密码的保密性还不够。但相信随着能力提高,我最终可以实现这一设计。附源程序:#includestdio.h#includestdlib.h#includetime.h#includestring.h#includeconio.hvoidINI(){inta;intp=920323;printf(USERNAM:LNJLNJ\n);printf(PASSWORD:);scanf(%d,&a);if(a==p){printf(验证正确\n);printf(\n);}else{printf(输入错误,还有两次机会\n);printf(PASSWORD:);scanf(%d,&a);if(a==p){printf(验证正确\n);printf(\n);}else{printf(输入错误,还有一次机会\n);printf(PASSWORD:);scanf(%d,&a);if(a==p){printf(验证正确\n);printf(\n);}else{printf(输入错误);exit(0);}}}return0;}randam1(unsignedintr){srand((unsigned)time(NULL));r=rand()%300000000+100000000;printf(随机码为:%d\n,r);printf(\n);returnr;}randam2(unsignedintq){time_tnowtime;structtm*timeinfo;time(&nowtime);timeinfo=localtime(&nowtime);inta,b,c,d,ra;a=timeinfo-tm_sec;b=timeinfo-tm_min;c=timeinfo-tm_hour;d=10000*a+100*b+c;srand((unsigned)time(NULL));q=rand()%900000+100000;ra=d+q;printf(一次密码为:%d\n,ra);returnra;}voidmain(){unsignedintr;unsignedintq;intcode;intIcode;INI();randam1(r);code=randam1(r);printf(输入随机码:);scanf(%d,&Icode);if(Icode==code){printf(\n);randam2(q);}else{printf(输入错误,还有两次机会\n);printf(\n);printf(输入随机码:);scanf(%d,&Icode);if(Icode==code){printf(\n);randam2(q);}else{printf(输入错误,还有一次机会\n);printf(\n);printf(输入随机码:);scanf(%d,&Icode);if(Icode==code){printf(\n);randam2(q);}else{printf(\n);printf(输入错误);exit(0);}}}getch();return0;}