Swift3中3DES加密

一. 导入CommonCrypto库

1.建立桥接文件
  1. command + n 新建file,选择Header File
  2. 依次点击项目TARGETS , Build Settings , 搜索bridging,配置路径(路径格式:项目名+桥接文件名称)
    截图如下:
image.png
image.png
2.在桥接文件中导入CommonCrypto库

#import <CommonCrypto/CommonCrypto.h>

二. Triple DES 代码

extension String {
    
    /**
     3DES的加密过程 和 解密过程
     
     - parameter op : CCOperation: 加密还是解密
     CCOperation(kCCEncrypt)加密
     CCOperation(kCCDecrypt) 解密
     
     - parameter key: 加解密key
     - parameter iv : 可选的初始化向量,可以为nil
     - returns      : 返回加密或解密的参数
     */
    func tripleDESEncryptOrDecrypt(op: CCOperation,key: String,iv: String) -> String? {
        
        // Key
        let keyData: NSData = key.data(using: String.Encoding.utf8, allowLossyConversion: true) as NSData!
        let keyBytes         = UnsafeMutableRawPointer(mutating: keyData.bytes)
        
        var data: NSData!
        if op == CCOperation(kCCEncrypt) {//加密内容
            data  = self.data(using: String.Encoding.utf8, allowLossyConversion: true) as NSData!
        }
        else {//解密内容
            data =  NSData(base64Encoded: self, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)!
        }
        
        let dataLength    = size_t(data.length)
        let dataBytes     = UnsafeMutableRawPointer(mutating: data.bytes)
        
        // 返回数据
        let cryptData    = NSMutableData(length: Int(dataLength) + kCCBlockSize3DES)
        let cryptPointer = UnsafeMutableRawPointer(mutating: cryptData?.bytes)
        let cryptLength  = size_t(cryptData!.length)
        
        //  可选 的初始化向量
        let viData :NSData = iv.data(using: String.Encoding.utf8, allowLossyConversion: true) as NSData!
        let viDataBytes    = UnsafeMutableRawPointer(mutating: viData.bytes)
        
        // 特定的几个参数
        let keyLength              = size_t(kCCKeySize3DES)
        let operation: CCOperation = UInt32(op)
        let algoritm:  CCAlgorithm = UInt32(kCCAlgorithm3DES)
        let options:   CCOptions   = UInt32(kCCOptionPKCS7Padding)
        
        var numBytesCrypted :size_t = 0
        
        let cryptStatus = CCCrypt(operation, // 加密还是解密
            algoritm, // 算法类型
            options,  // 密码块的设置选项
            keyBytes, // 秘钥的字节
            keyLength, // 秘钥的长度
            viDataBytes, // 可选初始化向量的字节
            dataBytes, // 加解密内容的字节
            dataLength, // 加解密内容的长度
            cryptPointer, // output data buffer
            cryptLength,  // output data length available
            &numBytesCrypted) // real output data length
        
        
        
        if UInt32(cryptStatus) == UInt32(kCCSuccess) {
            
            cryptData!.length = Int(numBytesCrypted)
            if op == CCOperation(kCCEncrypt)  {
                let base64cryptString = cryptData?.base64EncodedString(options: NSData.Base64EncodingOptions.lineLength64Characters)
                return base64cryptString
            }
            else {
                let base64cryptString = String.init(data: cryptData! as Data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))
                return base64cryptString
            }
        } else {
            print("Error: \(cryptStatus)")
        }
        return nil
    }
}

三. 使用3DES加解密方法

        let key = "这里写入秘钥"
        let iv = "这里写入初始化向量(可以为nil)"
        
        let text = "这里写入加密内容"
        var encryptText:String?
        var decrptText:String?
        encryptText = text.tripleDESEncryptOrDecrypt(op: CCOperation(kCCEncrypt), key: key, iv: iv)
        decrptText = encryptText?.tripleDESEncryptOrDecrypt(op: CCOptions(kCCDecrypt), key: key, iv: iv)
        print("加密内容:"+(encryptText ?? "加密失败")+"\n解密内容:"+(decrptText ?? "解密失败"))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,663评论 25 709
  • 一、Swift趋势 虽然还处于过渡时期,但趋势很明朗了,Swift 必然会替代 Objective-C,并且比想象...
    奋斗的蜗牛阅读 11,463评论 1 34
  • 大家好像都在准备着回家,打着大包小包的行李,但并不是每个人都有小车,许多人都站成一排,等待着公共汽车。 我和家人...
    Small_Cake阅读 1,778评论 1 0
  • 这一期的训练营又要结束了,带着不舍又要说再见。回顾自己这一路走来,已经参加了三期训练营的写作。忙碌的工作虽...
    秋水伊人_44ad阅读 1,877评论 0 1
  • 今天老师带我们学习了CArchive类、类对象的串行化、文件对话框和CObArray对象数组。 类对象的串行化就是...
    王虹淇阅读 1,184评论 0 0

友情链接更多精彩内容