C 使用異或(xor)加密/解密文件

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
相關文章
相關標籤/搜索