c语言中的文件加密与解密

 更新时间:2023年04月28日 10:23:29   作者:九磅十五便士的业余编程人  
这篇文章主要介绍了c语言中的文件加密与解密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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减运算

功能要求

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

系统应提供以下功能

  • 加密:对给定文件file1.txt内容按照密钥k=Monday进行加密,加密后密文写到文件file2.txt中;
  • 解密:对给定密文文件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!='\0';p++)
	{
		if(*p>='a'&&*p<='z')
		{
			*q=(*p-97+key[k])%26+65;//	printf(" %d %d %c\n",*(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 %c\n",*(key+k),k,*q);
			k=k+1;q++;
			if(k==6)k=0;
		}
	}
	*q='\0';
	//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!='\0';p++)//解密 
	{ 
		if(*p>='A'&&*p<='Z')
		{
			*q=(*p-65+26+26-*(key+k))%26+65;//printf(" %d %d %c\n",*(key+k),k,*q);//检验key出没出问题 	
			k=k+1;q++;
			if(k==6)k=0;//这两行代码让密钥循环使用 
		}	
	}
	*q='\0';//使字符串结束 
	fputs(Ming,pout);//puts(Ming);检验输出结果//导出加密结果 
	fclose(pin);
	fclose(pout); //关闭两个文件
	return 1;
 }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++哈希表之闭散列方法的模拟实现详解

    C++哈希表之闭散列方法的模拟实现详解

    闭散列指(开放定址法)发生冲突时,如果哈希表没有被填满,则表内一定还有其他空闲位置,可以把冲突值放到下一个没有被占用的空余位置上。本文将模拟实现闭散列方法,需要的可以参考一下
    2022-11-11
  • Matlab实现遗传算法的示例详解

    Matlab实现遗传算法的示例详解

    这篇文章主要为大家详细介绍了什么是遗传算法,以及如何利用Matlab从零开始自己写一个遗传算法函数,文中的代码对我们学习有一定帮助,需要的可以参考一下
    2022-03-03
  • LeetCode题解C++生成每种字符都是奇数个的字符串

    LeetCode题解C++生成每种字符都是奇数个的字符串

    这篇文章主要为大家介绍了LeetCode题解C++生成每种字符都是奇数个的字符串示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • C语言基础全局变量与局部变量教程详解

    C语言基础全局变量与局部变量教程详解

    此处对于全局与局部做一些简要的介绍,包括全局变量与局部变量,静态全局变量与静态局部变量,全局函数与静态函数,作者实属初学,文中若有理解不当之处,还请朋友们不吝指正
    2021-11-11
  • QT实现图片轮播

    QT实现图片轮播

    这篇文章主要介绍了QT实现图片轮播,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C语言求解最长公共子字符串问题及相关的算法分析

    C语言求解最长公共子字符串问题及相关的算法分析

    最长公共子字符串问题即是求一个字符串在另一个字符串中出现的连续最多字符,这里我们来看一下面试中经常出现的C语言求解最长公共子字符串问题及相关的算法分析
    2016-06-06
  • C++中队列queue的用法实例详解

    C++中队列queue的用法实例详解

    队列先进先出,即只能在容器的末尾添加新元素,只能从头部移除元素,下面这篇文章主要给大家介绍了关于C++中队列queue用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • QT实现动态时钟

    QT实现动态时钟

    这篇文章主要为大家详细介绍了QT实现动态时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C++自定义API函数实现大数相乘算法

    C++自定义API函数实现大数相乘算法

    这篇文章主要为大家详细介绍了C++自定义API函数实现大数相乘算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • C++通过CryptoPP计算Hash值的过程详解

    C++通过CryptoPP计算Hash值的过程详解

    Crypto++ (CryptoPP) 是一个用于密码学和加密的C++库,它是一个开源项目,提供了大量的密码学算法和功能,本文小编给大家介绍了C++通过CryptoPP计算Hash值的过程,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2023-11-11

最新评论