CommonCrypto를 사용하여 NSMutableData 객체를 암호화 (복제하지 않고 결과 바이트를 복사)하려고합니다. 이전에는 CCCrypt() "one-shot"방법을 사용했습니다. 주로 단순 해 보였기 때문입니다. 내 데이터 객체가 메모리에 중복되어있는 것으로 나타났습니다. 이 문제를 방지하기 위해 2048 바이트의 버퍼 크기를 가진 NSInputStream 개체를 사용하려고했습니다. NSMutableData 객체를 읽고 CCCryptorUpdate()를 호출하여 암호화를 처리합니다. 문제는 여전히 복제 된 것으로 보인다는 것입니다. 나는 확실히 여기에 분명 뭔가, 암호화 누락, 심지어 사용하고NSInputStream을 사용하여 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);
}
: 여기에 내 현재 코드입니다 (- - 때문에 주로 역사적인 이유 때문에 "자기"참조가 NSMutableData에 카테고리의주의하시기 바랍니다) 입력 스트림은 .. 저 비트 새로운 라인에
입력 및 출력 버퍼로 인해 발생하는 문제는 무엇입니까? – zaph
문제는 암호화해야 할 큰 문서가 있으며 메모리에 복제 할 필요가 없다는 것입니다. –
그래서 실제로는 일시적인 메모리 사용 문제는 없습니다. 음, 그것이 바로 기억이 사용되는 것입니다. 이를 사전 성숙 최적화 라하며 문제가 있는지를 결정하기 전에 최적화합니다. 거의 항상 그것은 잘못 보낸 시간입니다. – zaph