2

我已经根据 Apple Developer 网站上提供的示例在 iOS 应用程序中实现了公钥私钥 RSA 加密。

如果我加密并返回uint8_t cipherBuffer,然后从uint8_t cipherBuffer. 但是我需要将加密的数据存储到.xcdata模型中NSData

我遇到的问题是在解密时可靠地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];
4

3 回答 3

4

如果不了解您的创作方式cipherBuffer,就很难确切地说出它为什么不起作用。但是,从文档中dataWithBytesNoCopy

返回的对象获取字节指针的所有权并在释放时释放它。因此,字节必须指向使用 malloc 分配的内存块。

如果您只是将 cipherBuffer 声明为

uint8_t cipherBuffer[BUFFER_SIZE];

它可以解释你的问题。相反,使用malloc

uint8_t* cipherBuffer = malloc(BUFFER_SIZE);
于 2012-08-05T21:34:33.250 回答
4

感谢 jgh 和乔迪;

我将加密方法更改为“malloc”缓冲区并尝试了几种将字节写入的方法NSData,最终得到:

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

最终解决这个问题的是改变我uint8_t在解密方法中创建的方式:

const uint8_t *cipherBuffer = (const uint8_t*)[data bytes];
于 2012-08-07T23:05:38.287 回答
1

听起来您正在给它一个原始指针,然后重新使用该指针。

dataWithBytesNoCopy:想要保留你给它的指针。事实上,你必须给它一个你用创建的指针malloc,因为当它处理完数据时它会释放它。

如果您不希望NSData对象获得所有权,则应使用dataWithBytesNoCopy:length:freeWhenDone:.

于 2012-08-05T21:35:57.713 回答