简单的加密与解密

//本程序在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(&current_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(&current_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;
}
 //*************************************************************************************************************              
       
           
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值