C语言编程题,实现一个简易的文件加密解密系统。通过读取输入文件的每个字节,然后将每个字节与一个密钥进行异或操作(加密),然后将加密后的字节写入输出文件。解密过程是相同的,因为异或操作具有可逆性,使用相同的密钥再次异或可以恢复原始数据。

1、异或加密 (XOR Encryption)

用户提供输入的文件名、输出文件名和加密解密的密钥。程序使用异或(XOR)运算来加密或解密文件的每个字节。对于每个字节,程序将其与密钥的一个字符进行异或操作。程序以二进制方式打开文件,并通过块读取和写入数据,适用于任意类型的文件。密钥长度可能小于文件长度,程序会重复使用密钥的字符来处理文件中的每一个字节。

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

#define BUFFER_SIZE 1024

// 加密解密函数
void encrypt_decrypt(const char *input_file, const char *output_file, const char *key) {
    FILE *fin = fopen(input_file, "rb");  // 以二进制模式打开输入文件
    FILE *fout = fopen(output_file, "wb"); // 以二进制模式打开输出文件

    if (!fin || !fout) {
        printf("文件打开失败。\n");
        return;
    }

    char buffer[BUFFER_SIZE];
    size_t key_len = strlen(key);
    size_t bytes_read;
    size_t i = 0;

    // 逐块读取文件并加密或解密
    while ((bytes_read = fread(buffer, 1, BUFFER_SIZE, fin)) > 0) {
        for (size_t j = 0; j < bytes_read; j++) {
            // 将每个字节与密钥的对应字符异或
            buffer[j] ^= key[i % key_len];
            i++;
        }
        fwrite(buffer, 1, bytes_read, fout);  // 写入加密/解密后的内容
    }

    fclose(fin);
    fclose(fout);
    printf("文件处理完成。\n");
}

int main() {
    char input_file[100], output_file[100], key[100];

    // 获取用户输入的文件名和密钥
    printf("请输入要加密/解密的文件名: ");
    scanf("%s", input_file);
    printf("请输入输出文件名: ");
    scanf("%s", output_file);
    printf("请输入加密/解密密钥: ");
    scanf("%s", key);

    // 调用加密解密函数
    encrypt_decrypt(input_file, output_file, key);

    return 0;
}

2、凯撒加密 (Caesar Cipher)

凯撒加密通过将每个字符向后偏移固定的数量来进行加密,解密时将字符向前偏移相同数量即可。

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

#define SHIFT 3  // 加密/解密偏移量

// 函数声明
void caesar_encrypt(const char* input_filename, const char* output_filename, int shift);
void caesar_decrypt(const char* input_filename, const char* output_filename, int shift);

int main() {
    // 加密文件
    caesar_encrypt("input.txt", "caesar_encrypted.txt", SHIFT);
    printf("文件加密完成。\n");

    // 解密文件
    caesar_decrypt("caesar_encrypted.txt", "caesar_decrypted.txt", SHIFT);
    printf("文件解密完成。\n");

    return 0;
}

// 凯撒加密函数
void caesar_encrypt(const char* input_filename, const char* output_filename, int shift) {
    FILE *input_file = fopen(input_filename, "rb");
    FILE *output_file = fopen(output_filename, "wb");

    if (input_file == NULL || output_file == NULL) {
        perror("文件打开失败");
        exit(1);
    }

    int ch;
    while ((ch = fgetc(input_file)) != EOF) {
        if ((ch >= 'A' && ch <= 'Z')) {
            // 处理大写字母
            fputc(((ch - 'A' + shift) % 26) + 'A', output_file);
        } else if ((ch >= 'a' && ch <= 'z')) {
            // 处理小写字母
            fputc(((ch - 'a' + shift) % 26) + 'a', output_file);
        } else {
            // 其他字符不变
            fputc(ch, output_file);
        }
    }

    fclose(input_file);
    fclose(output_file);
}

// 凯撒解密函数
void caesar_decrypt(const char* input_filename, const char* output_filename, int shift) {
    FILE *input_file = fopen(input_filename, "rb");
    FILE *output_file = fopen(output_filename, "wb");

    if (input_file == NULL || output_file == NULL) {
        perror("文件打开失败");
        exit(1);
    }

    int ch;
    while ((ch = fgetc(input_file)) != EOF) {
        if ((ch >= 'A' && ch <= 'Z')) {
            // 处理大写字母
            fputc(((ch - 'A' - shift + 26) % 26) + 'A', output_file);
        } else if ((ch >= 'a' && ch <= 'z')) {
            // 处理小写字母
            fputc(((ch - 'a' - shift + 26) % 26) + 'a', output_file);
        } else {
            // 其他字符不变
            fputc(ch, output_file);
        }
    }

    fclose(input_file);
    fclose(output_file);
}

3、编译运行

使用相应的 C 语言编译器进行编译,具体的编译运行方式可能因操作系统和编译器的不同而有所差异。使用gcc编译器可以参考如下步骤,

1)编译程序

gcc encrypt_decrypt.c -o encrypt_decrypt

2)加密文件

./encrypt_decrypt input.txt encrypted.txt mysecretkey

3)解密文件

./encrypt_decrypt encrypted.txt decrypted.txt mysecretkey

推荐文档

相关文档

大家感兴趣的内容

随机列表