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