AES Encrypt and Decrypt AES Encrypt and Decrypt ios ios

AES Encrypt and Decrypt


CryptoSwift Example

Updated to Swift 2

import Foundationimport CryptoSwiftextension String {    func aesEncrypt(key: String, iv: String) throws -> String{        let data = self.dataUsingEncoding(NSUTF8StringEncoding)        let enc = try AES(key: key, iv: iv, blockMode:.CBC).encrypt(data!.arrayOfBytes(), padding: PKCS7())        let encData = NSData(bytes: enc, length: Int(enc.count))        let base64String: String = encData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0));        let result = String(base64String)        return result    }    func aesDecrypt(key: String, iv: String) throws -> String {        let data = NSData(base64EncodedString: self, options: NSDataBase64DecodingOptions(rawValue: 0))        let dec = try AES(key: key, iv: iv, blockMode:.CBC).decrypt(data!.arrayOfBytes(), padding: PKCS7())        let decData = NSData(bytes: dec, length: Int(dec.count))        let result = NSString(data: decData, encoding: NSUTF8StringEncoding)        return String(result!)    }}

Usage:

let key = "bbC2H19lkVbQDfakxcrtNMQdd0FloLyw" // length == 32let iv = "gqLOHUioQ0QjhuvI" // length == 16let s = "string to encrypt"let enc = try! s.aesEncrypt(key, iv: iv)let dec = try! enc.aesDecrypt(key, iv: iv)print(s) // string to encryptprint("enc:\(enc)") // 2r0+KirTTegQfF4wI8rws0LuV8h82rHyyYz7xBpXIpM=print("dec:\(dec)") // string to encryptprint("\(s == dec)") // true

Make sure you have the right length of iv (16) and key (32) then you won't hit "Block size and Initialization Vector must be the same length!" error.


CryptoSwift Example

Updated SWIFT 4.*

func aesEncrypt() throws -> String {    let encrypted = try AES(key: KEY, iv: IV, padding: .pkcs7).encrypt([UInt8](self.data(using: .utf8)!))    return Data(encrypted).base64EncodedString()}func aesDecrypt() throws -> String {    guard let data = Data(base64Encoded: self) else { return "" }    let decrypted = try AES(key: KEY, iv: IV, padding: .pkcs7).decrypt([UInt8](data))    return String(bytes: decrypted, encoding: .utf8) ?? self}


Code provided by SHS didn't work for me, but this one apparently did (I used a Bridging Header: #import <CommonCrypto/CommonCrypto.h>):

extension String {    func aesEncrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? {        if let keyData = key.data(using: String.Encoding.utf8),            let data = self.data(using: String.Encoding.utf8),            let cryptData    = NSMutableData(length: Int((data.count)) + kCCBlockSizeAES128) {            let keyLength              = size_t(kCCKeySizeAES128)            let operation: CCOperation = UInt32(kCCEncrypt)            let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)            let options:   CCOptions   = UInt32(options)            var numBytesEncrypted :size_t = 0            let cryptStatus = CCCrypt(operation,                                      algoritm,                                      options,                                      (keyData as NSData).bytes, keyLength,                                      iv,                                      (data as NSData).bytes, data.count,                                      cryptData.mutableBytes, cryptData.length,                                      &numBytesEncrypted)            if UInt32(cryptStatus) == UInt32(kCCSuccess) {                cryptData.length = Int(numBytesEncrypted)                let base64cryptString = cryptData.base64EncodedString(options: .lineLength64Characters)                return base64cryptString            }            else {                return nil            }        }        return nil    }    func aesDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? {        if let keyData = key.data(using: String.Encoding.utf8),            let data = NSData(base64Encoded: self, options: .ignoreUnknownCharacters),            let cryptData    = NSMutableData(length: Int((data.length)) + kCCBlockSizeAES128) {            let keyLength              = size_t(kCCKeySizeAES128)            let operation: CCOperation = UInt32(kCCDecrypt)            let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)            let options:   CCOptions   = UInt32(options)            var numBytesEncrypted :size_t = 0            let cryptStatus = CCCrypt(operation,                                      algoritm,                                      options,                                      (keyData as NSData).bytes, keyLength,                                      iv,                                      data.bytes, data.length,                                      cryptData.mutableBytes, cryptData.length,                                      &numBytesEncrypted)            if UInt32(cryptStatus) == UInt32(kCCSuccess) {                cryptData.length = Int(numBytesEncrypted)                let unencryptedMessage = String(data: cryptData as Data, encoding:String.Encoding.utf8)                return unencryptedMessage            }            else {                return nil            }        }        return nil    }}

From my ViewController:

 let encoded = message.aesEncrypt(key: keyString, iv: iv) let unencode = encoded?.aesDecrypt(key: keyString, iv: iv)