如果没有更多的上下文CryptoSwift Swift 4,表达式的类型是不明确的

时间:2018-01-17 13:21:14

标签: encryption swift4 cryptoswift

当我在Swift 4中使用Crypto Swift时,它给出了以下错误

Type of expression is ambiguous without more context

以下是我发布的用于加密的代码

func aesEncrypt(_ key: String, iv: String) throws -> String
{
    let data = self.data(using: String.Encoding.utf8)
    // Next Line is giving error
    let enc = try! AES(key: key, iv: iv, blockMode: .CBC, padding: .pkcs7).encrypt([UInt8](data!))
    let encData = Data(enc!)
    let base64String = encData.base64EncodedString()
    let result = String(base64String)
    return result
}

2 个答案:

答案 0 :(得分:1)

extension String {

    func aesEncrypt(key: String) throws -> String {

        // Encryption
        let data = self.data(using: .utf8)!
        let password = key
        let ciphertext = RNCryptor.encrypt(data: data, withPassword: password)
        let encryptedData = Data(ciphertext)
        let stringEncrypt: String = encryptedData.base64EncodedString()
        print("encryptedData: \(stringEncrypt)")
        return stringEncrypt
    }

    func aesDecrypt(key: String) throws -> String {

        // Decryption
        let data = Data(base64Encoded: self)!
        let password = key

        do {
            let ciphertext = try RNCryptor.decrypt(data: data, withPassword: password)
            let decryptedData = Data(ciphertext)
            let stringDecrypt = String(bytes: decryptedData, encoding: .utf8) ?? "Could not decrypt"
            print("decryptedData: \(stringDecrypt)")
            return stringDecrypt

        } catch {
            print(error)
            return "Error"
        }
    }

    func aesEncrypt(key: String, iv: String) throws -> String {

        let data: Array<UInt8> = (self.data(using: .utf8)?.bytes)!
        let key: Array<UInt8> = (key.data(using: .utf8)?.bytes)!
        let iv: Array<UInt8> = (iv.data(using: .utf8)?.bytes)!

        do {
            let encrypted = try AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7).encrypt(data)
            let encryptedData = Data(encrypted)
            let decrypted = try AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7).decrypt(encrypted)
            let decryptedData = Data(decrypted)
            let str = String.init(data: decryptedData, encoding: .utf8)
            print(str ?? String())
            return encryptedData.base64EncodedString()

        } catch {
            print(error)
            return "error"
        }
    }

    func aesDecrypt(key: String, iv: String) throws -> String {

        let data: Array<UInt8> = (Data(base64Encoded: self)?.bytes)!
        let key: Array<UInt8> = (key.data(using: .utf8)?.bytes)!
        let iv: Array<UInt8> = (iv.data(using: .utf8)?.bytes)!

        do {
            let decrypted = try AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7).decrypt(data)
            let decryptedData = Data(decrypted)
            guard let value = String.init(data: decryptedData, encoding: .utf8) else {
                return "error"
            }
            return value

        } catch {
            print(error)
            return "error"
        }
    }
}

答案 1 :(得分:0)

不要直接使用String,请使用Data或[UInt8]。 CryptoSwift具有方便的转换助手,使其更容易:https://github.com/krzyzanowskim/CryptoSwift#basics