Image Encryption in Swift

2019-02-18 17:52发布

I am using IDZSwiftCommonCrypto for image encryption using StreamCryptor described as an example at its GitHub page: https://github.com/iosdevzone/IDZSwiftCommonCrypto

I am not able to successfully decrypt. Here is my code for encryption and decryption (imageData comes from UIImageView). The output is different from input after encryption (imageData is different from xx).

Encryption:

func performImageEncryption(imageData: Data) -> Void {

        var inputStream = InputStream(data: imageData)

        let key = arrayFrom(hexString: "2b7e151628aed2a6abf7158809cf4f3c")

        var sc = StreamCryptor(operation:.encrypt, algorithm:.aes, options:.PKCS7Padding, key:key, iv:Array<UInt8>())

        var inputBuffer = Array<UInt8>(repeating:0, count:1024)
        var outputBuffer = Array<UInt8>(repeating:0, count:1024)

        inputStream.open()

        var cryptedBytes = 0

        var xx = Data()

        var count = 0

        while inputStream.hasBytesAvailable
        {
            count = count + 1024
            let bytesRead = inputStream.read(&inputBuffer, maxLength: inputBuffer.count)
            let status = sc.update(bufferIn: inputBuffer, byteCountIn: bytesRead, bufferOut: &outputBuffer, byteCapacityOut: outputBuffer.count, byteCountOut: &cryptedBytes)

            xx.append(contentsOf: outputBuffer)
        }

        let status = sc.final(bufferOut: &outputBuffer, byteCapacityOut: outputBuffer.count, byteCountOut: &cryptedBytes)


        xx.append(contentsOf: outputBuffer)


        inputStream.close()

        performImageDecryption(encryptedImageData: xx)


    }

Decryption:

func performImageDecryption(encryptedImageData: Data) -> Void {

        let key = arrayFrom(hexString: "2b7e151628aed2a6abf7158809cf4f3c")

        var sc = StreamCryptor(operation:.decrypt, algorithm:.aes, options:.PKCS7Padding, key:key, iv:Array<UInt8>())

        var inputStreamD = InputStream(data: encryptedImageData)

        var inputBuffer = Array<UInt8>(repeating:0, count:1024)
        var outputBuffer = Array<UInt8>(repeating:0, count:1024)

        inputStreamD.open()

        var cryptedBytes = 0


        var xx = Data()
        while inputStreamD.hasBytesAvailable
        {
            let bytesRead = inputStreamD.read(&inputBuffer, maxLength: inputBuffer.count)
            let status = sc.update(bufferIn: inputBuffer, byteCountIn: bytesRead, bufferOut: &outputBuffer, byteCapacityOut: outputBuffer.count, byteCountOut: &cryptedBytes)
            xx.append(contentsOf: outputBuffer)
        }

        let status = sc.final(bufferOut: &outputBuffer, byteCapacityOut: outputBuffer.count, byteCountOut: &cryptedBytes)
        xx.append(contentsOf: outputBuffer)

        inputStreamD.close()

    }

1条回答
Deceive 欺骗
2楼-- · 2019-02-18 18:20
xx.append(outputBuffer, count: cryptedBytes)

should help.

below is sample code for picking up an encrypted image file and returning the data.

func decryptImage(from path:URL)-> Data? {
    var decryptData = Data()

    let sc = StreamCryptor(operation:.decrypt, algorithm:.aes, options:.PKCS7Padding, key:key, iv:iv)

    guard let encryptedInputStream = InputStream(fileAtPath: path.relativePath) else {
        return nil
    }

    var inputBuffer = [UInt8](repeating: 0, count: Int(1024))
    var outputBuffer = [UInt8](repeating: 0, count: Int(1024))

    encryptedInputStream.open()

    var cryptedBytes : Int = 0
    while encryptedInputStream.hasBytesAvailable
    {
        let bytesRead = encryptedInputStream.read(&inputBuffer, maxLength: inputBuffer.count)

        let status = sc.update(bufferIn: inputBuffer, byteCountIn: bytesRead, bufferOut: &outputBuffer, byteCapacityOut: outputBuffer.count, byteCountOut: &cryptedBytes)

        if (status != Status.success) {
        encryptedInputStream.close()
            return nil
        }

        if(cryptedBytes > 0)
        {
            decryptData.append(outputBuffer, count: cryptedBytes)
        }
    }

    let status = sc.final(bufferOut: &outputBuffer, byteCapacityOut: outputBuffer.count, byteCountOut: &cryptedBytes)
    if (status != Status.success) {
        encryptedInputStream.close()
        return nil
    }

    if(cryptedBytes > 0)
    {
        decryptData.append(outputBuffer, count: cryptedBytes)
    }
    encryptedInputStream.close()
    return decryptData
}

Happy coding :)

查看更多
登录 后发表回答