这个是你要的程序,你输入的如果是文件路径而且能打开正确文件的话,就会操作该文件(不能太长,要小于5w汉字的长度),另外,文件中的字母不能是大写字母,因为你这里题目本身就有问题,ASCII码所能表示的范围不止122,所以譬如小写字母t增加8以后变成了2,那么会和汉字出现混淆,如果解决的话,那么就不符合你这个题目122循环的条件了,我vc6通过调试运行了,你可以试试看
#includestdio.h
#includestring.h
#includestdlib.h
FILE *file=NULL;
void main()
{
void set(char*,int*,int*);
void encrypt1(char*,const int*);
void decrypt1(char*,const int*);
void encrypt2(char*,const int*);
void decrypt2(char*,const int*);
char content[100000]="";
int key1[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
int key2[2]={0};
char press='\0';
do
{
printf("*********************************\n");
printf("1.设置加密方法\n");
printf("2.加密方法1\n");
printf("3.加密方法2\n");
printf("4.解密方法1\n");
printf("5.解密方法2\n");
printf("6.退出\n");
printf("*********************************\n");
printf("选择操作步骤(1-6):\n");
switch(press=getch())
{
case '1':set(content,key1,key2);break;
case '2':encrypt1(content,key1);break;
case '3':encrypt2(content,key2);break;
case '4':decrypt1(content,key1);break;
case '5':decrypt2(content,key2);break;
default:break;
}
}while(press!='6');
if(file!=NULL)
{
rewind(file);
fputs(content,file);
printf("文件或字符串的内容为:\n");
puts(content);
fclose(file);
}
}
void set(char content[100000],int key1[10],int key2[2])
{
long int key;
char ch;
int i;
char str[100]="";
if(file!=NULL)
{
fclose(file);
file=NULL;
}
printf("输入字符串或者文件完整路径:");
gets(str);
if(file=fopen(str,"r+"))
{
printf("输入的是文件完整路径,内容为:\n");
while(fgetc(file)!=EOF)
{
fseek(file,-1,1);
fgets(content,100000,file);
printf("%s",content);
}
}
else
{
file=fopen("content.txt","w+");
strcpy(content,str);
printf("输入的是字符串,内容为:\n");
puts(content);
}
printf("\n设置密码:");
gets(str);
for(i=0;(istrlen(str))(i10);i++)
*(key1+i)=*(str+i)-'0';
key=atoi(str);
key2[0]=(key%11=3)?(key%11):3;
for(key2[1]=1,i=0;i10;i++)
if((*(key1+i)key2[1])(*(key1+i)key2[0]))
key2[1]=*(key1+i);
}
void encrypt1(char content[100000],const int key1[10])
{
int j,k;
for(j=0,k=0;jstrlen(content);j++)
{
*(content+j)+=*(key1+k);
k++;
if(k==9||*(key1+k)==-1)
k=0;
if(*(content+j)=122)
*(content+j)%=122;
}
}
void decrypt1(char content[100000],const int key1[10])
{
int j,k;
for(j=0,k=0;jstrlen(content);j++)
{
*(content+j)-=*(key1+k);
k++;
if(k==9||*(key1+k)==-1)
k=0;
if(*(content+j)=122)
*(content+j)%=122;
}
}
void encrypt2(char content[100000],const int key2[2])
{
char precontent[100000],str[11]="",ch;
int i,j,p;
p=key2[0];
strcpy(precontent,content);
strcpy(content,"");
for(i=0;istrlen(precontent);)
{
if(strlen(precontent)-ikey2[0])
p=strlen(precontent)-i;
for(j=p-1;j=0;j--)
*(str+j)=*(precontent+i++);
if(p==key2[0])
{
ch=*(str);
*(str)=*(str+key2[1]);
*(str+key2[1])=ch;
}
else
{
ch=*(str);
*(str)=*(str+p-1);
*(str+p-1)=ch;
}
strcat(content,str);
for(j=0;jp;j++)
*(str+j)='\0';
if(p!=key2[0])
break;
}
}
void decrypt2(char content[100000],const int key2[2])
{
char precontent[100000],str[11]="",ch;
int i,j,p;
p=key2[0];
strcpy(precontent,content);
strcpy(content,"");
for(i=0;istrlen(precontent);)
{
if(strlen(precontent)-ikey2[0])
p=strlen(precontent)-i;
for(j=p-1;j=0;j--)
*(str+j)=*(precontent+i++);
if(p==key2[0])
{
ch=*(str+p-1);
*(str+p-1)=*(str+p-1-key2[1]);
*(str+p-1-key2[1])=ch;
}
else
{
ch=*(str);
*(str)=*(str+p-1);
*(str+p-1)=ch;
}
strcat(content,str);
for(j=0;j11;j++)
*(str+j)='\0';
if(p!=key2[0])
break;
}
}
可能很长 ,这是在我以前一个程序里摘出来的。
原理:用户输入创建密码,机器读取,并把每一位密码进行加密,这里就是把每一位的 ASCII码加一(也可以有其他的加密方式),然后保存在文件里。解密时从文件中读取保存的乱码,然后把它每一位的ascII码减一 在与你输入的密码比较,正确既可以进入。
#define CODE_SIZE 10
int password()
{
FILE *fp;
char s1[CODE_SIZE], s2[CODE_SIZE], s3[CODE_SIZE], fun;
while (1)
{
fp = fopen("password.txt", "r");
if (fp == NULL)
{
printf("第一次运行,请输入初始密码(最多8位):\n");
scanf("%s", s1);
printf("请再次输入初始密码:\n");
scanf("%s", s2);
if (strcmp(s1, s2) == 0)
{
fp = fopen("password.txt", "w+");
if (fp == NULL)
{
printf("创建文件失败退出\n");
getch();
exit(1);
}
else
{
//对s1加密
for (int i = 0; iCODE_SIZEs1[i] != ' '; i++)
{
s1[i] = s1[i] + i;
}
fputs(s1, fp);
printf("初始密码创建完成.\n");
}
}
else
{
printf("两次输入的密码不一致!\n");
}
fclose(fp);
}
else
{
fgets(s1, CODE_SIZE, fp);
fclose(fp);
printf("输入密码:\n");
scanf("%s", s2);
//对s1解密
for (int i = 0; iCODE_SIZEs1[i] != ' '; i++)
{
s1[i] = s1[i] - i;
}
loop:
if (strcmp(s1, s2) == 0)
{
printf("-----密码正确-----\n");
printf("-----请选择功能-----\n");
printf("-----1:修改密码-----\n");
printf("-----2:进入通讯录-----\n");
scanf("%d", fun);
switch (fun)
{
case 1: printf("请输入新密码\n");
scanf("%s", s1);
printf("请再次输入新密码\n");
scanf("%s", s2);
if (strcmp(s1, s2) == 0)
{
fp = fopen("password.txt", "w+");
if (fp == NULL)
{
printf("文件错误!\n");
}
else
{ //对s1加密
for (int i = 0; iCODE_SIZEs1[i] != ' '; i++)
{
s1[i] = s1[i] + i;
}
fputs(s1, fp);
fclose(fp);
printf("密码修改成功\n");
}
}
else
{
printf("两次输入的密码不一致,修改失败\n");
}
break;
case 2: return 1;
default: printf("无效指令\n");
}
}
else
{
printf("密码错误\n请重新输入\n");
scanf("%s", s2);
goto loop;
}
}
printf("------------------\n\n\n\n");
}
}
加密 5 位数字(如 12345)的一种方法是对数字中的每个数字应用数学运算以创建一个新的加密数字。例如,您可以为每个数字加 3 以获得 34578。要解密数字,您只需对每个数字应用反向运算(在本例中为减去 3)即可返回原始数字。
加密数字的另一种方法是使用替换密码,其中每个数字都替换为不同的字母或符号。例如,您可以将每个数字替换为字母表中后面一定位置的字母(例如,1 替换为 D,2 替换为 E,依此类推)。要解密数字,您只需应用反向替换(在这种情况下,将每个字母替换为相应的数字)。
这些只是加密和解密 5 位数字的许多不同方法的两个示例。您选择的具体方法将取决于您所需的安全级别和可用的资源(例如时间、计算能力)。
回答不易望请采纳