我正在用CryptoSwift(框架,加载Cocoapods(加密数据(每个数据约15MB-20MB(。
我的问题是我如何观察进度并将其显示在进度条(UIProgressView(中?
我不知道如何获取(和更新(加密/解密的进度。
func aesEncrypt(withKey key: String, iv: String) throws -> Data {
let data = self
let encrypted = try! AES(key: key.bytes, blockMode: .CBC(iv: iv.bytes), padding: .pkcs7).encrypt([UInt8](data))
let encryptedData: Data = Data(encrypted)
return encryptedData.base64EncodedData()
}
这是我关于如何加密数据的功能。(数据扩展名(。
你不能。至少你不能使用此 API。尝试逐块加密/解密(幸运的是 AES 是块密码(,并更新每个块的进度条。
请参阅CryptoSwift AES文档中的"增量更新"以了解:
do {
var encryptor = try AES(key: "passwordpassword", iv: "drowssapdrowssap").makeEncryptor()
var ciphertext = Array<UInt8>()
// aggregate partial results
ciphertext += try encryptor.update(withBytes: Array("Nullam quis risus ".utf8))
ciphertext += try encryptor.update(withBytes: Array("eget urna mollis ".utf8))
ciphertext += try encryptor.update(withBytes: Array("ornare vel eu leo.".utf8))
// finish at the end
ciphertext += try encryptor.finish()
print(ciphertext.toHexString())
} catch {
print(error)
}
https://github.com/krzyzanowskim/CryptoSwift#aes
只需在循环中使用update(withBytes:)
(最好在后台线程/队列上(并在每次迭代中更新进度条(不要忘记在主线程上执行此操作(。区块大小越小,进度更新就越渐进。
以下是逐块枚举数据块的方法:
let data = ... // your data goes here
let chunkSize = 64 * 1024
var chunkStart = 0
while chunkStart < data.length {
let chunk = data.subdata(in: chunkStart..<min(chunkStart + chunkSize, data.length))
ciphertext += try encryptor.update(withBytes: chunk.bytes)
... // update the progress bar here (don't forget to dispatch it to the main thread)
chunkStart += chunkSize
}
更复杂的方法是使用 InputStream 和 OutputStream,在这种情况下,您在加密时不需要将数据保存在内存中。我把探索这种可能性留给读者作为练习。(只要您一次处理几十兆字节,您就不会耗尽内存。