3

暗号化復号化に 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

4

2 に答える 2

1

クラッシュの実際の理由は、大量のデータをメモリにロードしていることです。ワンショット暗号化を行っています。つまりCCCrypt、ワンショット暗号化機能です。これの代わりに、ストリームを使用するか、データを小さなチャンクに分割し、チャンクごとにデータを暗号化するなどの他の方法を使用する必要があります。

実装の詳細については、こちらを参照してください:大きなファイルを暗号化する

于 2013-07-12T11:47:20.443 に答える