【发布时间】:2014-05-14 14:25:42
【问题描述】:
我正在尝试使用 CommonCrypto 加密 NSMutableData 对象(将生成的字节复制到自身,而不复制它)。以前,我使用 CCCrypt() “一次性”方法,主要是因为它看起来很简单。我注意到我的数据对象在内存中重复了。 为了避免这种情况,我尝试使用缓冲区大小为 2048 字节的 NSInputStream 对象。我正在阅读我的 NSMutableData 对象,并不断调用 CCCryptorUpdate() 来处理加密。问题是,它似乎仍然是重复的。这是我当前的代码(请注意,它是 NSMutableData 上的一个类别 - 主要是因为历史原因 - 因此是“自我”引用):
- (BOOL)encryptWithKey:(NSString *)key
{
// Key creation - not relevant to the dercribed problem
char * keyPtr = calloc(1, kCCKeySizeAES256+1);
[key getCString: keyPtr maxLength: sizeof(keyPtr) encoding: NSUTF8StringEncoding];
// Create cryptographic context for encryption
CCCryptorRef cryptor;
CCCryptorStatus status = CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode, keyPtr, kCCKeySizeAES256, NULL, &cryptor);
if (status != kCCSuccess)
{
MCLog(@"Failed to create a cryptographic context (%d CCCryptorStatus status).", status);
}
// Initialize the input stream
NSInputStream *inStream = [[NSInputStream alloc] initWithData:self];
[inStream open];
NSInteger result;
// BUFFER_LEN is a define 2048
uint8_t buffer[BUFFER_LEN];
size_t bytesWritten;
while ([inStream hasBytesAvailable])
{
result = [inStream read:buffer maxLength:BUFFER_LEN];
if (result > 0)
{
// Encryption goes here
status = CCCryptorUpdate(
cryptor, // Previously created cryptographic context
&result, // Input data
BUFFER_LEN, // Length of the input data
[self mutableBytes], // Result is written here
[self length], // Size of result
&bytesWritten // Number of bytes written
);
if (status != kCCSuccess)
{
MCLog(@"Error during data encryption (%d CCCryptorStatus status)", status);
}
}
else
{
// Error
}
}
// Cleanup
[inStream close];
CCCryptorRelease(cryptor);
free(keyPtr);
return ( status == kCCSuccess );
}
我在这里肯定遗漏了一些明显的东西,加密,甚至使用输入流对我来说有点新鲜......
【问题讨论】:
-
输入输出缓冲区有什么问题?
-
问题是有大文件需要加密,我不想让它们在内存中重复。
-
所以真的没有问题,只是暂时的内存使用。嗯,这就是内存的用途——被使用。这称为过早优化,在确定存在问题之前进行优化。几乎总是浪费时间。
-
虽然 60MB 的内存可能没什么大不了的,但它足够大且足够有趣,值得学习。探索这一点没有问题,特别是作为已经工作代码的优化。请记住,临时内存峰值可能会导致其他应用程序出现不必要的内存警告,迫使它们转储缓存甚至可能被杀死,从而降低用户的整体体验。尝试减少这种情况是值得的(一旦你有一个可行的解决方案,并且不会引入过多的复杂性)。
标签: ios encryption nsinputstream commoncrypto