Created
January 4, 2018 14:55
-
-
Save RockfordWei/02e9935694f3dc52f05c14a9af626599 to your computer and use it in GitHub Desktop.
CommonCrypto Vs PerfectCrypto
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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