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
}
jww
  • 97,681
  • 90
  • 411
  • 885
Hitesh Mor
  • 72
  • 1
  • 11
  • Keys and IV's are not strings, why not use the `Data` type instead? Please try and understand the difference between passwords and keys before continuing to create secure code. – Maarten Bodewes Jan 17 '18 at 14:13
  • @zaph - The [tag:cryptoswift] tag is new. There were a surprisingly number of questions for the library, so it was created yesterday. I'm pointing it out in case you want to follow it. – jww Jan 21 '18 at 15:25

2 Answers2

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"
        }
    }
}
0

Don't use String directly, use Data or [UInt8]. The CryptoSwift has the convenient conversions helpers, to make it easier: https://github.com/krzyzanowskim/CryptoSwift#basics

Marcin
  • 3,694
  • 5
  • 32
  • 52