[Swift通天遁地]七、数据与安全-(17)使用Swift实现原生的3DES加密和解密

[Swift通天遁地]七、数据与安全-(17)使用Swift实现原生的3DES加密和解密,第1张

概述本文将演示如何编写原生的3DES加密解密程序。 首先创建一个桥接头文件,因为需要使用到OC语言的通用加密解密类库。 在项目文件夹【DemoApp】上点击鼠标右键,d出右键菜单。 【New File】->【Header File】->【Next】-> 【Save As】:Header.h->【Create】 在该文件中,添加需要引用到的框架。 1 //添加需要引用到的框架。2 #ifndef

本文将演示如何编写原生的3DES加密和解密程序。

首先创建一个桥接头文件,因为需要使用到OC语言的通用加密解密类库。

在项目文件夹【DemoApp】上点击鼠标右键,d出右键菜单。

【New file】->【header file】->【Next】->

【Save As】:header.h->【Create】

在该文件中,添加需要引用到的框架。

1 //添加需要引用到的框架。2 #ifndef header_h3 #define header_h4 5 #import <CommonCrypto/CommonCrypto.h>6 #import "SecurityUtil.h"7 8 #endif /* header_h */

点击项目名称【DemoApp】,显示项目的属性信息,

将头文件添加到桥接头选项中->【Build Settings】

->在搜索框内,输入需要定位的设置项目的名称:【Objective-C BrIDging Hader】

->鼠标双击选项右侧【Objective-C BrIDging Hader】,d出桥接头文件设置窗口。

->在打开的输入窗口中,输入刚刚创建的头文件的相对路径:【DemoApp/header.h】

在项目导航区,打开视图控制器的代码文件【VIEwController.swift】

现在开始编写代码,实现3DES的加密和解密功能。

  1 import UIKit  2   3 //首先创建一个集合,用来生成随机的公用的密钥  4 private let randomStringArray: [Character] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMnopQRSTUVWXYZ0123456789".map({$0})  5   6 class VIEwController: UIVIEwController {  7       8     //给类添加一个字符串属性,  9     //作为加密解密的公钥和私钥, 10     //并对其进行初始化 *** 作。 11     var key:String = "" 12      13     overrIDe func vIEwDIDLoad() { 14         super.vIEwDIDLoad() 15         // Do any additional setup after loading the vIEw,typically from a nib. 16         //调用方法 17         encrypt(encryptData: "https://www.cnblogs.com/strengthen/") 18     } 19      20     //添加一个方法,用来生成指定长度的字符串 21     func randomStringOfLength(_ length:Int) -> String 22     { 23         //初始化一个字符串变量 24         var string = "" 25         //添加一个指定次数的循环语句 26         ////往字符串变量中添加随机的字符 27         for _ in (1...length) 28         {             29             //从集合中获得英文大小写字母和0~9之间的随机数字, 30             //并将随机字符添加到字符串中。 31             string.append(randomStringArray[Int(arc4random_uniform(UInt32(randomStringArray.count) - 1))]) 32         } 33         //返回生成的随机字符串 34         return string 35     } 36      37     //添加一个方法,对字符串参数进行加密 38     func encrypt(encryptData:String) 39     { 40         //生成一个随机的字符串,作为加密解密的密钥。 41         //其参数的值是24, 42         //因此这里将生成一个长度为24的,包含英文大小写字母和数字的随机字符串。 43         key = randomStringOfLength(kCCKeySize3DES) 44         //将待加密的字符串,转换成指定编码的数据类型。 45         let inputData : Data = encryptData.data(using: String.EnCoding.utf8)! 46         //将随机字符串的密钥,同样转换成数据类型。 47         let keyData: Data = key.data(using: String.EnCoding.utf8,allowLossyConversion: false)! 48         //创建一个非安全的可变原始指针, 49         //在创建该指针时,向系统申请了个数为密钥字节数的内存。 50         let keyBytes = UnsafeMutableRawPointer(mutating: (keyData as NSData).bytes) 51         //创建一个常量,表示密钥的长度,它的值是24 52         let keyLength = size_t(kCCKeySize3DES) 53         //获得待加密的数据类型对象的长度。 54         let dataLength = Int(inputData.count) 55         //创建一个非安全的指针,并从系统中分配相应的内存,作为加密的输入缓存。 56         let dataBytes = UnsafeRawPointer((inputData as NSData).bytes) 57         //创建一个指定长度的可变二进制数据对象, 58         //该对象作为加密的输出缓存,用来存储加密后的数据。 59         //其长度为输入缓存的长度和块大小的和,块的大小为8。 60         let bufferData = NSMutableData(length: Int(dataLength) + kCCBlockSize3DES)! 61         //创建一个非安全的可变指针,并根据输出缓存的大小,分配相应的内存。 62         let bufferPointer = UnsafeMutableRawPointer(bufferData.mutableBytes) 63         //获得输出缓存的长度。 64         let bufferLength = size_t(bufferData.length) 65         //创建一个变量,用来存储加密后的输出缓存的最终字节数。 66         var bytesDecrypted = Int(0) 67          68         //调用来自头文件中的加密解密方法, 69         //参数1:用来区分加密或解密,这里选择加密 70         //参数2:加密的算法 71         //参数3:使用密钥和算法,对文本进行加密时的方法。 72         let cryptStatus = CCCrypt(UInt32(kCCEncrypt),UInt32(kCCAlgorithm3DES), 73                                   UInt32(kCcoptionECBMode + kCcoptionPKCS7padding), 74                                   keyBytes,keyLength,nil,dataBytes,dataLength, 75                                   bufferPointer,bufferLength,&bytesDecrypted) 76          77         //当执行完加密方法后,会返回一个状态,通过对状态的检测, 78         //可以判断加密 *** 作是否成功, 79         //加密 *** 作有可能返回七种状态。 80         if Int32(cryptStatus) == Int32(kCCSuccess) 81         { 82             //当判断加密 *** 作正确后,设置输出数据的长度, 83             //以调整输出缓存的大小。为最终输出的加密数据的长度。 84             bufferData.length = bytesDecrypted 85              86             //在控制台输出日志 87             print(bufferData) 88             //对加密后的数据进行解密。 89             decrypt(inputData: bufferData as Data) 90         } 91         else 92         { 93             print("Error:\(cryptStatus)") 94         } 95     } 96      97     //添加一个方法,用来实现指定类型的解密 *** 作。 98     //解密的代码和加密的代码大致相同 99     func decrypt(inputData : Data)100     {101         //将作为随机字符串的密钥,转换成数据类型102         let keyData: Data = key.data(using: String.EnCoding.utf8,allowLossyConversion: false)!103         //创建一个非安全的可变原始指针,104         //在创建该指针时,向系统申请了个数为密钥字节数的内存。105         let keyBytes       = UnsafeMutableRawPointer(mutating: (keyData as NSData).bytes)106         //创建一个常量,表示密钥的长度,它的值是 24107         let keyLength      = size_t(kCCKeySize3DES)108         //获得待加密数据类型对象的长度109         let dataLength     = Int(inputData.count)110         //创建一个非安全的指针,并从系统中分配相应的内存,作为解密的输入缓存。111         let dataBytes      = UnsafeRawPointer((inputData as NSData).bytes)112         //创建一个指定长度的可变二进制数据对象,113         //该对象作为解密的输出缓存,用来存储解密后的数据。114         //其长度为输入缓存的长度和块大小的和,块的大小为8。115         let bufferData     = NSMutableData(length: Int(dataLength) + kCCBlockSize3DES)!116         //创建一个非安全的可变指针,并根据输出缓存的大小,分配相应的内存。117         let bufferPointer  = UnsafeMutableRawPointer(bufferData.mutableBytes)118         //获得输出缓存的长度119         let bufferLength   = size_t(bufferData.length)120         //创建一个变量,用来存储解密后的输出缓存的最终字节数。121         var bytesDecrypted = Int(0)122         123         //调用来自头文件中的加密解密方法,124         //参数1:用来区分加密或解密,这里选择解密125         //参数2:解密的算法126         //参数3:使用密钥和算法,对文本进行解密时的方法。127         let cryptStatus = CCCrypt(UInt32(kCCDecrypt),128                                   UInt32(kCcoptionECBMode + kCcoptionPKCS7padding),129                                   keyBytes,130                                   bufferPointer,&bytesDecrypted)131         132         //当执行完加密方法后,会返回一个状态,通过对状态的检测,133         //可以判断解密 *** 作是否成功,134         if Int32(cryptStatus) == Int32(kCCSuccess)135         {136             //当判断解密 *** 作正确后,设置输出数据的长度,137             //以调整输出缓存的大小。为最终输出的解密数据的长度。138             bufferData.length = bytesDecrypted139             140             //将解密后的数据,以指定的编码方式,转换成字符串对象。141             let clearDataAsstring = Nsstring(data: bufferData as Data,enCoding: String.EnCoding.utf8.rawValue)142             //打印日志143             print("The result:\(clearDataAsstring! as String)")144         }145         else146         {147             //打印日志148             print("Error in crypto operation:\(cryptStatus)")149         }150     }151     152     overrIDe func dIDReceiveMemoryWarning() {153         super.dIDReceiveMemoryWarning()154         // dispose of any resources that can be recreated.155     }156 }
总结

以上是内存溢出为你收集整理的[Swift通天遁地]七、数据与安全-(17)使用Swift实现原生的3DES加密和解密全部内容,希望文章能够帮你解决[Swift通天遁地]七、数据与安全-(17)使用Swift实现原生的3DES加密和解密所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1020031.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存