2014-04-26 56 views
-1

我在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 
} 
+1

'alloc_char_buffer()'中的if(buff)free(buff);''是多餘的。此外,您還可以使用'BUFF =釋放calloc(大小,的sizeof(字符));'取代的malloc和-memset的。 – timrau

+0

什麼'之開關嗎? – Soren

+0

○是的,謝謝你,冗餘代碼是從我正在使用的舊方法,我需要通過一個指針功能:s(但仍然不工作:() – user2542813

回答

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個元素的數組,或者查看算法實現。

+0

看看其他的答案,我已經解釋過:... S – user2542813

+0

@ user2542813更新我的回答 – timrau

+0

笑感謝,現在它的工作原理熱意思是,非常感謝:) – user2542813

1

當您嘗試訪問超出分配的內存時,您的以下行會產生問題。

encrypted[buff_size] = 10; 

此外,你應該避免使用釋放calloc,而不是寫自己的函數alloc_char_buffer的。它會分配內存並初始化爲0.

calloc(buff_size, sizeof(char)); 
+0

遺憾的是,它只是一個測試,我只是爲了測試'加密'是否是問題的原因,但是'''變量在那之後仍然是相同的,只是在最後一個循環中她得到了值的變化。 – user2542813

+0

我做到了:變化的malloc爲釋放calloc,但問題仍然存在 – user2542813

+0

@ user2542813:我還看到你的程序加密[BUFF_SIZE] = 10;加密[buff_size] = 0;在你的代碼中。你可以像call_size + 1那樣在calloc中分配一個或者使用加密的[buff_size -1] = 10; –