2012-08-05 158 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: