Skip to content

Instantly share code, notes, and snippets.

@janeshsutharios
Created December 3, 2021 05:17
Show Gist options
  • Save janeshsutharios/c216d0fcd3a766961c83437fb65b8211 to your computer and use it in GitHub Desktop.
Save janeshsutharios/c216d0fcd3a766961c83437fb65b8211 to your computer and use it in GitHub Desktop.
Encryption in iOS
//
// EncryptionHelper.swift
// Demo3
//
//
import Foundation
import CommonCrypto
struct AES {
// MARK: - Value
// MARK: Private
private let key: Data
private let iv: Data
// MARK: - Initialzier
init?(key: String, iv: String) {
guard key.count == kCCKeySizeAES128 || key.count == kCCKeySizeAES256, let keyData = key.data(using: .utf8) else {
debugPrint("Error: Failed to set a key.")
return nil
}
guard iv.count == kCCBlockSizeAES128, let ivData = iv.data(using: .utf8) else {
debugPrint("Error: Failed to set an initial vector.")
return nil
}
self.key = keyData
self.iv = ivData
}
// MARK: - Function
// MARK: Public
func encrypt(string: String) -> Data? {
return crypt(data: string.data(using: .utf8), option: CCOperation(kCCEncrypt))
}
func decrypt(data: Data?) -> String? {
guard let decryptedData = crypt(data: data, option: CCOperation(kCCDecrypt)) else { return nil }
return String(bytes: decryptedData, encoding: .utf8)
}
func crypt(data: Data?, option: CCOperation) -> Data? {
guard let data = data else { return nil }
let cryptLength = data.count + kCCBlockSizeAES128
var cryptData = Data(count: cryptLength)
let keyLength = key.count
let options = CCOptions(kCCOptionPKCS7Padding)
var bytesLength = Int(0)
let status = cryptData.withUnsafeMutableBytes { cryptBytes in
data.withUnsafeBytes { dataBytes in
iv.withUnsafeBytes { ivBytes in
key.withUnsafeBytes { keyBytes in
CCCrypt(option, CCAlgorithm(kCCAlgorithmAES), options, keyBytes.baseAddress, keyLength, ivBytes.baseAddress, dataBytes.baseAddress, data.count, cryptBytes.baseAddress, cryptLength, &bytesLength)
}
}
}
}
guard UInt32(status) == UInt32(kCCSuccess) else {
debugPrint("Error: Failed to crypt data. Status \(status)")
return nil
}
cryptData.removeSubrange(bytesLength..<cryptData.count)
return cryptData
}
}
@janeshsutharios
Copy link
Author

//Usage
   let message     = "Top Secret Key"
    let messageData = message.data(using:String.Encoding.utf8)!
    let keyData     = "demoKey".data(using:String.Encoding.utf8)!
    let ivData      = "demoIV".data(using:String.Encoding.utf8)!

    let aes256 = AES(key: "demoKey", iv: "DemoIV")

    let encryptedPassword256 = aes256?.encrypt(string: message)
    
    var encryptedStr1     = encryptedPassword256!.base64EncodedString()
    print("encryptedBase64-->", encryptedStr1)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment