我已根据Apple Developer网站上提供的示例在IOS应用程序中实现了publickey privatekey RSA加密。
如果我加密并返回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 :(得分:3)
如果没有看到你如何创建cipherBuffer,很难确切地说它为什么不起作用。但是,从dataWithBytesNoCopy的文档,
返回的对象获取字节指针的所有权,并在取消分配时释放它。因此,字节必须指向使用malloc分配的内存块。
如果您只是将cipherBuffer声明为
uint8_t cipherBuffer[BUFFER_SIZE];
它可以解释你的问题。相反,使用malloc:
uint8_t* cipherBuffer = malloc(BUFFER_SIZE);
答案 1 :(得分:2)
我将加密方法改为malloc缓冲区,并尝试了几种方法将字节写入NSData,最后用:
return [NSData dataWithBytes:(const void *)cipherBuffer length:CIPHER_BUFFER_SIZE];
最终解决问题的方法是改变我在解密方法中创建uint8_t的方式。
const uint8_t *cipherBuffer = (const uint8_t*)[data bytes];
答案 2 :(得分:1)
听起来你正在给它一个原始指针,然后重新使用那个指针。
dataWithBytesNoCopy:想要保留你给它的指针。实际上,你必须给它一个你用malloc创建的指针,因为当它完成数据时它将释放()它。
如果您不希望NSData对象获得所有权,则应使用dataWithBytesNoCopy:length:freeWhenDone: