c语言 - 变量"s"周围的堆栈已损坏



我在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;
}

在上一个循环结束时,我得到了这个错误,我认为这是某种类型的缓冲区溢出错误,唯一能够做到这一点的变量是"encrypted",但在循环结束后,变量"k"的值与用于为"encryfied"分配内存的"buff_size"值完全相同,如果有人能帮忙,我将感谢

"加密的"是"非null终止的",所以如果字符串有10个字节,我将只分配10个字节而不是11个用于"\0"

如果需要,这里是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;
}

开关:

//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
}
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的范围是[0255],但s的合法索引仅为[0254]。您应该将s声明为256元素数组,或者查看算法实现。

当您试图访问超出分配的内存时,您的下一行会产生问题。

encrypted[buff_size] = 10;

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

calloc(buff_size, sizeof(char));

相关内容

  • 没有找到相关文章

最新更新