只有功能
没有编译错误我试图在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
答案 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
的字符已被异或两次 - 所以它只是原始字符。