请原谅我,如果我的代码看起来多余,无法进行调试。
我只输入-ls作为输入。对于前两个加密,它工作正常,第三次我键入-ls,加密长度小于实际长度。
仅供参考,我使用两条鱼和cfb,IV和钥匙仅生成一次。
评论显示第三次的情况:
//buffer just read
fprintf(stderr,"\nlen is %d\n",strlen(buffer));
//Prints length 41
int k = 0;
int a = strlen(buffer);
while(k<a) {
mcrypt_generic (td, &buffer[k], 1);
k+=1;
}
fprintf(stderr,"\nk is %d\n",k);
//Prints length 41
fprintf(stderr,"\nnew len is %d\n",strlen(buffer));
//Prints length 36!!
//And it's partial result
为什么第三次加密相同的输出只到第36个字符,而循环仍然循环41次?
更奇怪的是,在第三次问题之后,它将-ls输出加密10次以上没有问题,然后一次加密长度为5,然后再次正确运行。
很奇怪,无论我重新运行多少次程序,它都会在第三次以相同的错误长度发生。
我把它放在循环中进行调试,但只是mcrypt_generic (td, &buffer, strlen(buffer));
有同样的问题。
我的猜测是因为解密遇到了文件结束而停止了。另一个原因可能是缓冲区,但它无法解释为什么它在前后运行良好。
我该如何解决这个问题?
答案 0 :(得分:2)
mcrypt_generic()
生成的输出是二进制的,可能包括'\0'
- 平均每生成256个字节就会发生一次。当您点击其中一个'\0'
时,strlen(buffer)
会告诉您返回的数据比实际数据短。您不应对包含strlen
的数据使用'\0'
作为数据的一部分。