Swift에서 CommonCrypto를 이용해 AES암호화/복호화하기
프로젝트 내에 CommonCrypto/module.map 파일 생성해서 추가
프로젝트 설정의 Swift Compiler - Search Paths - Import Paths 에 "$(SRCROOT)/CommonCrypto" 추가
module CommonCrypto [system] {
header "/usr/include/CommonCrypto/CommonCrypto.h"
export *
}
extensions+aes.swift
import CommonCrypto
extension NSData {
func AESEncrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> NSData? {
if let keyData = key.dataUsingEncoding(NSUTF8StringEncoding),
cryptData = NSMutableData(length: Int((self.length)) + kCCBlockSizeAES128) {
let keyLength = size_t(kCCKeySizeAES256)
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.bytes, keyLength,
iv,
self.bytes, self.length,
cryptData.mutableBytes, cryptData.length,
&numBytesEncrypted)
if Int32(cryptStatus) == Int32(kCCSuccess) {
cryptData.length = Int(numBytesEncrypted)
return cryptData
}
}
return nil
}
func AESDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> NSData? {
if let keyData = key.dataUsingEncoding(NSUTF8StringEncoding),
cryptData = NSMutableData(length: Int((self.length)) + kCCBlockSizeAES128) {
let keyLength = size_t(kCCKeySizeAES256)
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.bytes, keyLength,
iv,
self.bytes, self.length,
cryptData.mutableBytes, cryptData.length,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
cryptData.length = Int(numBytesEncrypted)
return cryptData
}
}
return nil
}
}
extension String {
func AESEncrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? {
if let data = self.dataUsingEncoding(NSUTF8StringEncoding),
cryptData = data.AESEncrypt(key, iv: iv, options: options) {
return cryptData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
}
return nil
}
func AESDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? {
if let data = NSData(base64EncodedString: self, options: .IgnoreUnknownCharacters),
cryptData = data.AESDecrypt(key, iv: iv, options: options) {
return String(data: cryptData, encoding:NSUTF8StringEncoding)
}
return nil
}
}
유승훈 7년전 질문