我正在创建一个聊天应用程序,其中我必须加密大型视频并根据需要对其进行解密。我使用以下代码,但由于内存限制,它在大文件上崩溃。有没有其他方法可以加密大文件,使其不会崩溃。
+ (NSData *)addPaddingToData:(NSData *)data
paddingKey:(NSString *)keyString
paddingiv:(NSString *)ivString {
NSArray * chunkedArray = [NSData chunkedArrayForData:data chunkSize:10240];
NSMutableData *mutableData = [[NSMutableData alloc] init];
for (NSData *d in chunkedArray) {
NSData * encryptedData = [[StringEncryption alloc] encrypt:d key:keyString iv:ivString];
[mutableData appendData:encryptedData];
}
return (NSData *)mutableData;
}
+ (NSData *)removePaddingToData:(NSData *)data
paddingKey:(NSString *)keyString
paddingiv:(NSString *)ivString {
NSArray * chunkedArray = [NSData chunkedArrayForData:data chunkSize:10256];
NSMutableData *mutableData = [[NSMutableData alloc] init];
for (NSData *d in chunkedArray) {
NSData *decryptedData = [[StringEncryption alloc] decrypt:d key:keyString iv:ivString];
[mutableData appendData:decryptedData];
}
return (NSData *)mutableData;
}
+ (NSArray *)chunkedArrayForData:(NSData *)data chunkSize:(NSUInteger)size {
NSUInteger length = [data length];
NSUInteger chunkSize = size;
NSUInteger offset = 0;
NSMutableArray * chunkedArray = [[NSMutableArray alloc] init];
do {
NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset;
NSData *chunk = [NSData dataWithBytesNoCopy:(char *)[data bytes] + offset
length:thisChunkSize
freeWhenDone:NO];
offset += thisChunkSize;
[chunkedArray addObject:chunk];
} while (offset < length);
return chunkedArray;
}
答案 0 :(得分:3)
使用一次只读取一小段文件的流。
当前代码读入最初要加密的整个文件,将整个文件块按块加密到mutableData
实例。最后,您可以同时在内存中获得未加密和加密数据的内容。使用块不会减少内存占用。
这个“chunked”方法还有另一个问题,StringEncryption
类很可能不只是扩展加密,而是使用相同的iv重新启动每个块。这不会产生与单个加密相同的加密输出。
要使用流,请为输入和输出创建NSStream
实例。使用Common Crypto但不是无状态,一次性使用CCCryptorCreate
,CCCryptorUpdate
和CCCryptorFinal
。
NSInputStream
和NSOutputStream
)CCCryptorCreate
创建一个上下文。CCCryptorUpdate
并将结果写入流中。CCCryptorFinal
并将最终数据写入流。这样,任何时候只有一小部分文件在内存中。
像往常一样,您应该查看RNCryptor,看看该解决方案是否符合您的需求。