对于加密要求不高的完全可以自己定义规则来进行加密。这种加密是很简单很自由的,例如你在存文件的时候可以将文件中的每个字符都加上一个数,然后读取该文件的时候再每个字符相应地减去那个数,即可实现就简单的加密,这样你储存的文件看上去就是乱码了。只是这个规则太简单,规则你可以自己定,加密与解密对着来就行了。
下面程序用异或操作对文件进行加密和解密
/******************设计思路******************/
//根据用户输入的加密/机密密码,
//每次都拿原文件和密码等长度的一个字符串和密码
//对应元素异或进行加密/解密
//另外因为是用异或方法,所以加密和解密就是同一个程序
//即按照同样的加密即是对文件的解密
#include
#include
#include
#include
#include
charfilename[256];//原文件
charpassword[256];//加密/解密密码
constcharfilenametemp[]="temp15435255435325432543.temp";//加密/解密中间文件
voidinputpass(char*pass);//密码输入以"******"显示
voidmain(){
FILE*fp;//加密/解密的文件
FILE*fptemp;//加密/解密过程临时文件
intpwdlen;//密码长度
inti=0;//计数器
charch=0;//读入的字符
printf("请输入要加密/解密的文件名(全路径名):\n");
gets(filename);
if((fp=fopen(filename,"rb"))==NULL){
printf("找不到文件%s\n",filename);
exit(1);
}//if
printf("请输入要加密/解密的密码:\n");
inputpass(password);
pwdlen=strlen(password);
if(pwdlen==0){
printf("密码不能为空,加密/解密失败\n");
exit(1);
}//if
fptemp=fopen(filenametemp,"wb");//打开中间文件
while(1){
ch=fgetc(fp);//从原文件读入一个字符
if(feof(fp)){//已经读到文件尾
break;//退出循环
}
ch^=password[i++];//对原字符和密码进行异或操作
fputc(ch,fptemp);//将异或结果写入中间文件
if(i==pwdlen){//使得原文件每和密码长度相同的固定长度异或加密
i=0;
}
}//while
fclose(fp);//关闭打开原文件
fclose(fptemp);//关闭打开中间文件
remove(filename);//删除原文件
rename(filenametemp,filename);//将中间文件重命名为原文件
printf("加密/解密成功\n");//至此加密/解密成功
}
//密码输入以"******"显示
voidinputpass(char*pass){
inti=0;
charc;
while(isprint(c=getch())){
pass[i++]=c;
//printf("*");
}
pass[i]='\0';
printf("\n");
}
#include
#include
main()
{
intkey;
charch;
printf("\n请输入密钥:");
scanf("%d",key);
printf("得到对应明文如下:");
while((ch=getchar())!='\r')
(ch+key)122?putchar(ch-122+33+key):
((ch+key)33?putchar(ch+122+key):putchar(ch+key));
}
输入输出如下:
请输入密钥:20addse
得到对应明文如下:uxx.y
你先输入一个任意的整数,如20,然后在键盘上输入一段任意的字符如addse
按回车键结束,就会得到结果如:uxx.y
下面是另一组输入输出:
请输入密钥:35asjRYIRER!@#$^^*
得到对应明文如下:+=4u#luhuDcFG((MI-
具体是如何加密,你应该能看懂,就是用一个三目运算符?:控制。
你的改动不可以,之所以你的调试结果对,那是因为你没有用边界值去测试。
这个加密方法是用的循环码,也就是用字母推后两个位置,即用C代替A,用D代替B,那么Z用什么来代替呢?那就是B。除以26的目的就是当超过26后,通过求余数的方式折回头部去。
(soustr[j]-'A'+2)的意思就是将26个字母编号为1~26。