当前位置:文档之家› 密码表管理

密码表管理

密码表管理系统1设计目的、要求(1) 可以存储用户名及密码等密码表信息(2) 采用一种加密算法将密码表信息加密(3) 可以添加、删除、修改已知密码表中的信息(4) 可以检索密码信息2设计原理本程序采用维吉尼亚(vigenere)密码体制对用户名和密码等密码表信息进行加密。

3采用软件、设备Microsoft Visual Studio 20104设计内容1、vigenere cipher 的加密规则:1)找到一个关键字作为密钥(本程序使用密码为关键字);2)根据vigenere table 找出对应的密文。

2、vigenere cipher 的加密原理:1)vigenere 代换表:ABCDEFGHIJKLMNOPQRSTUVWXYZBCDEFGHIJKLMNOPQRSTUVWXYZACDEFGHIJKLMNOPQRSTUVWXYZABDEFGHIJKLMNOPQRSTUVWXYZABCEFGHIJKLMNOPQRSTUVWXYZABCDFGHIJKLMNOPQRSTUVWXYZABCDEGHIJKLMNOPQRSTUVWXYZABCDEFHIJKLMNOPQRSTUVWXYZABCDEFGIJKLMNOPQRSTUVWXYZABCDEFGHJKLMNOPQRSTUVWXYZABCDEFGHIKLMNOPQRSTUVWXYZABCDEFGHIJLMNOPQRSTUVWXYZABCDEFGHIJKMNOPQRSTUVWXYZABCDEFGHIJKLNOPQRSTUVWXYZABCDEFGHIJKLMOPQRSTUVWXYZABCDEFGHIJKLMNPQRSTUVWXYZABCDEFGHIJKLMNOQRSTUVWXYZABCDEFGHIJKLMNOPRSTUVWXYZABCDEFGHIJKLMNOPQSTUVWXYZABCDEFGHIJKLMNOPQRTUVWXYZABCDEFGHIJKLMNOPQRSUVWXYZABCDEFGHIJKLMNOPQRSTVWXYZABCDEFGHIJKLMNOPQRSTUWXYZABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVWYZABCDEFGHIJKLMNOPQRSTUVWXZABCDEFGHIJKLMNOPQRSTUVWXY2)加密过程很简单,就是给定密钥字母x和明文字母y,密文字母是位于x行和y 列的那个字母。

这样就决定了加密一条消息需要与消息一样长的密钥字符串。

(本程序较简单采用的密钥字符串与密码相同)例:比如密钥词是deceptive,消息是“we are discovered save yourself”,那么加密过程如下:deceptivedeceptivedeceptive(密钥字符串)wearediscoveredsaveyourself(消息)ZICVTWQNGRZGVTWAVZHCQYGLMGJ(密文)密文中的第一个字母“Z”是怎么得来的?从Vigenere代换表中,以密钥字符串中的“d”为行,消息中的“w”为列的那个字母就是“Z”了。

3)本程序可以实现对用户名和密码等密码表信息的存储、添加、修改、删除。

程序代码:#include<iostream>#include<conio.h>#define MAX 100static int square[27][27];char * vigenere(char key[],char word[]);int set(struct Admin admin[],char *name);int landing(struct Admin admin[]);int resultadd(struct Admin admin[]);int resultres(struct Admin admin[]);int Delete(struct Admin admin[]);int update_m(struct Admin admin[]);int Search_m(struct Admin admin[]);using namespace std;struct Admin{char name[15];char code[20];};int Count=0;//全局变量记录用户数void main(){struct Admin admin[8];int n=1,m;char name[20];for(int i=0;i<Count;i++){for(int j=0;j<15;j++){admin[i].name[j]='\0';}}for(int i=0;i<Count;i++){for(int j=0;j<20;j++){admin[i].code[j]='\0';}}while(n){cout<<"\t\t****************************************\n";cout<<"\t\t** 用户登录系统**\n";cout<<"\t\t** **\n";cout<<"\t\t** 1:建立**\n";cout<<"\t\t** 2:登陆**\n";cout<<"\t\t** 3:加密**\n";cout<<"\t\t** 4:解密**\n";cout<<"\t\t** 5.查找**\n";cout<<"\t\t** 6:修改**\n";cout<<"\t\t** 7:删除**\n";cout<<"\t\t** 0:退出**\n";cout<<"\t\t****************************************\n";cout<<"\t\t请选择:";cin>>m;switch(m){case 1: set(admin,name);break;case 2: landing(admin); break;case 3: resultadd(admin);break;case 4: resultres(admin);break;case 5: Search_m(admin);break;case 6: update_m(admin);break;case 7: Delete(admin);break;case 0: n=0;break;}}}//建立用户int set(struct Admin admin[],char *name){int i=0;int c;cout<<"\t\t输入用户名:";cin>>admin[Count].name;cout<<endl<<"\t\t输入密码:";Count-=1-Count++;c=getch();while(c != '\r') //回车{if(i >= 0){if (c == '\b'){cout<<"\b \b";//\b只是退回一格,不清除的。

所以第一次\b退回后用空格覆盖。

然后再\b退回i = i - 1;}else{cout<<"*";admin[Count].code[i] = c;}}c = getch();if(c != '\b')i=i+1;}admin[Count].code[i] = '\0';cout<<endl<<endl;return 0;}//用户登录int landing(struct Admin admin[]){char Name[20],Code[20];int p=0,i=0,c,m=0;cout<<endl<<"\t\t输入用户名:";cin>>Name;cout<<endl<<"\t\t输入密码:";c=getch();while(c != '\r') //回车{if(i >= 0){if (c == '\b'){cout<<"\b \b";//\b只是退回一格,不清除的。

所以第一次\b退回后用空格覆盖。

然后再\b退回i = i - 1;}else{cout<<"*";Code[i] = c;}}c = getch();if(c != '\b')i=i+1;}Code[i] = '\0';for(int n=0;n<9;n++){if(strcmp(Name,admin[n].name)==0&&strcmp(Code,admin[n].code)==0){cout<<"\n\t\t登陆成功!\n";p=1;}}if(p!=1) //判断登录失败原因{for(m;m<9;m++){if(strcmp(Name,admin[m].name)==0){cout<<"\t\t密码错误!\n";return 0;}}cout<<"\t\t用户不存在!\n";}return 0;}/*加密算法*/char * vigenere(char key[],char word[]){char *text=(char *)malloc(MAX*sizeof(char));int key_length=strlen(key);int word_length=strlen(word);int i,j,c;for(i=0;i<word_length;i++){if((word[i]>=65&&word[i]<=90)||(word[i]>=97&&word[i]<=122)){ if(word[i]>=97&&word[i]<=122){c=word[i]-96;}else {c=word[i]-64;}j=i%key_length;text[i]=square[key[j]-96][c];}else text[i]=word[i];}text[i]='\0';return text;}/*解密算法*/char * anti_vigenere(char key[],char * en_word){char *word=(char *)malloc(MAX*sizeof(char));int key_length=strlen(key);int word_length=strlen(en_word);int i,j,c,k,d;for(i=0;i<word_length;i++){if(en_word[i]>=65&&en_word[i]<=90){c=i%key_length;/*所用密钥在所在*/k=key[c]-96;d=en_word[i]-square[k][1];if(d>=0){word[i]='a'+d;}else{word[i]='z'+d+1;}}else{word[i]=en_word[i];}}word[i]='\0';return word;}//加密结果int resultadd(struct Admin admin[]){char key[20],*en_word;int i,j,k,m;for(i=1;i<27;i++){for(j=1;j<27;j++){square[i][j]=63+i+j;if(square[i][j]>90)square[i][j]=square[i][j]-26;}}for(k=1;k<27;k++){for(m=1;m<27;m++){cout<<(char)square[k][m]<<" ";}cout<<"\n"<<endl;}for(i=0;i<=Count;i++){for(int s=0;s<20;s++){key[s]=admin[i].code[s];}en_word=vigenere(key,admin[i].code);cout<<"\n"<<"The result is: "<<"\n"<<en_word<<endl;}return 0;}//解密结果int resultres(struct Admin admin[]){char key[20],*en_word;int i,j,k,m;for(i=1;i<27;i++){for(j=1;j<27;j++){square[i][j]=63+i+j;if(square[i][j]>90)square[i][j]=square[i][j]-26;}}for(k=1;k<27;k++){for(m=1;m<27;m++){cout<<(char)square[k][m]<<" ";}cout<<"\n"<<endl;}for(i=0;i<=Count;i++){for(int s=0;s<20;s++){key[s]=admin[i].code[s];}en_word=anti_vigenere(key,admin[i].code);cout<<"\n"<<"The result is: "<<"\n"<<en_word<<endl;}return 0;}//查找用户秘密int Search_m(struct Admin admin[]){char sename[15];bool flag;cout<<"请输入要查找的用户名"<<endl;cin>>sename;while(Count>=0){for(int i=0;i<15;i++){if(sename[i]==admin[Count].name[i])flag=true;else flag=false;}Count--;}if(flag){for(int i=0;i<20;i++)cout<<admin[Count+1].code[i];cout<<endl;cout<<"查找用户密码成功!!!"<<endl;}else cout<<"用户名错误,请重新选择操作!!!"<<endl;return 0;}//修改用户密码int update_m(struct Admin admin[]){char oldname[15];char newpassword[20];bool flag;cout<<"请输入要修改密码的用户名!!!"<<endl;cin>>oldname;while(Count>=0){for(int i=0;i<15;i++){if(oldname[i]==admin[Count].name[i])flag=true;else flag=false;}Count--;}if(flag){cout<<"请输入新的密码!!!"<<endl;cin>>newpassword;for(int j=0;j<20;j++){admin[Count+1].code[j]=newpassword[j];}cout<<"修改用户成功!!!"<<endl;}else cout<<"用户名错误,请重新选择操作!!!"<<endl;return 0;}//删除用户int Delete(struct Admin admin[]){char oldname[15];bool flag;cout<<"请输入要删除的用户名!!!"<<endl;cin>>oldname;while(Count>=0){for(int i=0;i<15;i++){if(oldname[i]==admin[Count].name[i])flag=true;else flag=false;}Count--;}if(flag){for(int j=0;j<20;j++){admin[Count+1].code[j]='\0';}for(int k=0;k<15;k++){admin[Count+1].name[k]='\0';}cout<<"删除成功"<<endl;}else cout<<"用户名错误,请重新选择操作!!!"<<endl;return 0;}。

相关主题