密码表管理系统
1设计目的、要求
(1) 可以存储用户名及密码等密码表信息
(2) 采用一种加密算法将密码表信息加密
(3) 可以添加、删除、修改已知密码表中的信息
(4) 可以检索密码信息
2设计原理
本程序采用维吉尼亚(vigenere)密码体制对用户名和密码等密码表信息进行加密。
3采用软件、设备
Microsoft Visual Studio 2010
4设计内容
1、vigenere cipher 的加密规则:
1)找到一个关键字作为密钥(本程序使用密码为关键字);
2)根据vigenere table 找出对应的密文。
2、vigenere cipher 的加密原理:
1)vigenere 代换表:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
BCDEFGHIJKLMNOPQRSTUVWXYZA
CDEFGHIJKLMNOPQRSTUVWXYZAB
DEFGHIJKLMNOPQRSTUVWXYZABC
EFGHIJKLMNOPQRSTUVWXYZABCD
FGHIJKLMNOPQRSTUVWXYZABCDE
GHIJKLMNOPQRSTUVWXYZABCDEF
HIJKLMNOPQRSTUVWXYZABCDEFG
IJKLMNOPQRSTUVWXYZABCDEFGH
JKLMNOPQRSTUVWXYZABCDEFGHI
KLMNOPQRSTUVWXYZABCDEFGHIJ
LMNOPQRSTUVWXYZABCDEFGHIJK
MNOPQRSTUVWXYZABCDEFGHIJKL
NOPQRSTUVWXYZABCDEFGHIJKLM
OPQRSTUVWXYZABCDEFGHIJKLMN
PQRSTUVWXYZABCDEFGHIJKLMNO
QRSTUVWXYZABCDEFGHIJKLMNOP
RSTUVWXYZABCDEFGHIJKLMNOPQ
STUVWXYZABCDEFGHIJKLMNOPQR
TUVWXYZABCDEFGHIJKLMNOPQRS
UVWXYZABCDEFGHIJKLMNOPQRST
VWXYZABCDEFGHIJKLMNOPQRSTU
WXYZABCDEFGHIJKLMNOPQRSTUV
XYZABCDEFGHIJKLMNOPQRSTUVW
YZABCDEFGHIJKLMNOPQRSTUVWX
ZABCDEFGHIJKLMNOPQRSTUVWXY
2)加密过程很简单,就是给定密钥字母x和明文字母y,密文字母是位于x行和y 列的那个字母。这样就决定了加密一条消息需要与消息一样长的密钥字符串。
(本程序较简单采用的密钥字符串与密码相同)
例:比如密钥词是deceptive,消息是“we are discovered save yourself”,那么
加密过程如下:
deceptivedeceptivedeceptive(密钥字符串)
wearediscoveredsaveyourself(消息)
ZICVTWQNGRZGVTWAVZHCQYGLMGJ(密文)
密文中的第一个字母“Z”是怎么得来的?从Vigenere代换表中,以密钥字符串
中的“d”为行,消息中的“w”为列的那个字母就是“Z”了。
3)本程序可以实现对用户名和密码等密码表信息的存储、添加、修改、删除。
程序代码:
#include
#include
#define MAX 100
static 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 { for(int j=0;j<15;j++) { admin[i].name[j]='\0'; } } for(int i=0;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< 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< return 0; } //用户登录 int landing(struct Admin admin[]) { char Name[20],Code[20]; int p=0,i=0,c,m=0; cout< cin>>Name; cout< 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 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 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"< } 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"< } 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"< } 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"< } return 0; } //查找用户秘密 int Search_m(struct Admin admin[]) { char sename[15]; bool flag; cout<<"请输入要查找的用户名"< 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< cout< cout<<"查找用户密码成功!!!"< } else cout<<"用户名错误,请重新选择操作!!!"< return 0; } //修改用户密码 int update_m(struct Admin admin[]) { char oldname[15]; char newpassword[20]; bool flag; cout<<"请输入要修改密码的用户名!!!"< 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<<"请输入新的密码!!!"< cin>>newpassword; for(int j=0;j<20;j++) { admin[Count+1].code[j]=newpassword[j]; } cout<<"修改用户成功!!!"< } else cout<<"用户名错误,请重新选择操作!!!"< return 0; } //删除用户 int Delete(struct Admin admin[]) { char oldname[15]; bool flag; cout<<"请输入要删除的用户名!!!"< 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<<"删除成功"< } else cout<<"用户名错误,请重新选择操作!!!"< return 0; }