我在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'具有完全相同的'buff_size'值,用於爲'加密'分配內存,如果有人可以幫助我會感謝你
'encrypted'是「非空終止」,所以如果字符串有10個字節,我將只分配10個字節,爲 '\ 0'
,如果你不用11,這裏是alloc_char_buffer(無符號整數)的代碼
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
}
'alloc_char_buffer()'中的if(buff)free(buff);''是多餘的。此外,您還可以使用'BUFF =釋放calloc(大小,的sizeof(字符));'取代的malloc和-memset的。 – timrau
什麼'之開關嗎? – Soren
○是的,謝謝你,冗餘代碼是從我正在使用的舊方法,我需要通過一個指針功能:s(但仍然不工作:() – user2542813