欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C-文件加解密程序-使用凯撒加密

程序员文章站 2022-07-09 13:48:21
...

main.c

#include "kaisa.h"
 

 
int main()
{
    char str[50]="";
	char str2[50]="";
	char buf[1024]="";
    int k=0,n=12,i=1;
	int len=0;

	FILE *rp,*wp;
	printf("\n输入文件名: ");
   
    scanf("%s",str);  //输入加密解密字符串
	
    //打印菜单
    printf("-----------------\n");
    printf("1: Encryption\n");
    printf("2: Decryption\n");
    printf("3:exit\n"); 
    printf("-----------------\n");
    printf("\nPlease choose: ");
    scanf("%d",&k);
    if(k==1){  //加密
		
		rp = fopen(str,"rb");
		
		strcpy(str2,"加密");
		wp = fopen(strcat(str2,str),"wb");

		if(rp == NULL || wp ==NULL){
			
			goto CLOSE;
		}

		while(1){
			len = fread(buf,1,sizeof(buf),rp);
			encode(buf,n);
			fwrite(buf,1,sizeof(buf),wp);
			if(len == 0){
				break;
			}
		}

    }else if(k==2){  //解密
       
        
		rp = fopen(str,"rb");
		strcpy(str2,"解密");
		wp = fopen(strcat(str2,str),"wb");

		if(rp == NULL || wp ==NULL){
			perror("file open error");
			goto CLOSE;
		}


		while(1){
			len=fread(buf,1,sizeof(buf),rp);
			decode(buf,n);
			fwrite(buf,1,sizeof(buf),wp);
			if(len == 0){
				break;
			}
		}
		
    }else{
        exit(0);
    }
CLOSE:
	perror("file open error");
		if(rp != NULL){
			fclose(rp);
		}
		if(wp != NULL){
			fclose(wp);
		}
	system("pause");
    return 0;
}

kaisa.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS

/*字符串加密解密程序 凯撒加密*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __cplusplus
extern "C"{
//函数encode()将字母顺序推后n位,实现文件加密功能
void encode(char str[],int n);

//decode()实现解密功能,将字母顺序前移n位
void decode(char str[],int n)
#endif

kaisa.c

//函数encode()将字母顺序推后n位,实现文件加密功能
#include "kaisa.h"
void encode(char str[],int n){
    char c;
    int i;
    for(i=0;i<strlen(str);++i){  //遍历字符串
        c=str[i];
        if(c>='a' && c<='z'){  //c是小写字母
            if(c+n%26<='z'){  //若加密后不超出小写字母范围
                str[i]=(char)(c+n%26);  //加密函数
            }else{  //加密后超出小写字母范围,从头开始循环小写字母
                str[i]=(char)(c+n%26-26);
            }
        }else if(c>='A' && c<='Z'){ //c为大写字母
            if(c + n%26 <= 'Z'){  //加密后不超出大写字母范围
                str[i]=(char)(c+n%26);
            }else{  //加密后超出大写字母范围,从头开始循环大写字母
                str[i]=(char)(c+n%26-26);
            }
        }else{  //不是字母,不加密
            str[i]=c;
        }
    }
   // printf("\nAfter encode: \n");
   // puts(str);  //输出加密后的字符串
	printf("\r正在加密..");
}
 
 
//decode()实现解密功能,将字母顺序前移n位
void decode(char str[],int n){
    char c;
    int i;
    //遍历字符串
    for(i=0;i<strlen(str);++i){
        c=str[i];
        //c为小写字母
        if(c>='a' && c<='z'){
            //解密后还为小写字母,直接解密
            if(c-n%26>='a'){
                str[i]=(char)(c-n%26);
            }else{
                //解密后不为小写字母了,通过循环小写字母处理为小写字母
                str[i]=(char)(c-n%26+26);
            }
        }else if(c >= 'A' && c<='Z'){  //c为大写字母
            if(c-n%26>='A'){  //解密后还为大写字母
                str[i]=(char)(c-n%26);
            }else{  //解密后不为大写字母了,循环大写字母,处理为大写字母
                str[i]=(char)(c-n%26+26);
            }
        }else{  //非字母不处理
            str[i]=c;
        }
    }
    printf("\r正在解密密..");
}//该函数代码有冗余,读者可改进

C语言实现加密解密功能 附带详细注释源码