【Linux】C语言实现对文件的加密算法

news2025/1/5 14:56:19

异或加密

解密方式是进行第二次加密后自动解密

#define BUF_SIZE (16384)    //16k
/**************************************************************
功能描述: 加密实现
输入参数: 
---------------------------------------------------------------
修改作者: 
修改日期: 
修改说明:新增
***************************************************************/
void log_encrypt(char *data, int dataLen, const char *key)
{
    int n = 0;
    //对data的每一个字符和key进行按位异或
    for(n = 0; n < dataLen; n++)
    {
        *data = *data ^ 0x09;
        data++;
    }
}

/**************************************************************
功能描述: log文件加密
输入参数: 
---------------------------------------------------------------
修改作者: 
修改日期: 
修改说明:新增
***************************************************************/
unsigned int log_encryptFile(char *srcFileName)
{
    char *key = "google";
    int  srcFd = -1;
    int  dstFd = -1;
    char *tmpBuf = NULL;
    int  tmpLen = 0;
    int  writLen = 0;

    log_printf("start: CountFile build date: %s, [%s, %d]\n", __DATE__, __FUNCTION__, __LINE__);

    if (!srcFileName)
    {
        log_printf("srcFileName err![%s, %d]\n", __FUNCTION__, __LINE__);
        return EXIT_FAILURE;
    }

    srcFd = open(srcFileName, O_RDWR);
    log_printf("srcFileName:[%s] fd:[%d]\n", srcFileName, srcFd);
    if (srcFd < 0)
    {
        log_printf("open src file failed! [err:%d:%s]\n", errno, strerror(errno));
        return EXIT_FAILURE;
    }

    log_printf("file size:[%d]\n", lseek(srcFd, 0, SEEK_END));
    lseek(srcFd, 0, SEEK_SET);

    tmpBuf = (char *)malloc(BUF_SIZE);
    if (!tmpBuf)
    {
        log_printf("malloc buf failed! [err:%d:%s]\n", errno, strerror(errno));
        close(srcFd);
        return EXIT_FAILURE;
    }

    while((tmpLen = read(srcFd, tmpBuf, BUF_SIZE)) > 0)
    {
        //加密数据
        log_encrypt(tmpBuf, tmpLen, key);
        //指针会到此包开始处
        lseek(srcFd, -tmpLen, SEEK_CUR);
        //写文件
        writLen = write(srcFd, tmpBuf, tmpLen);
        if (writLen < 0)
        {
            log_printf("write err,Error: %s\n", strerror(errno));
        }
    }

    close(srcFd);
    free(tmpBuf);

    log_printf("end: ok: [%s, %d]\n", __FUNCTION__, __LINE__);

    return EXIT_SUCCESS;
}

AES加密

AES的算法时间复杂度最低,256K时间如下:
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/sha.h>

#define BLOCK_SIZE 16
#define KEY_BIT 256
#define IV_SIZE BLOCK_SIZE
#define KEY_SIZE (KEY_BIT/8)
#define JIEMI_SWITCH		1	//解密开关
// Generate IV
unsigned char iv[IV_SIZE] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};

void file_encrypt(char* filename) {
    FILE* fp = fopen(filename, "rb");
    FILE* outfp = fopen("encrypted.tmp", "wb");
    if(fp == NULL) {
        printf("Can't open file.\n");
        return;
    }

    // Generate key
    unsigned char key[KEY_SIZE];
    SHA256((unsigned char*)"google", strlen("google"), key);

    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    if(EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv) != 1) {
        printf("Failed to initialize encryption.\n");
        return;
    }

    unsigned char data_block[BLOCK_SIZE];
    unsigned char encrypt_block[BLOCK_SIZE + EVP_MAX_BLOCK_LENGTH];
    int out_len;

    fseek(fp, 0, SEEK_END);
    long file_size = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    unsigned char* buffer = (unsigned char*)malloc(file_size + EVP_MAX_BLOCK_LENGTH);
    fread(buffer, 1, file_size, fp);

    for(long i = 0; i < file_size; i += BLOCK_SIZE) {
        memcpy(data_block, buffer + i, BLOCK_SIZE);
        if(i + BLOCK_SIZE > file_size) {
            for(int j = file_size % BLOCK_SIZE; j < BLOCK_SIZE; ++j)
                data_block[j] = BLOCK_SIZE - (file_size % BLOCK_SIZE);
        }
        if(EVP_EncryptUpdate(ctx, encrypt_block, &out_len, data_block, BLOCK_SIZE) != 1) {
            printf("Failed to encrypt block.\n");
            return;
        }
        fwrite(encrypt_block, 1, out_len, outfp);
    }

    if(EVP_EncryptFinal_ex(ctx, encrypt_block, &out_len) != 1) {
        printf("Failed to finish encryption.\n");
        return;
    }
    fwrite(encrypt_block, 1, out_len, outfp);

    free(buffer);
    fclose(fp);
    fclose(outfp);
    rename("encrypted.tmp", filename);
    EVP_CIPHER_CTX_free(ctx);
}

void file_decrypt(char* filename) {
    FILE* fp = fopen(filename, "rb");
    FILE* outfp = fopen("decrypted.tmp", "wb");
    if(fp == NULL) {
        printf("Can't open file.\n");
        return;
    }

    // Generate key
    unsigned char key[KEY_SIZE];
    SHA256((unsigned char*)"google", strlen("google"), key);

    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    if(EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv) != 1) {
        printf("Failed to initialize decryption.\n");
        return;
    }

    unsigned char data_block[BLOCK_SIZE];
    unsigned char decrypt_block[BLOCK_SIZE + EVP_MAX_BLOCK_LENGTH];
    int out_len;

    fseek(fp, 0, SEEK_END);
    long file_size = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    unsigned char* buffer = (unsigned char*)malloc(file_size + EVP_MAX_BLOCK_LENGTH);
    fread(buffer, 1, file_size, fp);

    for(long i = 0; i < file_size; i += BLOCK_SIZE) {
        memcpy(data_block, buffer + i, BLOCK_SIZE);
        if(EVP_DecryptUpdate(ctx, decrypt_block, &out_len, data_block, BLOCK_SIZE) != 1) {
            printf("Failed to decrypt block.\n");
            return;
        }
        fwrite(decrypt_block, 1, out_len, outfp);
    }

    if(EVP_DecryptFinal_ex(ctx, decrypt_block, &out_len) != 1) {
        printf("Failed to finish decryption.\n");
        return;
    }
    fwrite(decrypt_block, 1, out_len, outfp);

    free(buffer);
    fclose(fp);
    fclose(outfp);
    rename("decrypted.tmp", filename);
    EVP_CIPHER_CTX_free(ctx);
}

int main(int argc, char **argv) {
    if(argc != 2) {
        printf("Usage: %s <file>\n", argv[0]);
        return 1;
    }

    char *srcFileName = argv[1];
#if JIEMI_SWITCH
    file_encrypt(srcFileName);
    printf("加密成功\n");
#else
    file_decrypt(srcFileName);
    printf("解密成功\n");
#endif
    return 0;
}

简单加密

它只是对输入文件进行简单的异或加密操作,使用一个字符串作为密钥
时间复杂度较高,对257K的文件加密,要33s
在这里插入图片描述

/**************************************************************
修改作者:wangjj
修改日期:9/25/2023
修改说明:新增
***************************************************************/
unsigned int log_encryptFile(char *srcFileName)
{
    char *key = "hualaixiaofang";
    int keyLen = strlen(key);
    int ch;
    int i = 0;

    log_printf("encrytFile begin [%s,%d\n]", __FUNCTION__, __LINE__);

    if (!srcFileName || !key)
    {
        log_printf("param err! error:%s [%s,%d]\n", strerror(errno), __FUNCTION__, __LINE__);
        return EXIT_FAILURE;
    }	

    FILE *file = fopen(srcFileName, "rb+");
    if (file == NULL)
    {
        log_printf("open file failed!!, error:%s [%s,%d]\n", strerror(errno), __FUNCTION__, __LINE__);
        return EXIT_FAILURE;
    }

    while ((ch = fgetc(file)) != EOF)
    {
        // 对每个字符和key的对应字符进行加密操作
        ch = ch + key[i];
        
        // 将加密后的字符写回文件
        fseek(file, -1, SEEK_CUR);
        fputc(ch, file);
        
        // 更新key的位置
        i = (i + 1) % keyLen;
    }
    log_printf("encrytFile end [%s,%d\n]", __FUNCTION__, __LINE__);
    fclose(file);
}

编译方式

gcc -o decrypt_program_jiemi AES_encrypt.c -lcrypto

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1041824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小尘送书-第五期】《巧用ChatGPT快速提高职场晋升力》用ChatGPT快速提升职场能力,全面促进自身职业发展

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

qq录屏快捷键大全,玩转录制就这么简单(干货)

“qq有录屏快捷键吗&#xff1f;有点好奇&#xff0c;现在用qq录制屏幕&#xff0c;总是得去点击屏幕录制才可以出来&#xff0c;太麻烦了&#xff0c;如果可以通过快捷键的方式打开&#xff0c;会轻松许多&#xff0c;想问问大家&#xff0c;知道qq录屏快捷键是多少吗&#xf…

#你我都是国家队#,与泸州老窖一起为中国荣耀干杯

执笔 | 姜 姜 编辑 | 古利特 代表亚洲最高水平的体育盛会已经开幕两天&#xff0c;国家队运动员们在赛场上挥洒汗水&#xff0c;国人的激情也随之升温。 为迎接这场体育盛会&#xff0c;9月13日&#xff0c;TEAM CHINA中国国家队官方微博携手泸州老窖发布了一条态度短片&am…

R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类...

原文链接&#xff1a;http://tecdat.cn/?p21379 本文我们对逻辑回归和样条曲线进行介绍&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 logistic回归基于以下假设&#xff1a;给定协变量x&#xff0c;Y具有伯努利分布&#xff0c; 目的是估计参数β。 回想一…

如何在Python中实现高效的数据处理与分析

在当今信息爆炸的时代&#xff0c;我们面对的数据量越来越大&#xff0c;如何高效地处理和分析数据成为了一种迫切的需求。Python作为一种强大的编程语言&#xff0c;提供了丰富的数据处理和分析库&#xff0c;帮助我们轻松应对这个挑战。本文将为您介绍如何在Python中实现高效…

【深度学习实验】卷积神经网络(二):自定义简单的二维卷积神经网络

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 二维互相关运算&#xff08;corr2d&#xff09; 2. 二维卷积层类&#xff08;Conv2D&#xff09; a. __init__&#xff08;初始化&#xff09; b. forward(前向传…

Vue2 常用用法

Vue2 常用用法 Vue 动画1. 进入、离开的过渡2. 列表的过渡3. 状态的过渡 Vue 透传Attrbute、插槽1.透传Attrbute2. 插槽 CSS布局原则flex 布局常见的问题&#xff1a;当子元素内容超出父元素时&#xff0c;不出现滚动条的问题。父元素flex:1且内容超出后的最佳解决方案&#xf…

新版首途影视视频网站源码/22套带后台版全开源+无加密源码(全新二开完整版)

源码简介&#xff1a; 首途影视是一个非常受欢迎的视频网站&#xff0c;提供各种电影、电视剧、综艺节目等内容。它是一个基于Web的视频流媒体平台&#xff0c;你可以随时随地在手机上或电脑上在线观看自己喜欢的影视作品。 新版首途影视视频网站源码/22套带后台版全开源无加…

U盘恢复怎么做?4个方法,拯救你的u盘数据!

“我的u盘对我来说意义重大&#xff0c;里面保存着很重要的照片和视频。但是不知道是不是太久没使用&#xff0c;现在将u盘插入电脑后&#xff0c;有些数据好像丢失了&#xff0c;完全没办法查看了。怎么解决呢&#xff1f;” 随着u盘的广泛使用&#xff0c;数据丢失问题也更为…

7.16 SpringBoot项目实战 【学生入驻】(下):正确理解 编程式事务和声明式事务

文章目录 前言一、service层1. 提交学生信息2. 申请借阅资格3. 重新提交4. 事务 二、web层 StudentController三、测试最后 前言 通过上文&#xff0c;我们实现了【学生入驻】的第一个API&#xff1a;查询学生信息&#xff0c;接下来的流程通常如下图&#xff1a;如果学生未入…

Python第二次作业(2)【控制台界面】

要求&#xff1a;使用Python输出五个控制台界面 第一张&#xff1a; 代码如下&#xff1a; print(" 英雄联盟商城登录界面 ") print("~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*") print(" 1.用户登录 &q…

STL常用遍历、查找算法

目录 算法概述 常用遍历算法for_each 常用遍历算法transform 常用查找算法find 常用查找算法find_if 常用查找算法adjacent_find 常用查找算法binary_search 常用查找算法count 常用查找算法count_if 算法概述 算法主要是由头文件<algorithm><functional>…

Linux系统编程-文件

目录 1、系统编程介绍以及文件基本操作文件编程系统调用文件基本读写练习 2、文件描述符以及大文件拷贝文件描述符大文件拷贝对比试验 3、文件实战练习 1、系统编程介绍以及文件基本操作 系统编程是基于Linux封装好的一些函数&#xff0c;进行开发。 Linux文件信息属性在indo…

面试题:集群高并发环境下如何保证分布式唯一全局ID生成?

文章目录 前言问题为什么需要分布式全局唯一ID以及分布式ID的业务需求ID生成规则部分硬性要求ID号生成系统的可用性要求 一般通用解决方案UUID数据库自增主键 集群分布式集群基于Redis生成全局ID策略单机版集群分布式 雪花算法什么是雪花算法结构实现SpringBoot整合雪花算法 前…

【Pm4py第七讲】关于visualization

本节用于介绍pm4py中的可视化函数&#xff0c;包括可视化bpmn、petri、性能图谱、变迁系统等。 1.函数概述 本次主要介绍Pm4py中一些常见的可视化函数&#xff0c;总览如下表&#xff1a; 函数名说明view_alignments(log, aligned_traces[, format])可视化对齐方法 view_bpmn(…

QT之QML开发 行列布局,流布局,网格布局

本节将演示一下QML布局之行列布局&#xff0c;流布局和网格布局 目录 1.行列布局 1.1一列多行 1.2 一行多列 2.流布局 2.1 从左向右&#xff08;默认&#xff09; ​编辑 2.2 从上往下 3.网格布局 1.行列布局 1.1一列多行 // 行列布局 import QtQuick 2.15 import Qt…

前端架构师进阶之路07_JavaScript函数

1 函数的定义与调用 1.1 初识函数 函数是用于封装一段完成特定功能的代码。 相当于将一条或多条语句组成的代码块包裹起来&#xff0c;在使用时只需关心参数和返回值&#xff0c;就能完成特定的功能&#xff0c;而不用了解具体的实现。 // 内置函数 console.log(parseFloat…

基于R语言、MATLAB、Python机器学习方法与案例分析

目录 基于R语言机器学习方法与案例分析 基于MATLAB机器学习、深度学习在图像处理中的实践技术应用 全套Python机器学习核心技术与案例分析实践应用 基于R语言机器学习方法与案例分析 机器学习已经成为继理论、实验和数值计算之后的科研“第四范式”&#xff0c;是发现新规律&…

iOS技术之app审核信息填写联系人信息提交失败

在AppStore Connect中填写联系人信息中联系方式的电话号码时,输入11位手机号,一直提示 此栏无效: 报错一直说明次栏无效, 开始以为手机号不兼容, 换了好多手机号,座机号都不行, 最终尝试正确的输入格式是:86-xxxxxxxxxxx, 前面有""号, 连接用"-"

关于Modbus消息帧,这些内容你都了解吗?

在 Modbus网络通信的两种传输模式中&#xff08; ASCII或RTU&#xff09;&#xff0c;传输设备以将Modbus消息转为有起点和终点的帧&#xff0c;这就允许接收的设备在消息起始处开始工作&#xff0c;读地址分配信息&#xff0c;判断哪一个设备被选中&#xff08;广播方式则传给…