2016-04-22 81 views
-4

我是AES開發人員。所以我下載並使用。 所以,這是我的問題。 如果我使用[數組]是很好的工作。但如果我使用[malloc]是錯誤。我錯了什麼?c,數組和malloc的區別。錯誤

uint8_t key[] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }; 
uint8_t iv[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 
uint8_t *original = "aaaaaaaaaaaaaaaaa65aaaaaaaaaaaassssssssssssssssssssss65sssaaaaaa"; 
int len = 65; 
uint8_t out[64] = {0,}; 

uint8_t ctext[200] = { 0, }; 
//uint8_t *ctext = (uint8_t*)malloc(sizeof(uint8_t) * len); 

for (int i = 0; len > 0; i+=64) { 
    len = len - 64;  
    AES128_CBC_encrypt_buffer(out, original + i, 64, key, iv); 
    memcpy(ctext+i , out, 64); 
} 
uint8_t ptext[200] = { 0, }; 
len = 65; 
for (int i = 0; len > 0; i += 64) { 
    len = len - 64; 
    AES_CBC_dec(out, ctext + (i * sizeof(uint8_t)), key, iv, 64); 
    memcpy(ptext + (i * sizeof(uint8_t)), out, 64); 
} 
return 0; 

CTEXT [200]

它的作品。但。如果我將使用

* CTEXT

是錯誤

什麼我錯了? 它是c lang。

+1

,你使用'200',爲什麼mallocing只有'len'? –

+1

第二次通過循環,你想''memcpy'到'ctext + 64'的64個字節,並且你沒有相應的分配。這種錯誤最好在調試器或Valgrind之類的內存碎片的幫助下找到。 –

回答

0

隨着len = 65memcpy一次len = len - 64仍然是> 0第一次迭代後。
memcpy現在開始在CTEXT + 64,這將出界爲sizeof(uint8_t) * len

內存分配您可以通過使用len = 64導致循環的唯一一次迭代或通過保持len = 65和內存加倍看到這分配sizeof(uint8_t) * len * 2

如果您使用malloc不要忘記在使用artray釋放內存之後

0

* ctext是數組中的第一個uint_8。使用ctext代替(地址)。一定要分配足夠的空間。

+0

在這種方法中,'ctext [200]'是UB,反正...... –