在c中制作一个简单的XOR加密器时出错

时间:2016-03-30 02:22:02

标签: c file encryption xor

只有功能

没有编译错误

我试图在c中制作一个简单的XOR加密器。我发现加密部分不是问题,因为当XOR函数在同一个字符串上使用两次时,它返回我发回的确切字符串。我认为问题不在于加密部分,我相信在编写文件时会出现问题。

错误功能

int xorFile (char *infile, char *outfile) {
    FILE *in,
         *out;
    long lSize;
    char *buffer;

    in = fopen ( infile , "rb" );
    out = fopen(outfile, "wb");

    if( !in ) perror(infile),exit(1);

    fseek( in , 0L , SEEK_END);
    lSize = ftell( in );
    rewind( in );

    /* allocate memory for entire content */
    buffer = (char*)calloc( 1, lSize+1 );
    if( !buffer ) fclose(in),fputs("memory alloc fails",stderr),exit(1);

    /* copy the file into the buffer */
    if( 1!=fread( buffer , lSize, 1 , in) )
      fclose(in),free(buffer),fputs("entire read fails",stderr),exit(1);

    /* do your work here, buffer is a string contains the whole text */
    int i;
    for(i=0;buffer[i]!='\0';i++) {
        fputc(buffer[i] ^ XOR_KEY,out);
    }
    fclose(in);
    free(buffer);
    fclose(out);
    return 0;

}

我认为会导致错误

int i;
for(i=0;buffer[i]!='\0';i++) {
    fputc(buffer[i] ^ XOR_KEY,out);
}

完整计划

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>

#define XOR_KEY 0x6F

int xorFile (char *infile, char *outfile) {
    FILE *in,
         *out;
    long lSize;
    char *buffer;

    in = fopen ( infile , "rb" );
    out = fopen(outfile, "wb");

    if( !in ) perror("blah.txt"),exit(1);

    fseek( in , 0L , SEEK_END);
    lSize = ftell( in );
    rewind( in );

    /* allocate memory for entire content */
    buffer = (char*)calloc( 1, lSize+1 );
    if( !buffer ) fclose(in),fputs("memory alloc fails",stderr),exit(1);

    /* copy the file into the buffer */
    if( 1!=fread( buffer , lSize, 1 , in) )
      fclose(in),free(buffer),fputs("entire read fails",stderr),exit(1);

    /* do your work here, buffer is a string contains the whole text */
    int i;
    for(i=0;buffer[i]!='\0';i++) {
        fputc(buffer[i] ^ XOR_KEY,out);
    }
    fclose(in);
    free(buffer);
    fclose(out);
    return 0;

}

int main (int argc, char *argv[]) {
    if (argc <= 2) {

      fprintf (stderr, "Usage: %s [IN FILE] [OUT FILE]\n" , argv[0]) ;

      exit (1);
    }

    xorFile (argv[1], argv[2]) ;
}

经过测试的原因

  • 检查多个操作系统
  • 检查不同的文件格式
  • 检查不同的权限
  • 检查了不同的编译器(用完了测试的东西)

其他信息 当我加密源文件的副本并对其进行解密时,剩下的只有#include <std

2 个答案:

答案 0 :(得分:2)

您遇到的问题是由于您的循环过早退出造成的。以下测试将在遇到空字节时立即停止:

for(i=0;buffer[i]!='\0';i++)

要加密整个文件,需要将其更改为:

for(i=0;i<lSize;i++)

这不仅是非文本文件的问题,也是解密的问题,因为加密过程会为与您的XOR_KEY匹配的任何字符引入零字节。例如,如果您的XOR_KEY是0x69,这是一个ascii 'i',那么您的加密文件将包含一个零字节来代替每个'i'。在对其进行解密时,它会在第一个这样的字符处关闭文件,这解释了您所看到的内容。这将纠正这一点。

答案 1 :(得分:1)

buffer[i] ^= XOR_KEY;
fputc(buffer[i] ^ XOR_KEY,out);

首先,程序查看buffer[i]中的字符,对其进行异或,并将异或字符存储回buffer[i]

然后,它会查看buffer[i]中的字符(现在已经异或),再次对其进行异或,并将 写入out

因此写入out的字符已被异或两次 - 所以它只是原始字符。