【问题标题】:Type of expression is ambiguous without more context CryptoSwift Swift 4表达式类型不明确,没有更多上下文 CryptoSwift Swift 4
【发布时间】:2018-06-26 09:31:56
【问题描述】:

当我在 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
}

【问题讨论】:

  • 键和 IV 不是字符串,为什么不使用 Data 类型呢?在继续创建安全代码之前,请尝试了解密码和密钥之间的区别。
  • @zaph - cryptoswift 标签是新的。图书馆的问题数量惊人,所以它是昨天创建的。我指出它以防你想关注它。

标签: encryption swift4 cryptoswift


【解决方案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"
        }
    }
}

【讨论】:

  • 你能解释一下你修复了什么
  • swift 3.0 -> swift 4.0 改变了表达方式。
  • 歧义表达式:let enc = try! AES(key: key, iv: iv, blockMode: .CBC, padding: .pkcs7).encrypt([UInt8](data!)).
  • 在 swift 4.0 中:let encrypted = try AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7).encrypt(data)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多