我正在尝试使用 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 );
}
我在这里肯定遗漏了一些明显的东西,加密,甚至使用输入流对我来说有点新。