首先是這樣的,公司需要對音頻文件進行加密,服務端進行AES加密岁经,客戶端進行解密的蔗蹋。
一何荚、前期準備
1. 然后在GitHub上找到一個三方處理加密解密的 CryptoSwift
2. 簡單封裝了一下解密的方法
需要公司給定key
// MARK: - AESkey
static let AESkey: [UInt8] = Array("公司后臺加密的key".utf8)
open static let shared = AESTool()
獲取播放鏈接并轉(zhuǎn)化成解密后data
class func getDecryptData(url: URL) -> Data {
do {
let data = try Data(contentsOf: url)
let test = self.decrypt(data.bytes)
let newData = Data(bytes: test)
return newData
} catch {
print("Failed to getDecryptData: \(error)")
}
return Data()
}
class func decrypt(_ input: [UInt8]) -> [UInt8] {
do {
// blockMode: .ECB 我們公司后臺加密AES是ECB類型
let decrypted = try AES(key: AESkey, iv: nil, blockMode: .ECB).decrypt(input)
return decrypted
} catch {
print("Failed to decrypt: \(error)")
}
return []
}
二、開始測試
1.首先測試一下猪杭,是否真的不能播放
// 不解密播放測試 - 播放不了
@IBAction func play(_ sender: Any) {
do {
currentPlayer = try AVAudioPlayer(contentsOf: mp3URL)
currentPlayer?.enableRate = true
currentPlayer?.rate = 0.8
currentPlayer?.prepareToPlay()
currentPlayer?.play()
} catch {
print("\(error)")
}
}
果然播放不了餐塘。。皂吮。
2.不指定fileType解密播放
// 不指定fileType解密播放 - 播放不了
@IBAction func noFileTypeDecryptPlay(_ sender: Any) {
let newData = AESTool.getDecryptData(url: mp3URL)
do {
currentPlayer = try AVAudioPlayer(data: newData)
currentPlayer?.enableRate = true
currentPlayer?.rate = 0.8
currentPlayer?.prepareToPlay()
currentPlayer?.play()
} catch {
print("\(error)")
}
}
因為平時都是url播放的戒傻,沒用過data播放税手,開始也沒有指定fileType,發(fā)現(xiàn)一直失敗需纳,看打印錯誤才找到原因
3. 解密播放測試芦倒,指定fileType
// 解密播放測試 - 播放成功
@IBAction func decryptPlay(_ sender: Any) {
let newData = AESTool.getDecryptData(url: mp3URL)
do {
currentPlayer = try AVAudioPlayer(data: newData, fileTypeHint: AVFileTypeMPEGLayer3)
currentPlayer?.enableRate = true
currentPlayer?.rate = 0.8
currentPlayer?.prepareToPlay()
currentPlayer?.play()
} catch {
print("\(error)")
}
}
發(fā)現(xiàn)終于成功了
三、還有加密解密字符串的不翩,在demo里面兵扬,我就不介紹了,CryptoSwift 還有很多類型
最后附上 Demo