Update Swift 4.2
Here, for instance, we encrypt a string to base64encoded string. And then we decrypt the same to a readable string. (That would be same as our input string).
In my case, I use this to encrypt a string and embed that to QR Code. Then another party scan that and decrypt the same. So intermediate won't understand the QR codes.
Step 1: Encrypt a string "Encrypt My Message 123"
Step 2: Encrypted base64Encoded string : +yvNjiD7F9/JKmqHTc/Mjg== (The same printed on QR code)
Step 3: Scan and decrypt the string "+yvNjiD7F9/JKmqHTc/Mjg=="
Step 4: It comes final result - "Encrypt My Message 123"
Functions for Encrypt & Decrypt:
func encryption(stringToEncrypt: String) -> String{ let key = "MySecretPKey" //let iv = "92c9d2c07a9f2e0a" let data = stringToEncrypt.data(using: .utf8) let keyD = key.data(using: .utf8) let encr = (data as NSData?)!.aes128EncryptedData(withKey: keyD) let base64String: String = (encr as NSData?)!.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0)) print(base64String) return base64String } func decryption(encryptedString:String) -> String{ let key = "MySecretPKey" //let iv = "92c9d2c07a9f2e0a" let keyD = key.data(using: .utf8) let decrpStr = NSData(base64Encoded: encryptedString, options: NSData.Base64DecodingOptions(rawValue: 0)) let dec = (decrpStr)!.aes128DecryptedData(withKey: keyD) let backToString = String(data: dec!, encoding: String.Encoding.utf8) print(backToString!) return backToString! }
Usage:
let enc = encryption(stringToEncrypt: "Encrypt My Message 123") let decryptedString = decryption(encryptedString: enc) print(decryptedString)
Classes for supporting AES encrypting functions, these are written in Objective-C. So for swift, you need to use bridge header to support these.
Class Name: NSData+AES.h
#import <Foundation/Foundation.h> @interface NSData (AES) - (NSData *)AES128EncryptedDataWithKey:(NSData *)key; - (NSData *)AES128DecryptedDataWithKey:(NSData *)key; - (NSData *)AES128EncryptedDataWithKey:(NSData *)key iv:(NSData *)iv; - (NSData *)AES128DecryptedDataWithKey:(NSData *)key iv:(NSData *)iv; @end
Class Name: NSData+AES.m
#import "NSData+AES.h" #import <CommonCrypto/CommonCryptor.h> @implementation NSData (AES) - (NSData *)AES128EncryptedDataWithKey:(NSData *)key { return [self AES128EncryptedDataWithKey:key iv:nil]; } - (NSData *)AES128DecryptedDataWithKey:(NSData *)key { return [self AES128DecryptedDataWithKey:key iv:nil]; } - (NSData *)AES128EncryptedDataWithKey:(NSData *)key iv:(NSData *)iv { return [self AES128Operation:kCCEncrypt key:key iv:iv]; } - (NSData *)AES128DecryptedDataWithKey:(NSData *)key iv:(NSData *)iv { return [self AES128Operation:kCCDecrypt key:key iv:iv]; } - (NSData *)AES128Operation:(CCOperation)operation key:(NSData *)key iv:(NSData *)iv { NSUInteger dataLength = [self length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, key.bytes, kCCBlockSizeAES128, iv.bytes, [self bytes], dataLength, buffer, bufferSize, &numBytesEncrypted); if (cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; } free(buffer); return nil; } @end