Swift 版本加密 - lanligang/NearPublicProject GitHub Wiki

/** 需要使用桥接文件导入  注意
* #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: {
		})
⚠️ **GitHub.com Fallback** ⚠️