我使用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()
}
这是我如何加密数据的功能。 (数据扩展)。
答案 0 :(得分:1)
你做不到。至少你不能用这个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:)
(最好在后台线程/队列中)并在每次迭代中更新进度条(不要忘记在主线程上执行此操作)。块大小越小,进度更新就越渐进。
以下是如何通过chunk枚举数据块:
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,在这种情况下,您不需要在加密时将数据保存在内存中。我开始探索这种可能性作为读者的练习。 (只要你一次使用几十兆字节就不会耗尽内存。)