AES加密iOS中的大文件

时间:2015-07-14 04:34:21

标签: ios aes large-data

我正在创建一个聊天应用程序,其中我必须加密大型视频并根据需要对其进行解密。我使用以下代码,但由于内存限制,它在大文件上崩溃。有没有其他方法可以加密大文件,使其不会崩溃。

+ (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;
}

1 个答案:

答案 0 :(得分:3)

使用一次只读取一小段文件的流。

当前代码读入最初要加密的整个文件,将整个文件块按块加密到mutableData实例。最后,您可以同时在内存中获得未加密和加密数据的内容。使用块不会减少内存占用。

这个“chunked”方法还有另一个问题,StringEncryption类很可能不只是扩展加密,而是使用相同的iv重新启动每个块。这不会产生与单个加密相同的加密输出。

要使用流,请为输入和输出创建NSStream实例。使用Common Crypto但不是无状态,一次性使用CCCryptorCreateCCCryptorUpdateCCCryptorFinal

  • 创建输入/输出流(NSInputStreamNSOutputStream
  • 首先使用CCCryptorCreate创建一个上下文。
  • 循环读取steam中的一些数据,使用该数据调用CCCryptorUpdate并将结果写入流中。
  • 如果使用填充,请调用CCCryptorFinal并将最终数据写入流。
  • 关闭溪流。

这样,任何时候只有一小部分文件在内存中。

像往常一样,您应该查看RNCryptor,看看该解决方案是否符合您的需求。

相关问题