C 如何用XOR加密文件缓冲区?
我试图读入一个文件,用我的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); 倒带(文件输入);
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
最终会增加到分配数据的末尾。