2014-06-17 52 views
0

我正在使用RNCryptor加密文件和大型文件我使用NSInputStream將文件分割成塊和編碼/解碼這些塊。它工作得很好,直到我需要base64編碼/解碼傳遞給流的塊。使用base64編碼與NSInputStream

下面的代碼工作的編碼完全沒有問題,但它不會做base64編碼:

NSInputStream *tmpStream = [[NSInputStream alloc] initWithURL:fileURL]; 
    NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO]; 

    [tmpStream open]; 
    [outputStream open]; 

    __block NSMutableData *data = [NSMutableData dataWithLength:kBlockSize]; 
    __block RNEncryptor *encryptor = nil; 

    dispatch_block_t readStreamBlock = ^{ 
     [data setLength:kBlockSize]; 
     NSInteger bytesRead = [tmpStream read:[data mutableBytes] maxLength:kBlockSize]; 

     if (bytesRead < 0) { 

      NSLog(@"An error occurred while decrypting file stream"); 
      if (resultBlock) { resultBlock(nil); } 
      return; 
     } 
     else if (bytesRead == 0){ 
      [encryptor finish]; 
     } 
     else { 
      [data setLength:bytesRead]; 
      [encryptor addData:data]; 
     } 
    }; 

    encryptor = [[RNEncryptor alloc] initWithSettings:kRNCryptorAES256Settings 
              password:HUCryptorPassword 
               handler:^(RNCryptor *cryptor, NSData *data) { 

                [outputStream write:data.bytes maxLength:data.length]; 

                if(cryptor.isFinished){ 

                 [outputStream close]; 

                 if (resultBlock) { 
                  resultBlock([NSString stringWithFormat:@"%@", filePath]); 
                 } 
                } 
                else { 
                 readStreamBlock(); 
                } 
               }]; 
    readStreamBlock(); 

我嘗試添加base64編碼數據被加密後寫入到輸出流之前:

NSData *base64Data = [data base64EncodedDataWithOptions:kNilOptions]; //Tried with all options 
[outputStream write:base64Data.bytes maxLength:base64Data.length]; 

但是,這給了我輸出文件不正確的結果。

只有正確的方法,我得到正確的編碼/解碼數據是加載整個文件在內存中,並調用編碼/解碼方法。

NSData *resultData = [NSData dataWithContentsOfFile:filePath]; //This is location of output file stream 
NSData *encodedData = [resultData base64EncodedDataWithOptions:kNilOptions]; //Gives me correct base64 encoded data 

我想避免,因爲我需要編碼/解碼大文件,如視頻,聲音和圖像。

是否有任何安全的方法來實現這一目標?

回答

0

4個base64字符適合三個字節。

編碼時,確保您編碼4個字符的塊,保留下一部分流的剩餘部分。隨着流的結尾對剩下的內容進行編碼。 Base64填充非mod4數據的末尾,即末尾的「=」字符。

用於解碼長度爲mod3編碼字符的塊中的解碼。

如果您設置它以便在3個塊(或多個或3)中編碼,那麼base64編碼也將落在邊界上。

+0

謝謝!我決定將數據編碼爲HEX格式,因爲此時處理base64更簡單。 –