c加密每次遇到同样奇怪的结果

时间:2016-04-18 11:23:51

标签: c encryption

请原谅我,如果我的代码看起来多余,无法进行调试。

我只输入-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));有同样的问题。

我的猜测是因为解密遇到了文件结束而停止了。另一个原因可能是缓冲区,但它无法解释为什么它在前后运行良好。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

mcrypt_generic()生成的输出是二进制的,可能包括'\0' - 平均每生成256个字节就会发生一次。当您点击其中一个'\0'时,strlen(buffer)会告诉您返回的数据比实际数据短。您不应对包含strlen的数据使用'\0'作为数据的一部分。