下面程序用异或 *** 作对文件进行加密和解密
/******************设计思路******************/
//根据用户输入的加密/机密密码,
//每次都拿原文件和密码等长度的一个字符串和密码
//对应元素异或进行加密/解密
//另外因为是用异或方法,所以加密和解密就是同一个程序
//即按照同样的加密即是对文件的解密
#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")
}
C语言设计一个简单的加密解密程序如下:加密程序代码:
#include<stdio.h>
main()
{
char
c,filename[20]
FILE
*fp1,*fp2
printf("请输入待加密的文件名:\n")
scanf("%s",filename)
fp1=fopen(filename,"r")
fp2=fopen("miwen.txt","w")
do
{
c=fgetc(fp1)
if(c>=32&&c<=126)
{
c=c-32
c=126-c
}
if(c!=-1)
fprintf(fp2,"%c",c)
}
while(c!=-1)
}
解密程序代码:
#include<stdio.h>
#include<string.h>
main()
{
char
c,filename[20]
char
yanzhengma[20]
FILE
*fp1,*fp2
printf("请输入待解密文件名:\n")
scanf("%s",filename)
printf("请输入验证码:\n")
scanf("%s",yanzhengma)
if(strcmp(yanzhengma,"shan")==0)
{
fp1=fopen(filename,"r")
fp2=fopen("yuanwen.txt","w")
do
{
c=fgetc(fp1)
if(c>=32&&c<=126)
{
c=126-c
c=32+c
}
if(c!=-1)
fprintf(fp2,"%c",c)
}
while(c!=-1)
}
else
{
printf("验证码错误!请重新输入:\n")
scanf("%s",filename)
}
}
// playFair 加密 你参考下 ...#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define x 50
char MiYao[x],PassWord[x],AddPass[x],Table[5][5],Map[25]
bool Visit[27]={false}
char English[27]="abcdefghijklmnopqrstuvwxyz"
void Input()
{
printf("请输入密钥:\t") scanf("%s",MiYao)
printf("请输入待加密密码:\t") scanf("%s",PassWord)
}
void Fun_5x5()
{
int count = 0,V =0
/*标记密钥内字符为: true*/
for(int i=0MiYao[i]!='\0'i++)
if(strchr(English,MiYao[i])!=NULL)
Visit[strchr(English,MiYao[i])-English] = true
/*执行密钥矩阵 *** 作 并标记已使用字符:true*/
for(int i=0i<5i++)
for(int j=0j<5j++)
{
if(count<strlen(MiYao))
Table[i][j] = MiYao[count++]
else
{
while(Visit[V] != false) V++
Table[i][j] = English[V]
Visit[V++] = true
}
}
puts("∞∞∞密钥矩阵为∞∞∞")
for(int i=0i<5i++)
{ for(int j=0j<5j++)
printf("%3c",Table[i][j])
puts("")
}
puts("∞∞∞∞∞∞∞∞∞∞∞")
}
int IsVisited(char ch)
{
return Visit[strchr(English,ch)-English] //false 未出现过
}
void TabletoMap()
{ int count=0
for(int i=0i<5i++)
for(int j=0j<5j++)
Map[count++]=Table[i][j]
Map[count]='\0'
}
void Judge()
{
int len = strlen(PassWord),i,j,k
memset(AddPass,0,sizeof(char))
/*一对对去字母,剩下单个字母,则不变化,直接放入加密串中.*/
if(len%2){
AddPass[len-1] = PassWord[len-1]
len -=1
}
/*一对中 密钥矩阵中 存在矩阵 eg.ab 先输出a同行顶点在输出b同行顶点*/
int row1,low1,row2,low2,a1,a2
for(i=0i<leni+=2)
{
char c1,c2
c1 = PassWord[i]
c2 = PassWord[i+1]
/*一对中 两字母相同 无变化*/
/*一对中 有字母不在密钥矩阵中 无变化*/
if(c1 == c2 || ( !IsVisited(c1)||!IsVisited(c2)))
{ AddPass[i] = c1
AddPass[i+1]=c2
}else{
a1 = strchr(Map,c1)-Map
row1 = a1/5 low1 = a1%5
a2 = strchr(Map,c2)-Map
row2 = a2/5 low2 = a2%5
/*一对中 字符出现在同行或同列 简单swap字符*/
if(row1 == row2 || low1 == low2)
{
AddPass[i] = c2
AddPass[i+1] = c1
}else{
AddPass[i] = Table[row1][low2]
AddPass[i+1] = Table[row2][low1]
}
}
}AddPass[len+1]='\0'
puts("加密后字符串:")
puts(AddPass)
puts("原串是:")
puts(PassWord)
}
int main()
{
Input()
Fun_5x5()
TabletoMap()
Judge()
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)