C 使用異或(XOR)加密/解密文件php
以前寫過一篇《php 使用異或(XOR)加密/解密文件》,但php執行的速度很慢,所以此次使用C重寫,速度有很大的提升。ubuntu
xor_encrypt.c函數
/** XOR 加密/解密文件 */ #define TRUE 1 #define FALSE 0 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> // 若是在/usr/include/找不到,能夠在/usr/include/sys/複製過去 // 輸出信息 void msg_log(char *str); // 判斷文件是否存在 int file_exists(char *filename); // 主函數 int main(int argc, char *argv[]){ int keylen, index=0; char *source, *dest, *key, fBuffer[1], tBuffer[20], ckey; FILE *fSource, *fDest; source = argv[1]; // 原文件 dest = argv[2]; // 目的文件 key = argv[3]; // 加密字串 // 檢查參數 if(source==NULL || dest==NULL || key==NULL){ msg_log("param error\nusage:xor_encrypt source dest key\ne.g ./xor_encrypt o.txt d.txt 123456"); exit(0); } // 判斷原文件是否存在 if(file_exists(source)==FALSE){ sprintf(tBuffer,"%s not exists",source); msg_log(tBuffer); exit(0); } // 獲取key長度 keylen = strlen(key); fSource = fopen(source, "rb"); fDest = fopen(dest, "wb"); while(!feof(fSource)){ fread(fBuffer, 1, 1, fSource); // 讀取1字節 if(!feof(fSource)){ ckey = key[index%keylen]; // 循環獲取key *fBuffer = *fBuffer ^ ckey; // xor encrypt fwrite(fBuffer, 1, 1, fDest); // 寫入文件 index ++; } } fclose(fSource); fclose(fDest); msg_log("success"); exit(0); } //輸出信息 void msg_log(char *str){ printf("%s\n", str); } // 判斷文件是否存在 int file_exists(char *filename){ return (access(filename, 0)==0); }
這張圖若是使用php來處理須要 2秒 左右,但用C處理只須要 130毫秒。加密
fdipzone@ubuntu:~/C$ gcc -o xor_encrypt xor_encrypt.c fdipzone@ubuntu:~/C$ time ./xor_encrypt 1280.jpg 1280en.jpg '@#$%^&*()_DFGHJKadsklfjasdf' success real 0m0.139s user 0m0.060s sys 0m0.070s