1

When I am using Crypto Swift in Swift 4 , it is giving below error

Type of expression is ambiguous without more context

Below is the code which I have posted for encryption

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
}
4

2 回答 2

2
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"
        }
    }
}
于 2018-08-02T20:36:51.350 回答
0

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

于 2018-02-10T13:19:32.660 回答