Skip to content

Instantly share code, notes, and snippets.

@RockfordWei
Created January 4, 2018 14:55
Show Gist options
  • Save RockfordWei/02e9935694f3dc52f05c14a9af626599 to your computer and use it in GitHub Desktop.
Save RockfordWei/02e9935694f3dc52f05c14a9af626599 to your computer and use it in GitHub Desktop.
CommonCrypto Vs PerfectCrypto
import PerfectCrypto
func AES128Encryption(_ string: String, key: String) -> String? {
guard let hashData = key.digest(.sha384) else { return nil }
let hashKeyData:[UInt8] = hashData[0..<32].map {$0}
let ivData:[UInt8] = hashData[32..<48].map {$0}
let data:[UInt8] = string.utf8.map { $0 }
guard let x = data.encrypt(.aes_128_cbc, key: hashKeyData, iv: ivData),
let y = x.encode(.base64) else {
return nil
}
return String(validatingUTF8: y)
}
let shadow = AES128Encryption("123", key: "456") ?? "failure"
print(shadow)
// llycn0LJRYm7HQm4X9mJBw==
/// which is identically the same as
import CommonCrypto
public static func encrypt(_ string: String, key: String) -> String? {
guard let data = string.data(using: String.Encoding.utf8),
let keyData = key.data(using: String.Encoding.utf8) else { return nil }
let encrypted = perform(data, key: keyData, encrypting: true)
return encrypted?.base64EncodedString(options: .lineLength64Characters)
}
fileprivate static func perform(_ data: Data, key: Data, encrypting: Bool) -> Data? {
guard let out = NSMutableData(length: data.count + kCCBlockSizeAES128) else { return nil }
let hashData = Hash.SHA384(key)
let hashKeyData = hashData.subdata(in: 0..<32)
let ivData = hashData.subdata(in: 32..<48)
let operation = encrypting ? kCCEncrypt : kCCDecrypt
var dataOutMovedLength: size_t = 0
let status = CCCrypt(
CCOperation(operation),
CCAlgorithm(kCCAlgorithmAES128),
CCOptions(kCCOptionPKCS7Padding),
(hashKeyData as NSData).bytes,
kCCKeySizeAES128,
(ivData as NSData).bytes,
(data as NSData).bytes,
size_t(data.count),
out.mutableBytes,
size_t(out.length),
&dataOutMovedLength)
guard Int(status) == Int(kCCSuccess) else { return nil }
out.length = dataOutMovedLength
return out as Data
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment