Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何用XOR加密文件缓冲区?_C_Segmentation Fault - Fatal编程技术网

C 如何用XOR加密文件缓冲区?

C 如何用XOR加密文件缓冲区?,c,segmentation-fault,C,Segmentation Fault,我试图读入一个文件,用我的XOR加密密钥对每个字节进行缓冲和加密。我已经像下面那样实现了它,但是由于某些原因它出现了故障 int main(char argc,char*argv[]{ fileIn=fopen(“data.bin”,“rb”);//打开输入文件(二进制) if(fileIn==NULL){ puts(“打开输入文件时出错”); 出口(1); } //获取文件大小。 fseek(fileIn,0,SEEK_END); lSize=ftell(fileIn); 倒带(文件输入);

我试图读入一个文件,用我的XOR加密密钥对每个字节进行缓冲和加密。我已经像下面那样实现了它,但是由于某些原因它出现了故障

int main(char argc,char*argv[]{
fileIn=fopen(“data.bin”,“rb”);//打开输入文件(二进制)
if(fileIn==NULL){
puts(“打开输入文件时出错”);
出口(1);
}
//获取文件大小。
fseek(fileIn,0,SEEK_END);
lSize=ftell(fileIn);
倒带(文件输入);
printf(“文件大小:%d字节。\n”,lSize);
//分配内存以包含整个文件。
缓冲区=(无符号字符*)malloc(lSize);
if(buffer==NULL){
puts(“输入文件缓冲区的malloc失败(内存不足?);
出口(2);
}
//将文件复制到缓冲区中。
fread(缓冲区,1,lSize,fileIn);
char*enckey=“enckey123”;
无符号字符*buf=缓冲区;
int指数=0;
而(buf
它就在这里,比如
*buf++^=enckey[index++%9]

通过gdb调试,我可以看到
lSize
类似于2000,但是
index
的值为128585

我做错了什么?

此循环:

while (buf < buf + lSize - 1) {
while(buf
永远不会结束

也许你的意思是

while (buf < buffer + lSize) {
while(buf
?

注意,-1表示它不加密最后一个字符。

此循环:

while (buf < buf + lSize - 1) {
while(buf
永远不会结束

也许你的意思是

while (buf < buffer + lSize) {
while(buf
?


注意,-1意味着它不会加密最后一个字符。

循环永远不会结束

我认为循环需要一种更好的方法来只迭代
lSize
字节。 我将最后几行改为:

    // ...
    // Calculate where to stop the iteration
    const unsigned char *buf_end = buf + lSize - 1;
    // Walk over lSize bytes in the buffer
    while (buf < buf_end) {
        *buf++ ^= enckey[index++ % 9]; // 9 is the length of the encryption key
    } 
    // ...
/。。。
//计算停止迭代的位置
常量无符号字符*buf_end=buf+lSize-1;
//遍历缓冲区中的lSize字节
while(buf
循环永远不会结束

我认为循环需要一种更好的方法来只迭代
lSize
字节。 我将最后几行改为:

    // ...
    // Calculate where to stop the iteration
    const unsigned char *buf_end = buf + lSize - 1;
    // Walk over lSize bytes in the buffer
    while (buf < buf_end) {
        *buf++ ^= enckey[index++ % 9]; // 9 is the length of the encryption key
    } 
    // ...
/。。。
//计算停止迭代的位置
常量无符号字符*buf_end=buf+lSize-1;
//遍历缓冲区中的lSize字节
while(buf
与其他答案类似,但我认为这更具可读性:

与此相反:

while (buf < buf + lSize - 1) {
    *buf++ ^= enckey[index++ % 9]; // 9 is the length of the encryption key
}
while(buf
这:

(大小i=0;i{ buf[i]=enckey[i%9]; }
与其他答案类似,但我认为这更具可读性:

与此相反:

while (buf < buf + lSize - 1) {
    *buf++ ^= enckey[index++ % 9]; // 9 is the length of the encryption key
}
while(buf
这:

(大小i=0;i{ buf[i]=enckey[i%9]; }
buf
如果
lSize
为正,则决不能为假,同样的原因,当h为正时,数学不等式xbuf
或简单地
索引
。而不是执行
fseek
+
ftell
来获取通过
revend
调用,您可以在调用fopen后简单地调用以获取文件大小。您的代码失败,因为您的变量命名很愚蠢。如果您将
buf
重命名为
current_position
或类似名称,您会发现这更容易。
buf
如果
lSize
为p,则永远不会为false正的,由于同样的原因,当h为正时,数学不等式xbuf或简单地
index
。而不是执行
fseek
+
ftell
来获得文件大小,然后执行
回放
调用,只需调用即可获得文件大小调用fopen后,代码会失败,因为变量命名很愚蠢。如果您将
buf
重命名为
current\u position
或类似名称,您会发现这更容易。此外,由于循环永不结束,
buf
最终会增加到分配数据的末尾。此外,t之所以发生SEGFULT,是因为循环永远不会结束,
buf
最终会增加到分配数据的末尾。