基于Linux系统下的文件加密解密技术

作者:佚名 上传时间:2023-05-24 运行软件:C语言 软件版本:openssl1.1.1 版权申诉

该示例代码演示了在Linux系统下利用openssl库对文件进行加密和解密的实现方式。其中包括了采用对称加密算法AES和非对称加密算法RSA的代码示例。通过使用不同的密钥进行加密和解密,确保文件的安全性。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#include <openssl/rsa.h>

// 使用AES加密文件
void aes_encrypt_file(char *in_filename, char *out_filename, unsigned char *key) {
    AES_KEY aes_key;
    unsigned char iv[AES_BLOCK_SIZE];
    int bytesRead, bytesWrite;

    FILE *fin = fopen(in_filename, "rb");
    FILE *fout = fopen(out_filename, "wb");

    // 初始化iv向量
    memset(iv, 0, AES_BLOCK_SIZE);

    // 设置加密密钥
    AES_set_encrypt_key(key, 256, &aes_key);

    // 逐段加密文件内容
    while (1) { 
        unsigned char in_data[AES_BLOCK_SIZE];
        unsigned char out_data[AES_BLOCK_SIZE];

        bytesRead = fread(in_data, 1, AES_BLOCK_SIZE, fin);
        AES_cbc_encrypt(in_data, out_data, bytesRead, &aes_key, iv, AES_ENCRYPT);

        bytesWrite = fwrite(out_data, 1, bytesRead, fout);
        if (bytesRead < AES_BLOCK_SIZE) {
            break;
        }
    }

    fclose(fin);
    fclose(fout);
}

// 使用AES解密文件
void aes_decrypt_file(char *in_filename, char *out_filename, unsigned char *key) {
    AES_KEY aes_key;
    unsigned char iv[AES_BLOCK_SIZE];
    int bytesRead, bytesWrite;

    FILE *fin = fopen(in_filename, "rb");
    FILE *fout = fopen(out_filename, "wb");

    // 初始化iv向量
    memset(iv, 0, AES_BLOCK_SIZE);

    // 设置解密密钥
    AES_set_decrypt_key(key, 256, &aes_key);

    // 逐段解密文件内容
    while (1) {
        unsigned char in_data[AES_BLOCK_SIZE];
        unsigned char out_data[AES_BLOCK_SIZE];

        bytesRead = fread(in_data, 1, AES_BLOCK_SIZE, fin);
        AES_cbc_encrypt(in_data, out_data, bytesRead, &aes_key, iv, AES_DECRYPT);

        bytesWrite = fwrite(out_data, 1, bytesRead, fout);
        if (bytesRead < AES_BLOCK_SIZE) {
            break;
        }
    }

    fclose(fin);
    fclose(fout);
}

// 使用RSA加密AES密钥
void rsa_encrypt_key(unsigned char *key, int key_len, char *pemfile, char *cipherfile) {
    FILE * fp = fopen(pemfile, "rb");
    RSA *rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL);
    fclose(fp);

    int flen = RSA_size(rsa);
    unsigned char *out = (unsigned char*)malloc(flen);

    RSA_public_encrypt(key_len, key, out, rsa, RSA_PKCS1_OAEP_PADDING);

    FILE *fout = fopen(cipherfile, "wb");
    fwrite(out, 1, flen, fout);

    fclose(fout);
    RSA_free(rsa);
    free(out);
}

// 使用RSA解密AES密钥
void rsa_decrypt_key(unsigned char *cipher, int cipher_len, char *pemfile, unsigned char *dec) {
    FILE * fp = fopen(pemfile, "rb");
    RSA *rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
    fclose(fp);

    int flen = RSA_size(rsa);

    RSA_private_decrypt(cipher_len, cipher, dec, rsa, RSA_PKCS1_OAEP_PADDING);

    RSA_free(rsa);
}

int main() {
    // 生成随机密钥
    unsigned char key[32];
    RAND_bytes(key, 32);

    // 加密文件
    aes_encrypt_file("test.txt", "test.aes", key);

    // 加密密钥
    rsa_encrypt_key(key, 32, "public.pem", "key.cipher");

    // 解密密钥
    unsigned char out_key[32];
    memset(out_key, 0, 32);
    unsigned char cipher[256];
    int cipher_len;
    FILE *fp = fopen("key.cipher", "rb");
    cipher_len = fread(cipher, 1, 256, fp);
    rsa_decrypt_key(cipher, cipher_len, "private.pem", out_key);
    fclose(fp);

    // 解密文件
    aes_decrypt_file("test.aes", "test.dec", out_key);

    printf("Done!\n");
    return 0;
}

免责申明:文章和图片全部来源于公开网络,如有侵权,请通知删除 server@dude6.com

用户评论
相关推荐
基于Linux系统文件加密解密技术
该示例代码演示了在Linux系统下利用openssl库对文件进行加密和解密的实现方式。其中包括了采用对称加密算法AES和非对称加密算法RSA的代码示例。通过使用不同的密钥进行加密和解密,确保文件的安全
openssl1.1.1
C语言
2023-05-24 03:23
Linux加密文件解密示例代码
本示例代码演示了在Linux环境下,如何使用gpg工具进行文件加密和解密的过程。首先生成公钥和私钥,然后使用公钥加密文件,最后使用私钥进行解密,获取原始文件内容。#!/bin/bash #
gpg version 2.2.19
bash
2023-04-10 08:28
文件加密解密系统
文件加密解密系统
RAR
0B
2019-01-08 11:34
加密解密文件加密解密
文件的加密解密,一些流的操作,流的加密....DES;文件的加密解密,一些流的操作,流的加密....DES
RAR
55KB
2020-07-30 11:56
DES加密解密适用Windows和Linux系统防止Linux解密失败工具类
DES加密解密(适用Windows和Linux系统)防止linux下解密失败,主要是SecureRandom实现完全随操作系统本身的內部状态
RAR
0B
2020-05-14 21:07
applet文件加密系统基于JFrame翻译解密
java对文字加密及解密操作 把文字转化为密文,并有翻译功能 基于图形用户界面
JAVA
0B
2019-01-15 03:15
基于des加密解密系统
使用vc开发了一个基于des的文件加密解密系统
RAR
0B
2019-10-06 03:15
基于Java文件加密解密
本程序完成用户无限制的输入数据,并生成相关文件,用户设置相关的密码之后进行加密,只有用户输入正确的密码才能看到相应的数据。主要用到Java的IO流操作。
RAR
0B
2019-02-17 02:21
简易文件加密解密系统
简易文件加密解密系统.
PPTX
0B
2019-01-06 16:21
Linux文件解密技术:GnuPG
GnuPG (GNU Privacy Guard或GPG):Linux 下的基于PGP(Pretty Good Privacy)机制的加密及签