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