Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在iOS上使用AES、CCrypt加密/解密大文件的块/块?_Iphone_Ios_Ipad_Encryption_Aes - Fatal编程技术网

Iphone 如何在iOS上使用AES、CCrypt加密/解密大文件的块/块?

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

我使用AES 256进行加密解密,我有大约1-2 GB的较大文件,它应该经过加密和解密过程,在对下载的文件进行加密时,我收到内存警告和应用程序崩溃。所以我想知道如何逐块加密解密以减少内存使用

以下是我正在使用的代码片段:-

- (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
是一次性加密功能。相反,您必须使用流或其他方式,如将数据划分为小块并逐块加密数据


在这里,您可以找到有关实现的更多信息:

尝试使用分析、泄漏和分配等工具,并尝试找出内存泄漏(如果有)。我发现没有内存泄漏,一次性加载整个数据会产生问题,因此我想知道如何读取数据块/数据块并对其进行加密,从而减少内存使用。我在以前的公司从事客户项目时遇到过这种情况。我没有它的来源。但我记得我使用流获取特定范围的字节并完成了业务。我认为您也需要尝试获取一些字节并加密这些字节。。