如何观察UIProgressView的数据加密/解密?

时间:2017-12-30 17:01:02

标签: ios swift

我使用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()
    }

这是我如何加密数据的功能。 (数据扩展)。

1 个答案:

答案 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
}

更复杂的方法是使用InputStreamOutputStream,在这种情况下,您不需要在加密时将数据保存在内存中。我开始探索这种可能性作为读者的练习。 (只要你一次使用几十兆字节就不会耗尽内存。)