如何观察 UIProgressView 的数据的 en-/decrypting



我正在用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,在这种情况下,您在加密时不需要将数据保存在内存中。我把探索这种可能性留给读者作为练习。(只要您一次处理几十兆字节,您就不会耗尽内存。

相关内容

最新更新