您的位置:首页 > 移动开发 > Swift

Swift - 常用 - 加密/解密

2017-01-04 10:22 218 查看
(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
*****/


文/Peter__Pan(简书作者)

原文链接:http://www.jianshu.com/p/738f681f1f47

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息