3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。

一行代码实现3DES加密解密需要用到写的 JKEncrypt  https://github.com/jukai9316/JKEncrypt。

下面先解析以下3DES的实现,然后再说,如何使用JKEncrypt。

注意点:填充方式不一样

在与后台交互的过程中,由于java 里面用的是PKCS5Padding,而iOS只有kCCOptionPKCS7Padding,所以用kCCOptionPKCS7Padding | kCCOptionECBMode 相当于PKCS5Padding。

以下是3DES 256 在iOS开发中的实现:

#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>
#import <Security/Security.h>
#import "GTMBase64.h"

//密匙 key
#define gkey            @"Kyle_Chu"
//偏移量
#define gIv             @"jukai"

//字符串加密
-(NSString *)doEncryptStr:(NSString *)originalStr{//把string 转NSDataNSData* data = [originalStr dataUsingEncoding:NSUTF8StringEncoding];//lengthsize_t plainTextBufferSize = [data length];const void *vplainText = (const void *)[data bytes];CCCryptorStatus ccStatus;uint8_t *bufferPtr = NULL;size_t bufferPtrSize = 0;size_t movedBytes = 0;bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));memset((void *)bufferPtr, 0x0, bufferPtrSize);const void *vkey = (const void *) [gkey UTF8String];//偏移量const void *vinitVec = (const void *) [gIv UTF8String];//配置CCCryptccStatus = CCCrypt(kCCEncrypt,kCCAlgorithm3DES, //3DESkCCOptionECBMode|kCCOptionPKCS7Padding, //设置模式vkey,    //key
                       kCCKeySize3DES,vinitVec,     //偏移量,这里不用,设置为nil;不用的话,必须为nil,不可以为@“”
                       vplainText,plainTextBufferSize,(void *)bufferPtr,bufferPtrSize,&movedBytes);NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];NSString *result = [GTMBase64 stringByEncodingData:myData];return result;
}

//字符串解密
-(NSString*)doDecEncryptStr:(NSString *)encryptStr{NSData *encryptData = [GTMBase64 decodeData:[encryptStr dataUsingEncoding:NSUTF8StringEncoding]];size_t plainTextBufferSize = [encryptData length];const void *vplainText = [encryptData bytes];CCCryptorStatus ccStatus;uint8_t *bufferPtr = NULL;size_t bufferPtrSize = 0;size_t movedBytes = 0;bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));memset((void *)bufferPtr, 0x0, bufferPtrSize);const void *vkey = (const void *) [gkey UTF8String];const void *vinitVec = (const void *) [gIv UTF8String];ccStatus = CCCrypt(kCCDecrypt,kCCAlgorithm3DES,kCCOptionPKCS7Padding|kCCOptionECBMode,vkey,kCCKeySize3DES,vinitVec,vplainText,plainTextBufferSize,(void *)bufferPtr,bufferPtrSize,&movedBytes);NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtrlength:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];return result;
}

十六进制的实现省略了,可以阅读JKEncrypt.m

JKEncrypt的使用:

//1、设置您需要的密匙、偏移量
//密匙 key
#define gkey            @"Kyle_Chu"
//偏移量
#define gIv             @"jukai"

// @"kyle_jukai" 是测试字符串,换成您需要加密的内容即可

JKEncrypt * en = [[JKEncrypt alloc]init];
//加密
NSString * encryptStr = [en doEncryptStr: @"kyle_jukai"];NSString * encryptHex = [en doEncryptHex: @"kyle_jukai"];NSLog(@"字符串加密:%@",encryptStr);
NSLog(@"十六进制加密:%@",encryptHex);
//解密
NSString *decEncryptStr = [en doDecEncryptStr:encryptStr];NSString *decEncryptHex = [en doEncryptHex:encryptHex];NSLog(@"字符串解密:%@",decEncryptStr);
NSLog(@"字符串解密:%@",decEncryptHex);

转载于:https://www.cnblogs.com/jukaiit/p/5039803.html

iOS 3DES加密解密(一行代码搞定)相关推荐

  1. WPF使用Linq 一行代码搞定数据绑定

    首先设置好DataGrid控件的相关属性,注意XAML代码文件中的列绑定要和源数据的列名一致,如: Binding="{Binding No}" 详细设置如下: this.data ...

  2. 开源作品ThinkJDBC—一行代码搞定数据库操作

    1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...

  3. 成功解决numpy.ndarray格式类型转数据为list格式数据带有中括号(一行代码搞定!)

    成功解决numpy.ndarray格式类型转数据为list格式数据带有中括号(一行代码搞定!) 目录 解决问题 解决思路 解决方法 解决问题 numpy.ndarray格式类型转数据为list格式数据 ...

  4. 一行代码搞定 Scrapy 随机 User-Agent 设置

    摘要:爬虫过程中的反爬措施非常重要,其中设置随机 User-Agent 是一项重要的反爬措施,Scrapy 中设置随机 UA 的方式有很多种,有的复杂有的简单,本文就对这些方法进行汇总,提供一种只需要 ...

  5. 【Python】Autoviz: 一行代码搞定数据集探索并可视化

    数据集各个特征有什么变化趋势.各个特征之间有何关系,我们可以借助Matplotlib.Seaborn等诸多工具来可视化展示,那么有没有一种工具能一次展示所有的关系了? 本文要介绍的Python工具Au ...

  6. 一行代码搞定 FTP 服务

    环境搭建: python windows/linux pip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/ ...

  7. 一行代码搞定 GitHub 访问徽章

    相信对于使用 GitHub 的小伙伴来说,以上 GitHub 徽章(badge)应该都不怎么陌生吧.如果你想快速用起来,找到你想要的徽章代码 ctrl+c & ctrl+v ,再修改对应的 G ...

  8. SDAutoLayout 一行代码搞定自动布局

    SDAutoLayout(一行代码搞定自动布局!) QQ交流群:519489682(已满)497140713 ☆☆ SDAutoLayout 基础版视频教程:http://www.letv.com/p ...

  9. thinkjdbc 关闭_ThinkJD: ThinkJD,又名ThinkJDBC,一个强大的开源JDBC/ORM操作库,让你尽可能简洁地用一行代码搞定数据库操作。...

    1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...

最新文章

  1. 高速电路中的AC耦合电容
  2. POJ2492 A Bug s Life 题解
  3. SAP PM 初级系列13 - PM Revision
  4. 帧中继环境下NBMA模式的配置
  5. git--分支管理策略
  6. 《研磨设计模式》chap6 工厂模式factory(1)模式简介
  7. java多线程生产者与消费者问题_java多线程实现生产者与消费者问题
  8. 前端和后端的英文_计算机专业的本科生在前端、后端、测试和运维之间该如何选择...
  9. 白硕 | 基于区块链的众包社区激励机制
  10. 讲解Linux数据库安装
  11. ios图文详情加载html_前端项目009 Vue 信息分享系统 商品列表、详情
  12. python可以调用c语言编写的底层代码吗_Python基础笔记系列十四:python无缝调用c程序...
  13. 2016物联网大趋势搞不懂?别担心,CES为你指点迷津
  14. js 时间加减_【JS】550 简单几步让你的 JS 写得更漂亮
  15. 树状数组--快捷的线段树
  16. oracle hang analyze,Oracle hanganalyze工具的使用
  17. linux上验证cudnn是否安装成功_Ubuntu 18.04安装CUDA(版本10.2)和cuDNN
  18. 云游戏真的来了,这次的搅局者是 Google,云游戏平台搭建
  19. stm32 LCD1602显示
  20. android dtb文件位置_确定msm8937+android7.1采用的dtb文件

热门文章

  1. 企业,绩效管理为何力不从心
  2. 電影嘗試三 webtorrent-desktop在線觀看電影magnet
  3. 受到人工智能发展的影响的,主要包括哪些行业?
  4. 百度怎么上传个人信息,百度百科怎么创建自己呢?
  5. 简阳市简阳中学2021年高考成绩查询,四川省简阳中学2021年排名
  6. CAD文件低版本怎么转换高版本
  7. 地震提前预警作用有多大
  8. python代码加密运行_python源码下载后怎样进行加密
  9. 【AVL树】AVL树的插入操作以及旋转
  10. 【Docker】基础(二)