IOS常用加密技术有三种:3DES、SHA1和MD5。其中,对称加密技术有:3DES和SHA1;非对称加密技术有:MD5;

对称加密:加密解密用的是同一个密钥。

非对称加密:生成公有密钥和私有密钥。一个加密,一个解密。

本篇介绍的是3DES加密解密技术:

1、创建HeaderFile文件My3DES.h。然后,添加以下代码,引用相关的头文件:

#import <CommonCrypto/CommonCrypto.h>

2、在BuildSetting面板中设置Objective-C Bridging Header的Value值为第1步创建的桥接文件所在的位置。比如:项目名/文件名.h。

3、配置好了之后,下面就开始使用了。

import UIKit

class ViewController: UIViewController {

private let randomStringArray:[Character] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".map({$0});
    
    var key:String!;
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        let data:Data = encrypt(encryptData: "http://www.baidu.com");
        decrypt(inputData: data);
    }

func randomStringOfLength(_ length:Int) -> String {
        var string = "";
        for _ in(1...length) {
            string.append(randomStringArray[Int(arc4random_uniform(UInt32(randomStringArray.count) - 1))]);
        }
        return string;
    }
    
    //加密
    func encrypt(encryptData:String) -> Data {
        key = randomStringOfLength(kCCKeySize3DES);
        let inputData:Data = encryptData.data(using: String.Encoding.utf8)!;
        
        let keyData:Data = key.data(using: String.Encoding.utf8, allowLossyConversion: false)!;
        let keyBytes = UnsafeMutableRawPointer(mutating: (keyData as NSData).bytes);
        let keyLength = size_t(kCCKeySize3DES);
        
        let dataLength = Int(inputData.count);
        let dataBytes = UnsafeRawPointer((inputData as NSData).bytes);
        let bufferData = NSMutableData(length: Int(dataLength) + kCCKeySize3DES)!;
        let bufferPointer = UnsafeMutableRawPointer(bufferData.mutableBytes);
        let bufferLength = size_t(bufferData.length);
        var bytesDecrypted = Int(0);
        
        let cryptStatus = CCCrypt(
            UInt32(kCCEncrypt),
            UInt32(kCCAlgorithm3DES),
            UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding),
            keyBytes,
            keyLength,
            nil,
            dataBytes,
            dataLength,
            bufferPointer,
            bufferLength,
            &bytesDecrypted
            );
        
        if Int32(cryptStatus) == Int32(kCCSuccess) {
            bufferData.length = bytesDecrypted;
            print("encrypt success");
            
        } else {
            print("加密过程出错\(cryptStatus)");
        }
        return bufferData as Data;
    }
    
    //解密
    func decrypt(inputData:Data) {
        let keyData:Data = key.data(using: String.Encoding.utf8, allowLossyConversion: false)!;
        let keyBytes = UnsafeMutableRawPointer(mutating: (keyData as NSData).bytes);
        let keyLength = size_t(kCCKeySize3DES);
        
        let dataLength = Int(inputData.count);
        let dataBytes = UnsafeRawPointer((inputData as NSData).bytes);
        let bufferData = NSMutableData(length: Int(dataLength) + kCCKeySize3DES)!;
        let bufferPointer = UnsafeMutableRawPointer(bufferData.mutableBytes);
        let bufferLength = size_t(bufferData.length);
        var bytesDecrypted = Int(0);
        
        let cryptStatus = CCCrypt(
            UInt32(kCCDecrypt),
            UInt32(kCCAlgorithm3DES),
            UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding),
            keyBytes,
            keyLength,
            nil,
            dataBytes,
            dataLength,
            bufferPointer,
            bufferLength,
            &bytesDecrypted
        );
        
        if Int32(cryptStatus) == Int32(kCCSuccess) {
            bufferData.length = bytesDecrypted;
            let clearDataAsString = NSString(data: bufferData as Data, encoding: String.Encoding.utf8.rawValue);
            print("解密后的内容:\(clearDataAsString! as String)");
        } else {
            print("解密过程出错\(cryptStatus)");
        }
    }

}

输出结果为:

encrypt success
解密后的内容:http://www.baidu.com

IOS加密技术之——3DES加密解密技术(记录)相关推荐

  1. java 3des加密_Java使用3DES加密解密的流程 - 3des加密解密详细解释

    Java使用3DES加密解密的流程 ①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象 SecretKey deskey = new Secret ...

  2. 3des加密 java php_php 3des加密 兼容JAVA 多么痛的领悟呀

    最近和别人做接口用到SOCKET TCP/IP方式 其中需要对账号和密码进行3DES加密 对方提供了一个加密比对的软件和JAVA的实现代码 并且给了我们一个长度为32位的密钥 这边需要用PHP来实现! ...

  3. 3des加密 java php_php 3DES加密如何兼容Java

    Java源码: import java.security.Security; import javax.crypto.Cipher; import javax.crypto.SecretKey; im ...

  4. 加密和解密技术基础、PKI及创建私有CA

    一.数据加密和解密概述 数据加密和解密是一门历史悠久的技术,从古代就已经出现了,一直发展到当代.其中,数据加密的目的有很多,可以是为了保证本地数据存取的安全性,可以是为了保证数据流在网络传输过程中的保 ...

  5. DES和3DES加密易于理解的讲解

    下图是DES加密的大致流程,DES是一种64位密钥加密64位明文的加密算法,但是64位密钥中每隔8位就是一位纠错位,所以真正有用的密钥的位数是56位.DES是一一种进行多次加密的对称加密算法,总共要进 ...

  6. 恶意软件反检测技术简介:模拟器超限技术

    恶意软件是一种招人恨的代码,因为它们专干坏事,如泄漏个人隐私.造成数据丢失,等等.而杀毒软件公司则不断想办法检测并阻止恶意软件.如此一来,猫和老鼠的大戏从此开演了.一般来说,杀毒软件要想防御某种恶意软 ...

  7. 17、加密解密技术介绍

    1.通讯机制: 同一主机间通讯机制:IPC.message quence,shm(共享内存),semerphone 不同主机间通讯机制:socket(ip:port),一般来说socket通讯都是成对 ...

  8. 加密解密技术基础及用OpenSSL创建私有CA

    1.加密解密技术基础 (1)进程通信 传输层协议有TCP,UDP,SCTP等,端口号port表示进程地址,进程向内核注册独占使用某端口. 同一主机上的进程间通信方式:进程间通信(IPC), 消息队列( ...

  9. 加密与解密技术原理(密码学)

    加密与解密原理 1. 加密技术发展 加密是利用数学方法将明文转化为密文,从而达到保护数据的目的. 通过加密可保证数据的机密性.完整性.鉴别性.不可否认性. 机密性:通过数据加密实现.只允许特定用户访问 ...

最新文章

  1. Clean-Code: 注释
  2. AI检测贫血不看血,竟是看眼睛
  3. harmonyos开发者邀请码,HarmonyOS 2.0鸿蒙第二期开发者Beta公测申请指南
  4. Java程序员涨薪必备技能
  5. [置顶] CopyU!v2插件合集 [2013年7月18日更新]
  6. SQL性能优化工具TKPROF
  7. 交换知识 VLAN VTP STP 单臂路由
  8. Java泛型通配符T,E,K,V
  9. springboot session超时设置_Spring Boot+Spring Security:获取用户信息和session并发控制...
  10. VC知识库BLOG-技术,非技术......
  11. Strip iPhone6
  12. 爬虫之模拟登录、自动获取cookie值、验证码识别
  13. java 抽样算法_java生成抽样随机数的多种算法
  14. 将正方形图片转换成圆形图片
  15. 跨专业考计算机研究生有专业限制吗,我想跨专业考计算机专业研究生
  16. 海龟绘图简易教程|Turtle for Python
  17. python normalize函数_Python normalize包_程序模块 - PyPI - Python中文网
  18. Apache服务器的下载、安装、配置等等
  19. 微信转发指定的图文消息到朋友圈(JAVA版)
  20. 科创人·知乎CTO李大海:技术服务内容、商业化依赖内容,曾被「呵呵」难到挠头

热门文章

  1. 主流大数据调度工具对比
  2. Java课程设计-日历记事本
  3. 发那科机器人回原位置先上升_机器人小知识 | 发那科机器人位置信息修改介绍...
  4. 几个cve漏洞库查询网站
  5. 用html和css制作钟表,使用HTML5和CSS3制作简单的钟表
  6. Qt: 判断字符串是否为数字,是否为整数
  7. Go语言求平方根与解高次方程以及公式推导
  8. #2002 SIGSEGV(SEGV_MAPERR)
  9. 学习Java主要的就业方向有哪些呢?
  10. 手机如何打开开发者模式