2012-08-05 155 views
2

我已根據Apple開發人員網站上提供的示例在IOS應用程序中實施了publickey privatekey RSA加密。將uint8_t轉換爲NSData

如果我加密並返回uint8_t cipherBuffer,然後從uint8_t cipherBuffer解密,它就可以完美工作。不過,我需要將加密數據作爲NSData存儲到xcdata模型中。

我遇到的問題是可靠地將uint8_t cipherBuffer轉換爲NSData和/或在需要解密時將NSData轉換回uint8_t。解密的數據似乎被截斷。

這是我怎麼uint8_t加密緩衝區轉換爲NSData的

return [NSData dataWithBytesNoCopy:cipherBuffer length:BUFFER_SIZE]; 

我這是怎麼轉換加密的NSData回uint8_t緩衝區時,是時候對其進行解密:

uint8_t *cipherBuffer = (uint8_t*)[cipherText bytes]; 
+0

只是爲了確保cipherBuffer是一個緩衝區,它是在malloc裏面的方法嗎? – 2012-08-05 21:32:24

+0

你正在使用自動(函數範圍)數組還是你malloc的一些內存? – 2012-08-05 21:32:31

回答

2

感謝JGH和喬迪;

我改變了加密方法的malloc緩衝區,並嘗試了幾種方法來寫字節的NSData,傷口與:

return [NSData dataWithBytes:(const void *)cipherBuffer length:CIPHER_BUFFER_SIZE]; 

什麼終於解決了該問題正在改變,我在創建uint8_t方式解密方法。

const uint8_t *cipherBuffer = (const uint8_t*)[data bytes]; 
3

沒有看到你如何創建cipherBuffer,很難說明它爲什麼不能正常工作。但是,從dataWithBytesNoCopy的文檔中,

返回的對象獲取字節指針的所有權並在釋放時釋放它。因此,字節必須指向使用malloc分配的內存塊。

如果你只是聲明cipherBuffer作爲

uint8_t cipherBuffer[BUFFER_SIZE]; 

它可以解釋你的問題。相反,使用malloc:

uint8_t* cipherBuffer = malloc(BUFFER_SIZE); 
+0

緩衝區正在像這樣分配,我會嘗試malloc uint8_t * cipherBuffer; cipherBuffer =(uint8_t *)calloc(CIPHER_BUFFER_SIZE,sizeof(uint8_t)); – 2012-08-07 00:27:06

1

這聽起來像你給它一個原始指針,然後重新使用該指針。

dataWithBytesNoCopy:想要保留指針給它。實際上,你必須給它一個你用malloc創建的指針,因爲它會在數據完成時釋放()它。

如果你不想NSData對象採取所有權,你應該使用dataWithBytesNoCopy:長度:freeWhenDone: