Iphone 如何在iOS上使用AES、CCrypt加密/解密大文件的块/块?
我使用AES 256进行加密解密,我有大约1-2 GB的较大文件,它应该经过加密和解密过程,在对下载的文件进行加密时,我收到内存警告和应用程序崩溃。所以我想知道如何逐块加密解密以减少内存使用 以下是我正在使用的代码片段:-Iphone 如何在iOS上使用AES、CCrypt加密/解密大文件的块/块?,iphone,ios,ipad,encryption,aes,Iphone,Ios,Ipad,Encryption,Aes,我使用AES 256进行加密解密,我有大约1-2 GB的较大文件,它应该经过加密和解密过程,在对下载的文件进行加密时,我收到内存警告和应用程序崩溃。所以我想知道如何逐块加密解密以减少内存使用 以下是我正在使用的代码片段:- - (NSData *)AES256EncryptWithKey:(NSString *)key { char keyPtr[kCCKeySizeAES256 + 1]; bzero( keyPtr, sizeof( ke
- (NSData *)AES256EncryptWithKey:(NSString *)key
{
char keyPtr[kCCKeySizeAES256 + 1];
bzero( keyPtr, sizeof( keyPtr ) );
// fetch key data
[key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL ,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted );
if( cryptStatus == kCCSuccess )
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free( buffer );
return nil;
}
- (NSData *)AES256DecryptWithKey:(NSString *)key
{
char keyPtr[kCCKeySizeAES256+1];
bzero( keyPtr, sizeof( keyPtr ) );
// fetch key data
[key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL ,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted );
if( cryptStatus == kCCSuccess )
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free( buffer );
return nil;
}
谢谢你,
Rohit Jankar我在我的一个项目中也遇到了这种情况 我采取的方法是: 我只加密文件中的几个字节,可能只是头/前100个字节等。解密时,我只解密特定数量的字节。从而避免了对整个文件进行加密和解密。如果文件以任何方式被盗,则无法将其视为文件的头/开始部分已加密。尽管文件的剩余范围可以解密,但它是无用的和不完整的 此外,它还取决于文件类型和客户端。我还听到我的一位同事说,我们可以分块加载字节并对它们进行加密。我不确定具体的编码方式 这只是给你一个想法,我做了什么,可能符合你的情况以及
TNQ崩溃的实际原因是您正在内存中加载大量数据。您正在执行一次性加密,即
CCCrypt
是一次性加密功能。相反,您必须使用流或其他方式,如将数据划分为小块并逐块加密数据
在这里,您可以找到有关实现的更多信息:尝试使用分析、泄漏和分配等工具,并尝试找出内存泄漏(如果有)。我发现没有内存泄漏,一次性加载整个数据会产生问题,因此我想知道如何读取数据块/数据块并对其进行加密,从而减少内存使用。我在以前的公司从事客户项目时遇到过这种情况。我没有它的来源。但我记得我使用流获取特定范围的字节并完成了业务。我认为您也需要尝试获取一些字节并加密这些字节。。