2013-07-12 75 views
3

我正在使用AES 256進行加密解密,我有大約1到2 GB的文件,它應該通過加密和解密過程,同時對下載的文件進行加密,我收到內存警告和應用程序崩潰。所以我想知道如何通過塊來加密解密塊以減少內存使用量。如何使用AES,CCrypt在iOS上加密/解密大塊文件的塊/塊?

下面是我使用的代碼剪斷: -

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

感謝你, 羅希特Jankar

+0

嘗試使用類似的工具分析,泄漏和分配,並嘗試找出內存泄漏,如果您有任何。 – 2013-07-12 11:08:04

+0

我已經看到了沒有內存泄漏,一次性加載整個數據的問題,因此我想知道如何讀取數據塊和數據塊並對其進行加密,從而減少內存使用量。 – Rohit

回答

1

我過過這種情況在我的項目的人來。

方法我按照:

我只加密從文件幾個字節可以是僅將報頭/前100個字節etc.While解密我僅解密字節的具體數量。這樣就避免了對加密文件的解密完整性。如果文件被盜用,無論如何都不能被視爲文件頭/文件的開始部分被加密。儘管文件的其餘範圍可以被解密,但是這是沒有用的&不完整。

此外,它還取決於文件&客戶端的類型。我還聽到一位同事說我們可以加載字節並加密它們。我不確定編碼方面的確切程度。

這只是給你一個想法,我已經做了哪些可能符合你的情況。

TNQ

+0

你如何做的代碼示例? –

+0

在我以前的公司中處理客戶項目時,我遇到了這種情況。我沒有它的來源。但我記得我使用流來獲取特定範圍的字節並完成了業務。我認爲你也需要嘗試並獲取幾個字節並加密這些字節。 – Dinakar

1

實際崩潰的原因是您正在將大量數據加載到內存中。您正在進行一次性加密,即CCCrypt是一種單向加密功能。相反,你必須使用流或其他方式,如將數據分成小塊並按塊加密數據塊。

在這裏你可以找到更多關於執行:Encrypt big file