好友
阅读权限10
听众
最后登录1970-1-1
|
背景: 之前一个客户需要加密解密他自己的工作文件,所以请我编写了一个小工具,当时为了快速弄完所以就用Java写的UI与算法,打包成JAR给他使用的,本来核心代码不多,但要运行Java代码就需要JRE环境,所以导致打的包很大.
改进: 这次我将小工具的算法用C语言重新编写了,目前在macOS上测试通过, 预计Linux也可以的, Windows没有尝试.
算法: 对文件的每个byte进行反码一次为加密,再次反码则解密,没有添加其他更复杂的算法,所以比较简易.
说明: 1. 加密解密后的扩展名未自动添加 2. 暂没有对文件夹加密与解密 3. C语言新手,请赐教,谢谢~~~
效果图:
加密解密文件
代码:
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#define MAX_SIZE 300 //字符数组大小
#define BUFFERSIZE 1024 * 1024
// 取得文件大小
int file_size(char *filename) {
struct stat statbuf;
stat(filename, &statbuf);
int size = statbuf.st_size;
return size;
}
// 加密文件
int encryptionFile() {
char file_name[MAX_SIZE] = { 0 }; // 原始文件名及路径
char file_name_new[MAX_SIZE] = { 0 }; // 加密后文件名及路径
int oldFileAllTotalSize = 0; // 原始文件大小
int index = 0, *out = 0;
int encryByte = 0;
printf("请输入或拖入要加密文件名及路径[eg: c:/aa.txt]:");
scanf("%s", &file_name);
strcpy(file_name_new, file_name);
strcat(file_name_new, "_new");
printf("原始文件名: %s\n加密后文件名: %s\n", file_name, file_name_new);
int totalcount = 0;
//读取文件写入文件
FILE *oldFile = fopen(file_name, "rb"); // r:只读 , b:二进制
//获取文件的大小
if (!oldFile) {
printf("文件不存在!\n");
return -1;
}
oldFileAllTotalSize = file_size(file_name);
printf("文件总大小: %d\n", oldFileAllTotalSize);
FILE *newFile = fopen(file_name_new, "wb+"); // w:可写 , b:二进制 +:不存在则创建
char buf[BUFFERSIZE];
int len = 0;
while (!feof(oldFile)) {
len = fread(buf, 1, BUFFERSIZE, oldFile);
if (len >= 0) {
totalcount += len;
for (index = 0; index < len; index++) {
out = &buf[index];
encryByte = ~*out; // byte首次取反加密,再次取反则解密
fwrite(&encryByte, 1, 1, newFile);
}
printf("处理进度:%.2f%s\n", ((float) totalcount / (float) oldFileAllTotalSize) * 100, "%");
}
}
fclose(oldFile);
fclose(newFile);
printf("完成加密或解密!!! 处理后文件路径: %s\n\n", file_name_new);
encryptionFile();
}
int main(void) {
encryptionFile();
return 0;
}
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|