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

C 使用异或(XOR)加密/解密文件

之前写过一篇《php 使用异或(XOR)加密/解密文件》,但php执行的速度很慢,因此这次使用C重写,速度有很大的提高。


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


posted @ 2014-03-05 01:33  傲雪星枫  阅读(659)  评论(0编辑  收藏  举报