/** 需要使用桥接文件导入 注意
* #import <CommonCrypto/CommonDigest.h>
*#import <CommonCrypto/CommonHMAC.h>
*/
import Foundation
let public_des_key:String = "加密使用的关键key"
extension String {
//加密 ==============================================
public var eCodeString : String {
if self.isEmpty {
return ""
}
let dataKey = public_des_key.data(using: String.Encoding.utf8)
let data = self.data(using: String.Encoding.utf8)
let nsData = NSData.init(data: data ?? Data())
let newnsData = nsData.ecodeDES(keyData: dataKey ?? Data())
let aData = Data.init(referencing: newnsData!)
//将二进制进行 base64加密
let aStr = aData.base64EncodedString(options: NSData.Base64EncodingOptions.init(rawValue: 0))
return aStr
}
//加密 ==============================================
//解密 ==============================================
public var deCodeString : String {
if self.isEmpty {
return ""
}
let dataKey = public_des_key.data(using: String.Encoding.utf8)
let decodedData = NSData(base64Encoded: self, options: NSData.Base64DecodingOptions.init(rawValue: 0))
//base64 解密完的
let newNsData = decodedData?.decodeDES(keyData: dataKey!)
let finishedData = Data.init(referencing: newNsData ?? NSData())
// 这里需要进行去除特殊字符
/**
记录一下
str1.trimmingCharacters(in: CharacterSet(charactersIn: " -"))
*/
if let message = String(data: finishedData, encoding: String.Encoding.utf8) {
return message
}
return ""
}
//解密 ==============================================
}
//AES, AES128, DES, DES3, CAST, RC2,RC4, Blowfish 加密
enum CryptoAlgorithm {
/// 加密的枚举选项 AES/AES128/DES/DES3/CAST/RC2/RC4/Blowfish......
case AES, AES128, DES, DES3, CAST, RC2,RC4, Blowfish
var algorithm: CCAlgorithm {
var result: UInt32 = 0
switch self {
case .AES: result = UInt32(kCCAlgorithmAES)
case .AES128: result = UInt32(kCCAlgorithmAES128)
case .DES: result = UInt32(kCCAlgorithmDES)
case .DES3: result = UInt32(kCCAlgorithm3DES)
case .CAST: result = UInt32(kCCAlgorithmCAST)
case .RC2: result = UInt32(kCCAlgorithmRC2)
case .RC4: result = UInt32(kCCAlgorithmRC4)
case .Blowfish: result = UInt32(kCCAlgorithmBlowfish)
}
return CCAlgorithm(result)
}
var keyLength: Int {
var result: Int = 0
switch self {
case .AES: result = kCCKeySizeAES128
case .AES128: result = kCCKeySizeAES256
case .DES: result = kCCKeySizeDES
case .DES3: result = kCCKeySize3DES
case .CAST: result = kCCKeySizeMaxCAST
case .RC2: result = kCCKeySizeMaxRC2
case .RC4: result = kCCKeySizeMaxRC4
case .Blowfish: result = kCCKeySizeMaxBlowfish
}
return Int(result)
}
var cryptLength: Int {
var result: Int = 0
switch self {
case .AES: result = kCCKeySizeAES128
case .AES128: result = kCCBlockSizeAES128
case .DES: result = kCCBlockSizeDES
case .DES3: result = kCCBlockSize3DES
case .CAST: result = kCCBlockSizeCAST
case .RC2: result = kCCBlockSizeRC2
case .RC4: result = kCCBlockSizeRC2
case .Blowfish: result = kCCBlockSizeBlowfish
}
return Int(result)
}
}
// MARK: - 加密扩展NSData
extension NSData {
//加密的 keyData
func ecodeDES(keyData:Data) -> NSData? {
return enCrypt(algorithm: .DES, keyData: keyData)
}
//解密 参数
func decodeDES(keyData:Data) ->NSData?{
return deCrypt(algorithm: .DES, keyData: keyData)
}
/*
加密
- parameter algorithm: 加密方式
- parameter keyData: 加密key
- return NSData: 加密后的数据 可选值
*/
func enCrypt(algorithm: CryptoAlgorithm, keyData:Data) -> NSData? {
return crypt(algorithm: algorithm, operation: CCOperation(kCCEncrypt), keyData: keyData)
}
/*
解密
- parameter algorithm: 解密方式
- parameter keyData: 解密key
- return NSData: 解密后的数据 可选值
*/
func deCrypt(algorithm: CryptoAlgorithm, keyData:Data) -> NSData? {
return crypt(algorithm: algorithm, operation: CCOperation(kCCDecrypt), keyData: keyData)
}
/*
解密和解密方法的抽取的封装方法
- parameter algorithm: 何种加密方式
- parameter operation: 加密和解密
- parameter keyData: 加密key
- return NSData: 解密后的数据 可选值
*/
func crypt(algorithm: CryptoAlgorithm, operation:CCOperation, keyData:Data) -> NSData? {
let data = NSData(data: keyData)
let keyBytes = data.bytes
let keyLength = Int(algorithm.keyLength)
let dataLength = self.length
let dataBytes = self.bytes
let cryptLength = Int(dataLength+algorithm.cryptLength)
let cryptPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: cryptLength)
let algoritm: CCAlgorithm = CCAlgorithm(algorithm.algorithm)
let option: CCOptions = CCOptions(kCCOptionECBMode + kCCOptionPKCS7Padding)
let numBytesEncrypted = UnsafeMutablePointer<Int>.allocate(capacity: 1)
numBytesEncrypted.initialize(to: 0)
let cryptStatus = CCCrypt(operation, algoritm, option, keyBytes, keyLength, nil, dataBytes, dataLength, cryptPointer, cryptLength, numBytesEncrypted)
// 判断是否加密成功
if CCStatus(cryptStatus) == CCStatus(kCCSuccess) {
let len = Int(numBytesEncrypted.pointee)
let data:NSData = NSData(bytesNoCopy: cryptPointer, length: len)
numBytesEncrypted.deallocate(capacity: 1)
return data
} else {
numBytesEncrypted.deallocate(capacity: 1)
cryptPointer.deallocate(capacity: cryptLength)
return nil
}
}
}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5, execute: {
})