美文网首页iOS开发技术集合
Swift - 常用 - 加密/解密

Swift - 常用 - 加密/解密

作者: GoGooGooo | 来源:发表于2016-01-09 15:02 被阅读4562次

    (1)首先创建桥接头文件bridge.h来包含需要引用的Objective-C头文件,并在项目中配置

    #import <CommonCrypto/CommonHMAC.h>
    

    (2)下面是一个封装类,同时对String进行扩展。(除了SHA1,还可以使用其它算法比如MD5,SHA224等)

    //HMAC.swift
    import Foundation
    
    enum CryptoAlgorithm {
        case MD5, SHA1, SHA224, SHA256, SHA384, SHA512
    
        var HMACAlgorithm: CCHmacAlgorithm {
            var result: Int = 0
            switch self {
            case .MD5:      result = kCCHmacAlgMD5
            case .SHA1:     result = kCCHmacAlgSHA1
            case .SHA224:   result = kCCHmacAlgSHA224
            case .SHA256:   result = kCCHmacAlgSHA256
            case .SHA384:   result = kCCHmacAlgSHA384
            case .SHA512:   result = kCCHmacAlgSHA512
            }
            return CCHmacAlgorithm(result)
        }
        
        var digestLength: Int {
            var result: Int32 = 0
            switch self {
            case .MD5:      result = CC_MD5_DIGEST_LENGTH
            case .SHA1:     result = CC_SHA1_DIGEST_LENGTH
            case .SHA224:   result = CC_SHA224_DIGEST_LENGTH
            case .SHA256:   result = CC_SHA256_DIGEST_LENGTH
            case .SHA384:   result = CC_SHA384_DIGEST_LENGTH
            case .SHA512:   result = CC_SHA512_DIGEST_LENGTH
            }
            return Int(result)
        }
    }
    
    extension String  {
        var md5: String! {
            let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
            let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
            let digestLen = Int(CC_MD5_DIGEST_LENGTH)
            let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)
            CC_MD5(str!, strLen, result)
            return stringFromBytes(result, length: digestLen)
        }
        
        var sha1: String! {
            let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
            let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
            let digestLen = Int(CC_SHA1_DIGEST_LENGTH)
            let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)
            CC_SHA1(str!, strLen, result)
            return stringFromBytes(result, length: digestLen)
        }
        
        var sha256String: String! {
            let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
            let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
            let digestLen = Int(CC_SHA256_DIGEST_LENGTH)
            let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)
            CC_SHA256(str!, strLen, result)
            return stringFromBytes(result, length: digestLen)
        }
        
        var sha512String: String! {
            let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
            let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
            let digestLen = Int(CC_SHA512_DIGEST_LENGTH)
            let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)
            CC_SHA512(str!, strLen, result)
            return stringFromBytes(result, length: digestLen)
        }
        
        func stringFromBytes(bytes: UnsafeMutablePointer<CUnsignedChar>, length: Int) -> String{
            let hash = NSMutableString()
            for i in 0..<length {
                hash.appendFormat("%02x", bytes[i])
            }
            bytes.dealloc(length)
            return String(format: hash as String)
        }
        
        func hmac(algorithm: CryptoAlgorithm, key: String) -> String {
            let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
            let strLen = Int(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
            let digestLen = algorithm.digestLength
            let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)
            let keyStr = key.cStringUsingEncoding(NSUTF8StringEncoding)
            let keyLen = Int(key.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
            
            CCHmac(algorithm.HMACAlgorithm, keyStr!, keyLen, str!, strLen, result)
            
            let digest = stringFromResult(result, length: digestLen)
            
            result.dealloc(digestLen)
            
            return digest
        }
        
        private func stringFromResult(result: UnsafeMutablePointer<CUnsignedChar>, length: Int) -> String {
            let hash = NSMutableString()
            for i in 0..<length {
                hash.appendFormat("%02x", result[i])
            }
            return String(hash)
        }
    }
    

    (3)测试样例

    let str = "welcome to hangge.com"
    let key = "67FG"
    let hmacStr = str.hmac(.SHA1, key: key)
    let pwd = str.d5
             
    print("原始字符串:\(str)")
    print("key:\(key)")
    print("HMAC运算结果:\(hmacStr)")
    print("md5运算结果:\(pwd)")
             
    /**** 输出 ******
    原始字符串:welcome to hangge.com
    key:67FG
    HMAC运算结果:79a5f5b138b5646289a9648de035c80e9c5c14c7
    md5运算结果:0d5ca19da68a37af5900c8ebf5356c6e
    *****/
    

    相关文章

      网友评论

        本文标题:Swift - 常用 - 加密/解密

        本文链接:https://www.haomeiwen.com/subject/zacqkttx.html