简单的文件内容加密程序

我把加密文件内容的小程序分为三个文件,encrypt.c和encrypt.h和main.c主程序文件

这次先直接上完整代码

main.c文件

#include <stdio.h>
#include "encrypt.h"
#include <string.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{

here:
    help(); // 帮助文档

    while (1)
    {
        // 命令功能实现
        printf("请输入指令:");
        int cmd = 0;
        scanf("%d", &cmd);

        // 既然是文件加密,首先获取文件和文件的长度还有加密的密码
        char src_file_name[50] = "";
        char dest_file_name[50] = "";
        unsigned long int file_len = 0;
        unsigned long int password = 0;

        char *text = NULL; // 保存文本内容

        switch (cmd)
        {
        case 1:

            printf("请输入你要加密的目标文件名:");
            scanf("%s", src_file_name);
            // 获取要加密的文件名
            get_file_name(dest_file_name, src_file_name);

            // 读取文件内容,将文件内容读取到text临时文本中,就需要自定义text和读文件函数
            text = read_src_file(&file_len, src_file_name);

            // 获取加密的密码
            printf("请输入你的加密密码:");
            scanf("%lu", &password);

            // 使用获取的加密密码对文件内容加密
            text = file_text_encrypt(text, file_len, password);

            // 保存加密后的文件
            save_file(text, file_len, dest_file_name);

            break;

        case 2:
            // 功能2实现文件内容解密功能,唯一的差别在于解密函数不同
            printf("请输入你要解密的目标文件名:");
            scanf("%s", src_file_name);
            //  获取要解密的文件名
            get_file_name(dest_file_name, src_file_name);

            // 读取文件内容,将文件内容读取到text临时文本中,就需要自定义text和读文件函数
            text = read_src_file(&file_len, src_file_name);

            // 获取解密的密码
            printf("请输入你的解密密码:");
            scanf("%lu", &password);

            // 使用获取的解密密码对文件内容解密
            text = file_text_decrypt(text, file_len, password);

            // 保存解密后的文件
            save_file(text, file_len, dest_file_name);

            break;

        case 3:
            // 3功能实现程序的退出
            printf("是否要退出程序: ");
            char cmd1[32] = "";

            scanf("%s", cmd1); // 设计一个退出前的再次询问功能

            if (strcmp(cmd1, "yes") == 0)
            {
                printf("请稍后,正在退出程序中......\n");
                sleep(1);
                printf("......\n");
                sleep(1);
                printf("...\n");
                printf("程序退出成功\n");
                return 0;
            }
            else
            {
                printf("退出失败,哇哈哈哈,你肯定输错了\n");
                printf("\n");
                goto here; // 利用goto语句跳转到帮助文档
            }
        }
    }
    return 0;
}

encrypt.h头文件

#ifndef __ENCRYPT_H__
#define __ENCRYPT_H__

extern void help();
extern void get_file_name(char *dest_file_name, char *src_file_name);
extern char *read_src_file(unsigned long int *file_len, char *src_file_name);
extern char *file_text_encrypt(char *text, unsigned long int file_len, unsigned long int password);
extern void save_file(char *text, unsigned long int file_len, char *dest_file_name);
extern char *file_text_decrypt(char *text, unsigned long int file_len, unsigned long int password);

#endif

encrypt.c函数实现文件,也是最重要的部分

#include "encrypt.h"
#include <stdio.h>
#include <stdlib.h>

void help()
{
    printf("           欢迎访问文件内容加密程序手册       \n");
    printf("*****************************************\n");
    printf("@功能说明, 输入1实现文件内容加密, 输入2实现文件内容解密, 输入3实现程序退出@...\n");
    printf("退出程序可以输入命令:   yes                                                 \n");
    printf("\n");
    printf("*********  1:加密文件   ***********\n");
    printf("*********  2:解密文件   ***********\n");
    printf("*********  3:退出程序   ***********\n");
}

// 获取要加密的文件名
void get_file_name(char *dest_file_name, char *src_file_name)
{
    printf("说明:文件内容加密/解密后,可以指定保存加密/解密后的文件内容保存到新文件中,也可以保存在原来的文件内\n");
    printf("再次输入文件名:");
    scanf("%s", dest_file_name);
}

// 读取文件内容,将文件内容读取到text临时文本中,就需要自定义text和读文件函数
char *read_src_file(unsigned long int *file_len, char *src_file_name)
{
    FILE *fp = fopen(src_file_name, "r");
    if (NULL == fp)
    {
        perror("fopen");
        return NULL;
    }

    // 这个函数可以定位文件流指针,第一个参数fp是指向的文件,第二个参数是文件流指针相对于文件开头处的偏移量,第三个参数是将文件流指针定位到文件的末尾,0是定位到文件的开头,1定位到文件的中间
    fseek(fp, 0, 2);
    *file_len = ftell(fp); // ftell函数可以告诉我们文件流指针距离文件开头处的长度
    rewind(fp);            // 恢复文件流指针

    char *text = (char *)calloc(1, *file_len + 1);
    fread(text, *file_len, 1, fp);
    fclose(fp);
    return text;
}

// 加密文件
char *file_text_encrypt(char *text, unsigned long int file_len, unsigned long int password)
{
    int i = 0;
    for (i = 0; i < file_len; i++)
    {
        text[i] += password;
    }
    printf("文件内容加密成功\n");
    sleep(1);
    return text;
}

// 保存加密后的文件
void save_file(char *text, unsigned long int file_len, char *dest_file_name)
{
    FILE *fp = fopen(dest_file_name, "w");
    if (NULL == fp)
    {
        perror("fopen");
        return;
    }
    fwrite(text, file_len, 1, fp);
    free(text);  // 释放text指向的文件空间
    text = NULL; // 指针释放后置空,防止野指针
    fclose(fp);
    printf("文件内容保存成功\n");
    return;
}

// 解密文件
char *file_text_decrypt(char *text, unsigned long int file_len, unsigned long int password)
{
    int i = 0;
    for (i = 0; i < file_len; i++)
    {
        text[i] -= password;
    }
    printf("文件内容解密成功\n");
    return text;
}

运行结果:

文件内容加密操作和效果图:

 

文件内容解密后的效果图 :

 程序退出:

详细设计API设计参考:

  1. 从键盘获取源文件和目的文件名字

/**************************************************************************/

//函数功能:获取 目的文件和源文件的名字

//参数: src_file_name:源文件名字字符数组首地址。

// dest_file_name:目的文件的名字字符数组首地址

/**************************************************************************/

void get_file_name(char * dest_file_name,char * src_file_name)

  1. 从文件中读出内容

/**************************************************************************/

//函数功能:读出文件内容

//参数:file_length:整型指针,此地址中保存文件字节数。

// src_file_name:文件名字,从此文件中读取内容。

// 返回值:读出字符串的首地址

// 在此函数中测文件的大小,并malloc空间,再把文件内容读出返回,读出字符数组的首地址

/**************************************************************************/

char * read_src_file(unsigned long int *file_length,char *src_file_name)

  1. 字符数组加密

/**************************************************************************/

//函数功能:加密字符串

//参数:

// src_file_text:要加密的字符串。 length:字符串的长度  

// password: 加密密码

// 返回值: 加密后的字符串的首地址

// 加密原理字符数组中每个元素加上password

/**************************************************************************/

char * file_text_encrypt(char * src_file_text,unsigned long int length,unsigned int password)

  1. 解密字符串

/**************************************************************************/

//函数功能:解密字符串

//参数:

// src_file_text:要解密的字符串。 length:字符串的长度  

// password: 解密密码

// 返回值: 解密后的字符串的首地址

//思想;把数组中的每个元素减去password 给自己赋值。

/**************************************************************************/

char * file_text_decrypt(char * src_file_text,unsigned long int length,unsigned int password)

  1. 保存文件

/**************************************************************************/

//函数功能:将字符串保存到目的文件中

//参数:

// text:要保存的字符串首地址    

// file_name :目的文件的名字

// length:字符串的长度

//思想:传入字符数组的首地址和数组的大小及保存后的文件的名字,即可保存数组到文件中

/**************************************************************************/

void save_file(char* text,unsigned long int length,char * file_name)

  1. 打印文件信息

/**************************************************************************/

//

// 函数功能:打印帮助信息

//

//

/**************************************************************************/

void print_help()

{

printf("********1:加密文件***********\n");

printf("********2:解密文件***********\n");

printf("********3:退出程序***********\n");

}

按照需求来实现程序,大纲规划好嘞

这里的文件加密说白了就是利用逐个字符与密码相加之后的内容不可见性,然后再输入相同的密码字符串逐个字符相减,获得原来的文件内容

多练多写多思考,每一天都是新的,哈哈哈!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值