[Swift] AES 암호화/복호화

swift crypt

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년전 질문


댓글 0

댓글작성

목록보기