Search code examples
iosswiftcryptographyaes

Why is text encryption failing in CryptoSwift on Swift5?


I have an error trying to encrypt my password. I can't find a reason why encryption is failing. What's the problem?

Crypto

import CryptoSwift

struct Crypto {

    let keyData : String!
    let ivData : String!

    init(){
        keyData = "Stringdata"
        ivData = "Stringdata"
    }

    func encryptor(_ text: String) {
        do {
            let aes = try AES(key: keyData, iv: ivData)
            let chiperText = try aes.encrypt(text.bytes).toBase64() // get Error
            Log.Debug(chiperText)
        } catch {
            Log.Error(error)
        }
    }

    func decryptor(_ hexString : String) -> String {
        var decryptText : String = ""
        do {
            let aes = try AES(key: keyData, iv: ivData)
            let e64_data = Data(base64Encoded: hexString) ?? Data()
            let decryptData = try aes.decrypt(e64_data.bytes)
            decryptText = String(bytes: decryptData, encoding: .utf8)!
            Log.Debug(decryptText)
        } catch {
            Log.Error(error)
        }
        return decryptText
    }

}

Usage

do {
            try globalUrl.post(url: url, dict, encoding: .utf8, completionHandler: { data, response, error in
   do {
      ...
      Crypto.encryptor(self.PasswordField.text!)
       ...
   } catch {
      Log.Error(error)
   }
} catch {
      Log.Error(error)
   }

The place where you run is run at the place where you receive the return value through API

let chiperText = try aes.encrypt(text.bytes).toBase64()

This is where the error occurs. I don't know why because I've reported how to use Github.


Edit


I'm going to try another way I can encrypt, but I don't know how to decode.

    func encryptor(_ text: String) {
        do {
            let aes = try AES(key: keyData, iv: ivData) // aes128
            let ciphertext = try aes.encrypt(Array(text.utf8))
            Log.Debug(ciphertext)
        } catch {
            Log.Error(error)
        }
    }

    func decryptor(_ dataArray : Array<UInt8>) -> String {
        var decryptText : String = ""
        do {
            let aes = try AES(key: keyData, iv: ivData) // aes128
            let ciphertext = try aes.decrypt(dataArray)
            decryptText = ciphertext // Cannot assign value of type '[UInt8]' to type 'String'
            Log.Debug(decryptText)
        } catch {
            Log.Error(error)
        }
        return decryptText
    }

decryptText = ciphertext // Cannot assign value of type '[UInt8]' to type 'String'

Is my usage wrong? No matter how hard I look for a solution, I can't find it.

Thanks in advance


Solution

  • This error occurred in a simple place. The byte value for ivData and keyData was not 16 bytes. If their value is not 16 bytes, an error occurs.