swift aes 加密

1、需要引入 libSystem.dylib

2、添加NSData 类扩展,代码如下

extension NSData{
    func AES128Crypt(operation:CCOperation,keyData:NSData)->NSData?{

        let keyBytes        = keyData.bytes
        let keyLength       = Int(kCCKeySizeAES256)
        
        let dataLength      = self.length
        let dataBytes       = self.bytes

        let cryptLength     = Int(dataLength+kCCBlockSizeAES128)
        var cryptPointer    = UnsafeMutablePointer<UInt8>.alloc(cryptLength)

        let algoritm:  CCAlgorithm = CCAlgorithm(kCCAlgorithmAES128)
        let option:   CCOptions    = CCOptions(kCCOptionECBMode + kCCOptionPKCS7Padding)
        
        var numBytesEncrypted = UnsafeMutablePointer<Int>.alloc(1)
        numBytesEncrypted.initialize(0)
        
        var cryptStatus = CCCrypt(operation, algoritm, option, keyBytes, keyLength, nil, dataBytes, dataLength, cryptPointer, cryptLength, numBytesEncrypted)
        
        if CCStatus(cryptStatus) == CCStatus(kCCSuccess) {
            let len = Int(numBytesEncrypted.memory)
            var data:NSData = NSData(bytesNoCopy: cryptPointer, length: len)

            numBytesEncrypted.dealloc(1)
            return data
            
        } else {
            numBytesEncrypted.dealloc(1)
            cryptPointer.dealloc(cryptLength)
            
            return nil
        }
    }
    
    static func test(){
        let keyString        = "12345678901234567890123456789012"
        let keyData: NSData! = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!

        let message       = "Don´t try to read this text. Top Secret Stuff"
        let data: NSData! = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!
        
        let result:NSData? = data.AES128Crypt(CCOperation(kCCEncrypt), keyData: keyData)
        println("encrypt = \(result)")
        
        let oldData = result?.AES128Crypt(CCOperation(kCCDecrypt), keyData: keyData)
        println("decrypt = \(oldData)")
    }
}


3、swift中指针的使用

c/c++中指针对应swift中的UnsafePointer & UnsafeMutablePointer

UnsafePointer 类型指向的内容不可变;UnsafeMutablePointer 类型指向的内容可以修改

swift中不可以对变量使用取地址操作