c语言 文件加密与解密

 

本程序是一个c语言的大作业的一部分

是简单的基于给定密钥实现的加密解密程序

希望能给后来人一些参考

 

文件的传输会有明文和密文的区别,明文发送是不安全的。本题目实现对文件的加密和解密操作,采用的加密算法是根据密钥将明文中的字母置换为其它字母,所有字母不区分大小写,不考虑除英文字母外的字符。例如:明文是:They will arrive tomorrow,密钥k=Monday,具体加密过程如下:

① 设置英文字母与0到25有如下的对应关系:

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

②依据上述对应关系将明文和密钥转化为一组数字:

  k=(12,14,13,3,0,24)

  m=(19,7,4,24,22,8,11,11,0,17,17,8,21,4,19,14,12,14,17,17,14,22)

③将明文数字依据密钥长度分段,并逐一与密钥数字相加(模26),得到密文数字,即:

 

 

19

7

4

24

22

8

11

11

0

17

17

8

21

4

19

14

12

14

17

17

14

22

12

14

13

3

0

24

12

14

13

3

0

24

12

14

13

3

0

24

12

14

13

3

5

21

17

1

22

6

23

25

13

20

17

6

7

18

6

17

12

12

3

5

1

25

C=(5,21,17,1,22,6,23,25,13,20,17,6,7,18,6,17,12,12,3,5,1,25)

④依据字母和数字对应关系将密文数字转换为字母串,即密文为:

  c=FVRBWGXZNURGHSGRMMDFBZ

解密过程与加密过程类似,采用的是模26减运算。

功能要求:

主函数提供功能菜单供用户选择,用户可以选择调用以下各个功能,也可以选择退出程序。系统应提供以下功能:

  1. 加密:对给定文件file1.txt内容按照密钥k=Monday进行加密,加密后密文写到文件file2.txt中;
  2. 解密:对给定密文文件file3.txt 利用密钥k=Monday进行解密,解密后的明文存放在文件file4.txt中;

 

 

 

#include<stdio.h>  int key[6]={12,14,13,3,0,24};//定义密钥  int complex(); int simplify();  int main() { 	int i=0,j=0; 	printf("功能如下n1.加密n2.解密n3.退出n"); 	printf("请输入您所需功能对应的序号:(例:如需调用加密功能,便打出1即可)n"); 	for(;;)//直到输入3时才会退出  	{ 		scanf("%d",&i); 		if(i==1)j=complex(); 		if(i==2)j=simplify(); 		if(i==3)break; 		if(j==1)printf("n功能实现成功n"); 		if(j==0)printf("n功能实现失败n");  	} 	return 0; } int complex() //加密  { 	FILE *pin, *pout; 	pin = fopen("file1.txt","r"); 	pout= fopen("file2.txt","w");  	int k=0; 	char Ming[1000],Mi[1000],*p=Ming,*q=Mi;  	fgets(Ming,1000,pin); //puts(Ming); 	for(;*p!='';p++) 	{ 		if(*p>='a'&&*p<='z') 		{ 			*q=(*p-97+key[k])%26+65;//	printf(" %d %d %cn",*(key+k),k,*q); 			k=k+1;q++;  			if(k==6)k=0; 		} 		if(*p>='A'&&*p<='Z') 		{ 			*q=(*p-65+key[k])%26+65;//	printf(" %d %d %cn",*(key+k),k,*q); 			k=k+1;q++; 			if(k==6)k=0; 		} 	} 	*q=''; 	//printf("密文为:");	//puts(Mi); 	fputs(Mi,pout);  	fclose(pin); 	fclose(pout); 	return 1;  }   int simplify()//解密   {	  	FILE *pin, *pout; 	pin = fopen("file3.txt","r"); 	pout= fopen("file4.txt","w");//打开文件  	int k=0; //定义密钥 //k的意义是让密匙能够循环使用  	char Ming[1000],Mi[1000],*p=Mi,*q=Ming;//定义密文,明文字符串  	fgets(Mi,1000,pin);//从文件3读取密文  	for(;*p!='';p++)//解密  	{  		if(*p>='A'&&*p<='Z') 		{ 			*q=(*p-65+26+26-*(key+k))%26+65;//printf(" %d %d %cn",*(key+k),k,*q);//检验key出没出问题 	 			k=k+1;q++; 			if(k==6)k=0;//这两行代码让密钥循环使用  		}	 	} 	*q='';//使字符串结束  	fputs(Ming,pout);//puts(Ming);检验输出结果//导出加密结果  	fclose(pin); 	fclose(pout); //关闭两个文件 	return 1;  }

版权声明:玥玥 发表于 2021-06-11 4:44:23。
转载请注明:c语言 文件加密与解密 | 女黑客导航