0

我是加密新手,正在尝试使用 RNCryptor 加密录音。文件已正确加密,但在解密后,创建的 NSData 会导致 AVAudioPlayer 初始化失败。我用于加密和解密的方法是......

- (void)renameFileInDocumentsFolder:(NSString *)oldFilename withNewName:(NSString *)newFilename
{

 NSFileManager *filemgr;

NSString *oldPath = [self getFilePathFromDocumentsFolder:oldFilename];
filemgr = [NSFileManager defaultManager];
NSData *data = [filemgr contentsAtPath:oldPath];

 NSString *destPath = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:[newFilename stringByAppendingString:@".m4a"]];
NSLog(@"DEST:%@", destPath);

NSError *error;

NSData *encryptedData = [RNEncryptor encryptData:data
                                    withSettings:kRNCryptorAES256Settings
                                        password:@"ABC123"
                                           error:&error];



[encryptedData writeToFile:destPath atomically:YES];
[filemgr removeItemAtPath:oldPath error:&error];


}

-(NSData *)decryptFilePathFromDocumentsFolder:(NSString *)filename
{
AudioRecorderAppDelegate *appDelegate=[AudioRecorderAppDelegate sharedDelegate];
_cacheDirectory = [[[appDelegate applicationCacheDirectory]path]stringByAppendingPathComponent:@"Recordings"];
   // NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;

NSString *filePath = [_cacheDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.m4a", filename]];
  NSData *data = [NSData dataWithContentsOfFile:filePath];

NSData *decData = [RNDecryptor decryptData:data withPassword:@"ABC123"   error:&error];



return decData;
}

AVAudioPlayer 初始化是... - (void)initializeAudioPlayer {

NSData *recording = [self decryptFilePathFromDocumentsFolder:_fileNameTextField.text];

if(!audioPlayer)
{
    NSError *error=nil;

    audioPlayer = [[AVAudioPlayer alloc]
                   initWithData:recording fileTypeHint:@".m4a" error:&error];
    if (error)

        NSLog(@"Error: %@", [error localizedDescription]);
    else

我不知道我做错了什么,或者 RNCryptor 是否甚至打算加密音频文件,但任何帮助将不胜感激。

4

1 回答 1

0

有很多地方你没有检查错误,无论是在密码器调用中,还是在文件的读取和写入中。确保在每一点上你都真正拥有你所期望的。确保写入和返回的数据大小合理(与原始文件大致相同)。确保原始文件实际上是可播放的。确保在解密后您拥有与开始时完全相同的字节。

RNCryptor 不在乎它加密了什么。但是,如果您在 UI 线程上执行此操作(看起来您正在执行此操作,从磁盘读取大文件可能会导致您的程序挂起,在某些情况下,时间足以让操作系统杀死您。通常很大文件操作(如大型音频文件)需要异步完成。

于 2016-09-10T11:18:18.453 回答