//本程序在DEV C 上编译通过,具体的加密原理很简单,在下面的functions.h文件中有介绍.
//该程序不能加密汉字!!!!
//以下是MAIN.C文件
//**************************************************************************************************************
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<time.h>
#include<io.h>
#include"functions.h"
#define MARSK_LEN 95
char marsk[MARSK_LEN];
FILE *record; //每次操作的记录文件
time_t current_time; //记录当前操作的日期
void init(); // 初始化marsk数组 ,打开record文件
void encoding(FILE *,FILE *,char *,long); //调用encode() 函数
void decoding(FILE *in,FILE *out,char* code,long length); //调用discode()函数
void encode(char*,char*,int,long*); //加密函数
void discode(char*,char*,int,long*); //解密函数
void e_string(char *,char *); //加密字串,调用encoding()函数
void e_file_whole(char *,char *); //加密文件,调用encoding()函数
void d_string(char*,char*); //解密字串,调用decoding()函数
void d_file(char*,char*); //解密文件,调用decoding()函数
void work(int mark,char *code,char *str_path,int parts); //功能调用
//******************************************************************************
//MAIN()函数
int main()
{
char test[100],code[100],str_path[100];
int parts,con,limitation=0;
init();
gets(test);
while((limitation++)<=10)
{
con=decider(test,code,str_path,&parts);
work(con,code,str_path,parts);
fflush(stdin);
gets(test);
}
return 0;
}
//******************************************************************************
void init()
{
char c;
int i=0;
for(c=' ';c<='~';c++)
marsk[i++]=c;
record=fopen("RECORD.LOG","w+");
if(record==NULL)
{
puts("Record file can't open!");
getch();
exit(EXIT_SUCCESS);
}
}
//非可见字符不处理,直接写入密文。
void encode(char* text,char* code,int length,long* index)
{
int i,len=strlen(code);
int x,y; //坐标
for(i=0;i<length;i++)
{
if( text[i]>=' ' && text[i]<='~' )
{
x=text[i]-' ';
y=code[((*index))%len]-' ';
(*index)++;
text[i]=marsk[(x+y)%MARSK_LEN];
}
}
text[i]=0;
}
void discode(char* text,char* code,int length,long* index)
{
int x,i,len=strlen(code);
for(i=0;i<length;i++)
{
if( text[i]>=' ' && text[i]<='~' )
{
x=text[i]-code[((*index))%len];
(*index)++;
if(x<0)
text[i]=marsk[x+MARSK_LEN];
else
text[i]=marsk[x];
}
}
text[i]=0;
}
void e_string(char* code,char* str_path)
{
long index=0;
char source[100];
strcpy(source,str_path);
encode(str_path,code,strlen(str_path),&index);
printf("Encoded Text: %s/n",str_path);
current_time=time(NULL);
fprintf(record,"Source Text: %s/nEncoded Text: %s/n %s/n/n",source,str_path,ctime(¤t_time));
}
void d_string(char* code,char* str_path)
{
long index=0;
char resource[100];
strcpy(resource,str_path);
discode(str_path,code,strlen(str_path),&index);
printf("Source Text: %s/n",str_path);
current_time=time(NULL);
fprintf(record,"Encoded Text: %s/nSource Text: %s/n %s/n/n",resource,str_path,ctime(¤t_time));
}
void encoding(FILE* in,FILE* out,char* code,long length)
{
long current,mark[100],per=length/80L,x;
char buf[400];
int i=0,index=0;
for(;i<80;i++)
mark[i]=(i+1)*per;
current=0L;
putchar('/n');
for(i=0;i<80;i++)
printf(">");
while((length-current)>=400)
{
fread(buf,400,1,in);
encode(buf,code,400,&x);
fwrite(buf,400,1,out);
current+=400;
if(current>=mark[index])
{
putchar('<');
index++;
}
}
fread(buf,length-current,1,in);
encode(buf,code,400,&x);
fwrite(buf,length-current,1,out);
for(;index<80;index++)
putchar('<');
putchar('/n');
}
void decoding(FILE *in,FILE *out,char* code,long length)
{
long current,mark[100],per=length/80L,x;
char buf[400];
int i=0,index=0;
for(;i<80;i++)
mark[i]=(i+1)*per;
current=0L;
putchar('/n');
for(i=0;i<80;i++)
printf(">");
while((length-current)>=400)
{
fread(buf,400,1,in);
discode(buf,code,400,&x);
fwrite(buf,400,1,out);
current+=400;
if(current>=mark[index])
{
putchar('<');
index++;
}
}
fread(buf,length-current,1,in);
discode(buf,code,400,&x);
fwrite(buf,length-current,1,out);
for(;index<80;index++)
putchar('<');
putchar('/n');
}
void e_file_whole(char* code,char* str_path)
{
FILE *file,*infile;
long len;
char new_name[100];
len=get_f_length(str_path);
infile=fopen(str_path,"rb");
if(len==0||infile==NULL)
{
puts("File open failed!");
getch();
return ;
}
get_new_name(str_path,new_name);
file=fopen(new_name,"wb+");
if(file==NULL)
{
printf("Create file %s failed!/n",new_name);
getch();
return ;
}
encoding(infile,file,code,len);
fclose(infile);
fclose(file);
}
void d_file(char* code,char* str_path)
{
FILE *file,*infile;
long len;
char new_name[100];
len=get_f_length(str_path);
infile=fopen(str_path,"rb");
if(len==0||infile==NULL)
{
puts("File open failed!");
getch();
return ;
}
get_new_name_1(str_path,new_name);
file=fopen(new_name,"wb+");
if(file==NULL)
{
printf("Create file %s failed!/n",new_name);
getch();
return ;
}
decoding(infile,file,code,len);
fclose(infile);
fclose(file);
}
void work(int mark,char *code,char *str_path,int parts)
{
switch(mark)
{
case -1:
exit(EXIT_SUCCESS);
break;
case 1:
e_string(code,str_path);
break;
case 2:
e_file_whole(code,str_path);
break;
case 3:
d_string(code,str_path);
break;
case 4:
d_file(code,str_path);
case 0:
help();
break;
}
}
//**************************************************************************************************************
//以下是functions.h文件
//**************************************************************************************************************
#include<io.h>
#include<dir.h>
#include<time.h>
#include<string.h>
#ifndef _FUNCTIONS_H
#define _FUNCTIONS_H
#endif
//加密与解密
//菜单:1,加密(字串或文件) 2,解密(字串或文件) 3,退出
//命令格式: encode -s code string 加密字串
// encode -f code filepath 加密文件
// discode -s code string 解密字串
// discode -f code filepath 解密文件
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*加密原理:
!"#$%&'()*+,-./0123456789:。。。。klmnopqrstuvwxyz{|}~
!"#$%&'()*+,-./0123456789:。。。。klmnopqrstuvwxyz{|}~
!!"#$%&'()*+,-./0123456789:。。。。klmnopqrstuvwxyz{|}~
""#$%&'()*+,-./0123456789:。。。。klmnopqrstuvwxyz{|}~ "
##$%&'()*+,-./0123456789:。。。。klmnopqrstuvwxyz{|}~ "#
。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。
{。。。。。。。。。。。。。。。。。。。。。。。。。。。。
|。。。。。。。。。。。。。。。。。。。。。。。。。。。。
}。。。。。。。。。。。。。。。。。。。。。。。。。。。。
~。。。。。。。。。。。。。。。。。。。。。。。。。。。。
将可见ASCII码按如上排列(第一个为空格符):第一行和第一列按ASCII顺序排列 。
其余各行从该行第一列第一个字符开始排列, 到达最后一个字符'~'时再从第一个字 符‘ ’开始。
假设密码为:abcd
要加密的字串为:Hello,world!
则按如下对应:
Hello,world!
abcdabcdabcd
然后,以上下两个字符做为坐标{如:(H,a),(e,b),(l,c)},在以上表格中找到对应字符做为密文。
*/
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void help()
{
printf("命令格式: ec -s code string 加密字串(参数不带引号)/n ec -f code filepath 加密文件/n");
printf(" dc -s code string 解密字串/n dc -f code filepath 解密文件/n");
}
void tolow(char *str)
{
int i;
for(i=0;i<strlen(str);i++)
{
if(isupper(str[i]))
str[i]=tolower(str[i]);
}
}
/*返回一个标志以决定调用那一个功能:1,encode string 2,encode file
3,discode string 4,discode file
5,encode file partly 0, 格式错误
-1,退出
*/
int decider(char command[],char *code,char *str_path,int* parts)
{
char *buf,buffer[100],buffer1[3][100];
int index=0;
strcpy(buffer,command);//若以command做为参数调用strtok会改变command
if( (!strcmp(buffer,"quit"))||(!strcmp(buffer,"QUIT")) )
return -1;
buf=strtok(buffer," ");
if( (!strcmp(buf,"ec"))||(!strcmp(buf,"EC")) ) //加密
{
buf=strtok(NULL," "); //分解参数
if(buf==NULL)
return 0;
strcpy(buffer1[0],buf); //"-s","-S"
buf=strtok(NULL," ");
if(buf==NULL)
return 0;
strcpy(buffer1[1],buf); //code
buf=strtok(NULL," ");
buffer1[2][0]='/0';
strcat(buffer1[2],buf);
buf=strtok(NULL," ");
while(buf!=NULL)
{
strcat(buffer1[2]," ");
strcat(buffer1[2],buf);
buf=strtok(NULL," ");
}
if( (!strcmp(buffer1[0],"-s"))||(!strcmp(buffer1[0],"-S")) ) //加密字串
{
strcpy(code,buffer1[1]);
strcpy(str_path,buffer1[2]);
return 1;
}
else if( (!strcmp(buffer1[0],"-f"))||(!strcmp(buffer1[0],"-F")) ) //加密文件
{
strcpy(code,buffer1[1]);
strcpy(str_path,buffer1[2]);
return 2;
}
else
return 0;
}
else if( (!strcmp(buf,"dc"))||(!strcmp(buf,"DC")) ) //解密
{
while((buf=strtok(NULL," "))!=NULL)
strcpy(buffer1[index++],buf);
if(index!=3)
return 0;
if( (!strcmp(buffer1[0],"-s")) || (!strcmp(buffer1[0],"-f")) || (!strcmp(buffer1[0],"-S"))
|| (!strcmp(buffer1[0],"-F")) )
{
strcpy(code,buffer1[1]);
strcpy(str_path,buffer1[2]);
if( (!strcmp(buffer1[0],"-s"))||(!strcmp(buffer1[0],"-S")) )
return 3;
else
return 4;
return 1;
}
else
return 0;
}
else
return 0;
}
//返回零表示出错
long get_f_length(char* path)
{
struct _finddata_t fileinfo;
if((_findfirst(path,&fileinfo))==-1)
return 0L;
else
return (long)(fileinfo.size);
}
void get_new_name(char* path,char* new_path)
{
int index=strlen(path),i;
for(;index>=0;index--)
if(path[index]=='//')
break;
index++;
for(i=0;index<strlen(path);index++)
new_path[i++]=path[index];
new_path[i]=0;
strcat(new_path,".code");
}
void get_new_name_1(char *path,char *new_path)
{
int index=strlen(path),i,start=0,end=strlen(path);
for(;index>=0;index--)
if(path[index]=='//')
{
start=index+1;
break;
}
for(index=strlen(path);index>=0;index--)
if(path[index]=='.')
{
end=index-1;
break;
}
index=0;
for(i=start;i<=end;i++)
new_path[index++]=path[i];
new_path[i]=0;
}
//*************************************************************************************************************