Swift - 常用 - 加密/解密
2017-01-04 10:22
218 查看
(1)首先创建桥接头文件bridge.h来包含需要引用的Objective-C头文件,并在项目中配置
(2)下面是一个封装类,同时对String进行扩展。(除了SHA1,还可以使用其它算法比如MD5,SHA224等)
(3)测试样例
文/Peter__Pan(简书作者)
原文链接:http://www.jianshu.com/p/738f681f1f47
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
#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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- 用java常用加密,解密,数字签名等常用API
- 用java常用加密,解密,数字签名等常用API
- Asp.Net常用加密解密方法
- bitmap的一些常用操作:读图片文件、图片缩放和旋转、将图片二进制转化为bitmap,以及图片加密,解密
- Asp.net常用加密和解密方法
- 常用加密解密方法
- WDSsoft免费源代码,java加密解密编程常用工具包 JCT 1.0 (整理)
- java 常用方法的加密解密
- .net常用加密解密方法
- Asp.net常用加密解密方法
- 加密解密、信息摘要常用算法收集~~
- 常用的加密解密(DES,RSA)
- 转:Asp.Net常用加密解密方法
- 收集java的常用方法代码-MD5和一个可逆加密算法相接合的加密和解密程序
- asp.net常用加密解密方法
- 常用的加密解密方法
- 常用的加密解密方法收藏
- 用java常用加密,解密,数字签名等常用API
- 常用的加密解密及编码解码算法
- 【待完善】常用的编码解码及加密解密方式