在iOS中播放加密的mp3

时间:2012-06-14 23:08:47

标签: ios audio encryption mp3 avaudioplayer

我有一个需要在iOS中播放的aes加密mp3文件;出于安全原因,我无法将文件解密到磁盘,由于内存限制,我可能无法将其解密到内存。

有没有办法直接播放加密文件,或者将其流式传输到播放器而不将其全部加载到内存中?我真的很茫然这个,我甚至不知道从哪里开始......我正在使用AVAudioPlayer播放文件,但我猜它不够灵活,不能做我想做的事。

3 个答案:

答案 0 :(得分:3)

对于音频或图像文件加密和解密,使用RNCryptor算法 - > https://github.com/RNCryptor/RNCryptor

<强>加密

let fileData = try NSData(contentsOf: fileURL, options: NSData.ReadingOptions.mappedIfSafe)
let encryptData = RNCryptor.encrypt(data: fileData as Data, withPassword: "password")
try encryptData.write(to: fileURL, options: Data.WritingOptions.completeFileProtection)

解密:(对于播放音频,你必须解密第一个音频然后播放)

let fileData = try NSData(contentsOfFile: filePath, options:NSData.ReadingOptions.mappedIfSafe)
encryptData = RNCryptor.encrypt(data: fileData as Data, withPassword: password)
try encryptData.write(to: URL.init(fileURLWithPath: filePath), options: Data.WritingOptions.completeFileProtection)

答案 1 :(得分:2)

我不知道AVAudioPlayer是如何工作的,但解决这个问题的唯一方法是提供玩家可以访问的某种抽象。如果玩家只能访问“文件”对象,那么你运气不好,必须使用其他玩家。如果播放器可以访问某种类型的输入流(我怀疑它可以),您可以从文件创建流(称之为“文件流”),并从文件流创建解密流。只有在您需要使用已存在的代码(如crypto ++)来创建解密流时,您才必须了解AES加密。

在psuedodcode中,它看起来像这样:

filestream fs = new filestream( path )
decryptionstream ds = decryptionstream( fs, decryptionkeydata )
AVAudioPlayer.open( ds );
AVAudioPlayer.play()

在内部,AVAudioPlayer将从解密流中读取数据块,解密流将从文件流中提取数据,这将从文件中提取数据。数据将在解密流中解密,一次一个块。

答案 2 :(得分:0)

首先,您需要了解how does AES encryption work

如果不对其进行解密,则无法播放加密文件,因为加密文件只是一些垃圾数据。在解密之前,你无法阅读或播放它。

我不确定您如何加密文件以及如何获取解密密钥,但您的第一步是获取解密过程的对称密钥。