在虚拟机中用C语言实现文件的加密,解密函数,让用户选择加密/解密
时间: 2024-09-20 07:11:41 浏览: 51
c语言对java的class文件进行加密解密
5星 · 资源好评率100%
在C语言中,要在虚拟机中实现文件的加密和解密功能,通常会使用一些常见的加密算法,如AES、DES或RSA等。这里提供一个简单的示例,我们将使用对称加密(如AES)来演示如何创建加密和解密函数,并允许用户选择操作:
首先,你需要安装必要的库,例如OpenSSL,它包含了AES的实现。确保你的环境中已经安装了。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
// 加密函数
void encrypt_file(const char *input_filename, const char *output_filename, AES_KEY key) {
FILE *in = fopen(input_filename, "rb");
if (!in) {
perror("Error opening input file");
return;
}
FILE *out = fopen(output_filename, "wb");
if (!out) {
perror("Error opening output file");
fclose(in);
return;
}
unsigned char iv[AES_BLOCK_SIZE] = {0}; // 初始化向量 (IV)
AES_encrypt(NULL, iv, AES_ENCRYPT); // 生成随机 IV
int len;
fseek(in, 0, SEEK_END);
len = ftell(in);
fseek(in, 0, SEEK_SET);
unsigned char *buffer = malloc(len + AES_BLOCK_SIZE);
fread(buffer, len, 1, in);
fclose(in);
AES_set_encrypt_key(key, 128, &key); // 使用给定的密钥
AES_cbc_encrypt(buffer, buffer, len, &key, iv, AES_ENCRYPT);
fwrite(buffer, len, 1, out);
free(buffer);
fclose(out);
}
// 解密函数
void decrypt_file(const char *input_filename, const char *output_filename, AES_KEY key) {
FILE *in = fopen(input_filename, "rb");
if (!in) {
perror("Error opening input file");
return;
}
FILE *out = fopen(output_filename, "wb");
if (!out) {
perror("Error opening output file");
fclose(in);
return;
}
unsigned char iv[AES_BLOCK_SIZE];
fread(iv, AES_BLOCK_SIZE, 1, in);
fseek(in, AES_BLOCK_SIZE, SEEK_CUR);
int len;
fseek(in, 0, SEEK_END);
len = ftell(in);
fseek(in, 0, SEEK_SET);
unsigned char *buffer = malloc(len + AES_BLOCK_SIZE);
fread(buffer, len, 1, in);
fclose(in);
AES_set_decrypt_key(key, 128, &key);
AES_cbc_encrypt(buffer, buffer, len, &key, iv, AES_DECRYPT);
fwrite(buffer, len, 1, out);
free(buffer);
fclose(out);
}
int main() {
// 获取用户输入,选择操作(加密或解密)
int choice;
printf("Choose operation:\n1. Encrypt\n2. Decrypt\n");
scanf("%d", &choice);
AES_KEY key; // 初始化一个AES密钥
AES_keygen(&key); // 这里只是一个简化示例,实际应用需要妥善处理密钥安全
if (choice == 1) {
encrypt_file("input.txt", "encrypted.txt", key);
} else if (choice == 2) {
decrypt_file("encrypted.txt", "decrypted.txt", key);
} else {
printf("Invalid choice.\n");
}
// 清理资源
AES_clean();
return 0;
}
```
在这个例子中,我们假设用户选择加密或解密操作后直接使用相同的密钥。实际上,你应该存储和管理好密钥,避免泄露。
阅读全文