围绕变量'被腐败了

时间:2014-04-26 00:50:45

标签: c memory-corruption

我在我的rc4算法中遇到了这个错误,它运行良好,但每当消息太大时我都会收到此错误,如1000kB,这里是代码:

char* rc4(const int* key, int key_size, char* buff, int buff_size){
int i, j, k;
int s[255], rk[255];    //rk = random_key
char* encrypted = alloc_char_buffer(buff_size);

for (i = 0; i < 255; i++){
    s[i] = i;
    rk[i] = key[i%key_size];
}


j = 0;

for (i = 0; i < 255; i++){
    j = (j + s[j] + rk[i]) % 256;
    SWITCH(s + i, s + j);
}

i = 0;
j = 0;

for (k = 0; k < buff_size; k++){
    i = (i + 1) % 256;
    j = (j + s[i]) % 256;
    SWITCH(s + i, s + j);

    //try{

    //}
    //catch ()
    encrypted[k] = (char)(s[(s[i] + s[j]) % 256] ^ (int)buff[k]);
}

encrypted[buff_size] = 0;

return encrypted;
}

在最后一个循环结束时我得到了这个错误,我认为这是某种类型的缓冲区溢出错误,唯一能够做到这一点的变量就是加密&#39;但在循环结束时,变量&#39; k&#39;具有完全相同的&#39; buff_size&#39;用于为加密的内存分配内存,如果有人可以帮助我会感谢你

加密&#39;是&#34;非空终止&#34;,所以如果字符串有10个字节,我将只分配10个字节,而不是11个用于&#39; \ 0&#39;

如果需要,这里是alloc_char_buffer(unsigned int)的代码

char* alloc_char_buffer(unsigned int size){

char* buff = NULL;

buff = (char*)calloc(size+1, sizeof(char));

if (!buff)
    _error("program fail to alloc memory.");

return buff;
}

SWITCH:

//inversão de valores
void SWITCH(int *a, int *b){
*(a) = *(a) ^ *(b); //a random number
*(b) = *(a) ^ *(b); //get a
*(a) = *(a) ^ *(b); //get b
}

2 个答案:

答案 0 :(得分:4)

char* encrypted = alloc_char_buffer(buff_size);
/* ... */
encrypted[buff_size] = 10;

这是问题所在。您分配buff_size个元素。因此,最后一个有效索引是buff_size-1,而不是buff_size

另一个问题:

j = (j + s[j] + rk[i]) % 256;

因此j的范围是[0,255],但s的合法索引仅为[0,254]。您应该将s声明为256个元素的数组,或者查看算法实现。

答案 1 :(得分:1)

以下行正在创建问题,因为您尝试访问超出分配的内存。

encrypted[buff_size] = 10;

此外,您应该避免使用 calloc ,而不是编写自己的函数 alloc_char_buffer 。它会分配内存并用0初始化。

calloc(buff_size, sizeof(char));