这几天闲着没事又想着用C++做一个密码生成器,方便我以后生成不容易破解密码,并且我还出了几种模式,感兴趣的可以下载下来看看。

上代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdlib>
#include<ctime>
#include<conio.h>
#include<windows.h>
#define LL long long
using namespace std;
string s11;
char sf[27]={' ','~','!','@','#','$','%','^','&','*','_','+','-','=','/','(',')','{','}',';',':','[',']','<','>',',','.'};
void End(int tag){
	if(tag==1)
		printf("\n生成成功!已为您保存到当前文件夹中的 password.txt ,请及时下载,重新生成密码会替换原来的密码!\n");
	else
		printf("\n生成成功!已为您保存到当前文件夹中的 password.csv ,请及时下载,重新生成密码会替换原来的密码!\n");
}
int R(int x){
	return ((LL)rand()*(LL)rand())%(LL)x+1ll;
}
void sj(){
	printf("您选择的类型:纯随机强密码\n\n");
	printf("请输入密码位数:");
	int n;
	scanf("%d",&n);
	system("cls");
	char ch='.',s[5];
	string ri[5];
	for(int i=0;i<=4;i++)
		s[i]=' ',ri[i]="  ";
	int now=1,g=4;
	string ss[5];
	ss[1]="数字";
	ss[2]="大写字母";
	ss[3]="小写字母";
	ss[4]="特殊符号  ~ ! @ # $ % ^ & * _ + - = ? / ( ) { } ; : [ ] < > , .";
	int flag=1;
	while(ch!='k'){
		printf("您选择的类型:纯随机强密码\n");
		printf("您输入密码位数:%d\n\n",n);
		printf("\n\n请选择所包含的字符类型(可多选):\n w s :上下控制\n j :确定选择此项(再次输入j取消选择)\n k :完成选择\n n :");
		if(flag==0)
			printf("取消"); 
		printf("全选\n m :反选\n (请先将输入模式调整为英文)\n\n");
		s[now]='>';
		for(int i=1;i<=g;i++)
			printf("   %c %s  %s\n",s[i],ri[i].c_str(),ss[i].c_str());
		ch=getch();
		system("cls");
		switch(ch){
			case 'w':{
				s[now]=' ';
				now--;
				if(now==0)
					now=g;
				break;
			}
			case 's':{
				s[now]=' ';
				now++;
				if(now==g+1)
					now=1;
				break;
			}
			case 'j':{
				if(ri[now]=="  ")
					ri[now]="√";
				else
					ri[now]="  ";
				flag=1;
				break;
			}
			case 'k':break;
			case 'n':{
				if(flag==1)
					for(int i=1;i<=g;i++)
						ri[i]="√",flag=0;
				else
					for(int i=1;i<=g;i++)
						ri[i]="  ",flag=1;
				break;
			}
			case 'm':{
				int ggg=0;
				for(int i=1;i<=g;i++)
					if(ri[i]=="  ")
						ri[i]="√",ggg++;
					else
						ri[i]="  ";
				flag=1;
				if(ggg==g)
					flag=0;
				break;
			}
			default:{
				printf("请输入'w','s','j','k','n'or'm'  谢谢合作!");
				Sleep(1000);
				system("cls");
				break;
			}
		}
	}
	system("cls");
	printf("您选择的类型:纯随机强密码\n");
	printf("您输入密码位数:%d\n",n);
	printf("您选择所包含的字符类型:\n");
	int u=0,ak[5]={0};
	for(int i=1;i<=4;i++)
		if(ri[i]!="  "){
			printf("  %s\n",ss[i].c_str());
			u++;
			ak[u]=i;
		}
	End(1);
	FILE* l=fopen("password.txt","w");
	for(int i=1;i<=n;i++){
		int t=R(u);
		char sd;
		switch(ak[t]){
			case 1:{
				sd=R(10)-1+'0';
				break;
			}
			case 2:{
				sd=R(26)-1+'A';
				break;
			}
			case 3:{
				sd=R(26)-1+'a';
				break;
			}
			case 4:{
				sd=sf[R(26)];
				break;
			}
		}
		printf("%c",sd);
		fprintf(l,"%c",sd);
	}
	return ;
}
void sr(){
	string date;
	while(1){
		printf("请输入您的生日(纯数字)(如19980111):");
		cin>>date;
		if(date.size()!=8){
			printf("输入格式不正确!");
			Sleep(1000);
			system("cls");
			continue;
		}
		int flag=0;
		for(int i=0;i<8;i++)
			if(!isdigit(date[i])){
				printf("输入格式不正确!");
				Sleep(1000);
				system("cls");
				flag=1;
				break;
			}
		if(flag==1)
			continue;
		break;
	}
	End(1);
	int dk=8;
	for(int i=0;i<dk;i++){
		int kk=R(5);
		if(kk!=1){
			int dd=R(4);
			while(dd--){
				int pp=R(4);
				string sd="";
				switch(pp){
					case 1:{
						sd+=char(sf[R(26)]);
						break;
					}
					case 2:{
						sd+=char(R(26)-1+'A');
						break;
					}
					case 3:{
						sd+=char(R(26)-1+'a');
						break;
					}
					case 4:{
						sd+=char(sf[R(26)]);
						break;
					}
				}
				date.insert(i,sd);
				i++;
				dk++;
			}
		}
	}
	FILE* l=fopen("password.txt","w");
	printf("%s",date.c_str());
	fprintf(l,"%s",date.c_str());
	return ;
}
void mz(int daa){
	string name;
	while(1){
		if(daa==3)
			printf("请输入您的姓名拼音全拼或首字母(纯小写字母)(如zhangsan(张三):");
		else
			printf("请输入这句话拼音全拼或首字母(纯小写字母)(如angszax(爱你孤身走暗巷)):");
		cin>>name;
		int flag=0;
		for(int i=0;i<name.size();i++)
			if(!islower(name[i])){
				printf("输入格式不正确!");
				Sleep(1000);
				system("cls");
				flag=1;
				break;
			}
		if(flag==1)
			continue;
		break;
	}
	End(1);
	int dk=name.size();
	for(int i=0;i<dk;i++){
		int kk=R(5);
		if(kk!=1){
			int dd=R(4);
			while(dd--){
				int pp=R(5);
				string sd="";
				switch(pp){
					case 1:{
						sd+=char(sf[R(26)]);
						break;
					}
					case 2:{
						sd+=char(R(26)-1+'A');
						break;
					}
					case 3:{
						sd+=char(R(10)-1+'0');
						break;
					}
					case 4:{
						sd+=char(sf[R(26)]);
						break;
					}
					case 5:{
						name[i]=name[i]-'a'+'A';
						break;
					}
				}
				name.insert(i,sd);
				i++;
				dk++;
			}
		}
	}
	FILE* l=fopen("password.txt","w");
	printf("%s",name.c_str());
	fprintf(l,"%s",name.c_str());
	return ;
}
void self(int aad){
	printf("请输入一个字符串:");
	cin>>s11;
	End(1);
	int dk=s11.size();
	for(int i=0;i<dk;i++){
		int kk=R(5);
		if(kk!=1){
			int dd=R(4);
			while(dd--){
				int pp=R(5);
				string sd="";
				switch(pp){
					case 1:{
						sd+=char(sf[R(26)]);
						break;
					}
					case 2:{
						sd+=char(R(26)-1+'A');
						break;
					}
					case 3:{
						sd+=char(R(26)-1+'a');
						break;
					}
					case 4:{
						sd+=char(sf[R(26)]);
						break;
					}
					case 5:{
						sd+=char(R(10)-1+'0');
						break;
					}
				}
				s11.insert(i,sd);
				i++;
				dk++;
			}
		}
	}
	if(aad==5){
		FILE* l=fopen("password.txt","w");
		printf("%s",s11.c_str());
		fprintf(l,"%s",s11.c_str());
	}
	else{
		printf("初步加密密码:");
		printf("%s",s11.c_str());
		Sleep(1000);
	}
	return ;
}
void pl(){
	system("cls");
	char ch='.',s[15/*网站总个数+1*/];
	string ri[15/*网站总个数+1*/];
	for(int i=0;i<=14/*网站总个数*/;i++)
		s[i]=' ',ri[i]="  ";
	int now=1,g=14/*网站总个数*/;
	string ss[15/*网站总个数+1*/],sss[15/*网站总个数+1*/];
	ss[1]="微信";
	sss[1]="weixin";
	ss[2]="QQ";
	sss[2]="QQ";
	ss[3]="百度";
	sss[3]="baidu"; 
	ss[4]="哔哩哔哩";
	sss[4]="bilibili";
	ss[5]="抖音";
	sss[5]="douyin";
	ss[6]="快手";
	sss[6]="kuaishou";
	ss[7]="微博";
	sss[7]="weibo";
	ss[8]="Microsoft账户";
	sss[8]="Microsoftzhanghu";
	ss[9]="Apple ID";
	sss[9]="AppleID";
	ss[10]="Android账户";
	sss[10]="Android账户";
	ss[11]="小米账户";
	sss[11]="xiaomizhanghu";
	ss[12]="华为账户";
	sss[12]="huaweizhuanghu";
	ss[13]="Windows PIN";
	sss[13]="WindowsPIN";
	ss[14]="Linux账户";
	sss[14]="Linuxzhanghu";
	/*
	ss[15]="";//网站原名 
	sss[15]="";//网站拼音 
	*/
	int flag=1;
	while(ch!='k'){
		printf("初步加密密码:");
		printf("%s",s11.c_str());
		printf("\n\n请选择网站(可多选):\n w s :上下控制\n j :确定选择此项\n k :完成选择\n n :");
		if(flag==0)
			printf("取消"); 
		printf("全选\n m :反选\n (请先将输入模式调整为英文)\n\n");
		s[now]='>';
		for(int i=1;i<=g;i++)
			printf("   %c %s  %s\n",s[i],ri[i].c_str(),ss[i].c_str());
		ch=getch();
		system("cls");
		switch(ch){
			case 'w':{
				s[now]=' ';
				now--;
				if(now==0)
					now=g;
				break;
			}
			case 's':{
				s[now]=' ';
				now++;
				if(now==g+1)
					now=1;
				break;
			}
			case 'j':{
				if(ri[now]=="  ")
					ri[now]="√";
				else
					ri[now]="  ";
				flag=1;
				break;
			}
			case 'k':break;
			case 'n':{
				if(flag==1)
					for(int i=1;i<=g;i++)
						ri[i]="√",flag=0;
				else
					for(int i=1;i<=g;i++)
						ri[i]="  ",flag=1;
				break;
			}
			case 'm':{
				int ggg=0;
				for(int i=1;i<=g;i++)
					if(ri[i]=="  ")
						ri[i]="√",ggg++;
					else
						ri[i]="  ";
				flag=1;
				if(ggg==g)
					flag=0;
				break;
			}
			default:{
				printf("请输入'w','s','j','k','n'or'm'  谢谢合作!");
				Sleep(1000);
				system("cls");
				break;
			}
		}
	}
	int u=0,ak[15]={0};
	for(int i=1;i<=14;i++)
		if(ri[i]!="  ")
			ak[++u]=i;
	system("cls");
	char ch2='.',s2[4];
	string ri2[4];
	for(int i=0;i<=3;i++)
		s2[i]=' ',ri2[i]="  ";
	int now2=1,g2=3;
	string ss2[4];
	ss2[1]="网站名拼音+'/'+初步加密密码(如:weixin/ah3d%hc)";
	ss2[2]="网站名拼音首字母+初步加密密码+网站名拼音尾字母(如:wah3d%hcn)";
	ss2[3]="在初步密码第(网站名拼音长度)位前插入在 shift+(网站名拼音长度)得到的字符(如:ah3d%^hc)";
	while(ch2!='k'){
		printf("初步加密密码:");
		printf("%s",s11.c_str());
		printf("\n\n请选择批量加密方式(单选):\n w s :上下控制\n j :选择此项(再次输入j取消选择)\n k :完成选择\n\n");
		s2[now2]='>';
		for(int i=1;i<=g2;i++)
			printf("   %c %s  %s\n",s2[i],ri2[i].c_str(),ss2[i].c_str());
		ch2=getch();
		system("cls");
		switch(ch2){
			case 'w':{
				s2[now2]=' ';
				now2--;
				if(now2==0)
					now2=g2;
				break;
			}
			case 's':{
				s2[now2]=' ';
				now2++;
				if(now2==g2+1)
					now2=1;
				break;
			}
			case 'j':{
				for(int i=1;i<=g2;i++)
					ri2[i]="  ";
				ri2[now2]="√";
				break;
			}
			case 'k':break;
			default:{
				printf("请输入'w','s','j'or'k'  谢谢合作!");
				Sleep(1000);
				system("cls");
				break;
			}
		}
	}
	system("cls");
	End(2);
	FILE* l=fopen("password.csv","w");
	fprintf(l,"网站,密码\n");
	switch(now2){
		case 1:{
			for(int i=1;i<=u;i++){
				string ans=sss[ak[i]];
				ans+="/";
				ans+=s11;
				printf("%s:\n%s\n",ss[ak[i]].c_str(),ans.c_str());
				fprintf(l,"%s,%s\n",ss[ak[i]].c_str(),ans.c_str());
			}
			break;
		}
		case 2:{
			for(int i=1;i<=u;i++){
				string ans="";
				ans+=sss[ak[i]][0];
				ans+=s11;
				ans+=sss[ak[i]][sss[ak[i]].size()-1];
				printf("%s:\n%s\n",ss[ak[i]].c_str(),ans.c_str());
				fprintf(l,"%s,%s\n",ss[ak[i]].c_str(),ans.c_str());
			}
			break;
		}
		case 3:{
			for(int i=1;i<=u;i++){
				string ans=s11;
				string hc;
				switch(sss[ak[i]].size()){
					case 1:{
						hc="!";
						break;
					}
					case 2:{
						hc="@";
						break;
					}
					case 3:{
						hc="#";
						break;
					}
					case 4:{
						hc="$";
						break;
					}
					case 5:{
						hc="%";
						break;
					}
					case 6:{
						hc="^";
						break;
					}
					case 7:{
						hc="&";
						break;
					}
					case 8:{
						hc="*";
						break;
					}
					case 9:{
						hc="(";
						break;
					}
					case 10:{
						hc=")";
						break;
					}
					default:{
						hc="?";
						break;
					}
				}
				if(ans.size()>=s11.size())
					ans.insert(sss[ak[i]].size(),hc);
				else
					ans.insert(ans.size(),hc);
				printf("%s:\n%s\n",ss[ak[i]].c_str(),ans.c_str());
				fprintf(l,"%s,%s\n",ss[ak[i]].c_str(),ans.c_str());
			}
			break;
		}
	}
	return ;
}
int main(){
	HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(handle,&CursorInfo);//获取控制台光标信息     CursorInfo.bVisible = false; //隐藏控制台光标
	SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
	srand((unsigned)time(NULL));
	char ch='.',s[51];
	for(int i=0;i<=50;i++)
		s[i]=' ';
	int now=1,g=6;
	string ss[51];
	ss[1]="  纯随机强密码";
	ss[2]="  生日组合强密码";
	ss[3]="  姓名组合强密码";
	ss[4]="  一句话组合强密码";
	ss[5]="  自己输入无序字符串进行组合强密码";
	ss[6]="  众多网站批量生成同样规律的强密码";
	while(ch!='j'){
		printf("欢迎使用密码生成器\n");
		printf("请选择生成密码类型:w s上下控制,j确定 (请先将输入模式调整为英文)\n\n");
		s[now]='>';
		for(int i=1;i<=g;i++)
			printf("   %c%s\n",s[i],ss[i].c_str());//cout<<"   "<<s[i]<<ss[i]<<endl;
		ch=getch();
		system("cls");
		switch(ch){
			case 'w':{
				s[now]=' ';
				now--;
				if(now==0)
					now=g;
				break;
			}
			case 's':{
				s[now]=' ';
				now++;
				if(now==g+1)
					now=1;
				break;
			}
			case 'j':break;
			default:{
				printf("请输入'w','s'or'j'  谢谢合作!");
				Sleep(1000);
				system("cls");
				break;
			}
		}
	}
	switch(now){
		case 1:{
			sj();
			break;
		}
		case 2:{
			sr();
			break;
		}
		case 3:{
			mz(3);
			break;
		}
		case 4:{
			mz(4);
			break;
		}
		case 5:{
			self(5);
			break;
		}
		case 6:{
			self(6);
			pl();
			break;
		}
	}
	printf("\n\n\n\a感谢使用此密码生成器,最终解释权归吴同学所有!\n\n窗口将在10秒后自动关闭\r");
	for(int i=9;i>=0;i--){
		Sleep(1000);
		printf("窗口将在%2d秒后自动关闭\r",i);
	}
	return 0;
}

备注:写代码的时候为了方便许多变量名和函数名都是随便写的没有特殊含义)

解释:在第\(322-359\)行中,因为网站过多只列举了\(14\)个,如有需要,可以继续添加,格式都标注在下面的注释里了,并且上面的标注了/* */的内容也需要修改改成什么都标注在里面的。

如果还有其他疑问可以提在下面的评论区,我会一一解答。