iOS 3DES加密解密(一行代码搞定)
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加密解密(一行代码搞定)相关推荐
- WPF使用Linq 一行代码搞定数据绑定
首先设置好DataGrid控件的相关属性,注意XAML代码文件中的列绑定要和源数据的列名一致,如: Binding="{Binding No}" 详细设置如下: this.data ...
- 开源作品ThinkJDBC—一行代码搞定数据库操作
1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...
- 成功解决numpy.ndarray格式类型转数据为list格式数据带有中括号(一行代码搞定!)
成功解决numpy.ndarray格式类型转数据为list格式数据带有中括号(一行代码搞定!) 目录 解决问题 解决思路 解决方法 解决问题 numpy.ndarray格式类型转数据为list格式数据 ...
- 一行代码搞定 Scrapy 随机 User-Agent 设置
摘要:爬虫过程中的反爬措施非常重要,其中设置随机 User-Agent 是一项重要的反爬措施,Scrapy 中设置随机 UA 的方式有很多种,有的复杂有的简单,本文就对这些方法进行汇总,提供一种只需要 ...
- 【Python】Autoviz: 一行代码搞定数据集探索并可视化
数据集各个特征有什么变化趋势.各个特征之间有何关系,我们可以借助Matplotlib.Seaborn等诸多工具来可视化展示,那么有没有一种工具能一次展示所有的关系了? 本文要介绍的Python工具Au ...
- 一行代码搞定 FTP 服务
环境搭建: python windows/linux pip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/ ...
- 一行代码搞定 GitHub 访问徽章
相信对于使用 GitHub 的小伙伴来说,以上 GitHub 徽章(badge)应该都不怎么陌生吧.如果你想快速用起来,找到你想要的徽章代码 ctrl+c & ctrl+v ,再修改对应的 G ...
- SDAutoLayout 一行代码搞定自动布局
SDAutoLayout(一行代码搞定自动布局!) QQ交流群:519489682(已满)497140713 ☆☆ SDAutoLayout 基础版视频教程:http://www.letv.com/p ...
- thinkjdbc 关闭_ThinkJD: ThinkJD,又名ThinkJDBC,一个强大的开源JDBC/ORM操作库,让你尽可能简洁地用一行代码搞定数据库操作。...
1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...
最新文章
- 高速电路中的AC耦合电容
- POJ2492 A Bug s Life 题解
- SAP PM 初级系列13 - PM Revision
- 帧中继环境下NBMA模式的配置
- git--分支管理策略
- 《研磨设计模式》chap6 工厂模式factory(1)模式简介
- java多线程生产者与消费者问题_java多线程实现生产者与消费者问题
- 前端和后端的英文_计算机专业的本科生在前端、后端、测试和运维之间该如何选择...
- 白硕 | 基于区块链的众包社区激励机制
- 讲解Linux数据库安装
- ios图文详情加载html_前端项目009 Vue 信息分享系统 商品列表、详情
- python可以调用c语言编写的底层代码吗_Python基础笔记系列十四:python无缝调用c程序...
- 2016物联网大趋势搞不懂?别担心,CES为你指点迷津
- js 时间加减_【JS】550 简单几步让你的 JS 写得更漂亮
- 树状数组--快捷的线段树
- oracle hang analyze,Oracle hanganalyze工具的使用
- linux上验证cudnn是否安装成功_Ubuntu 18.04安装CUDA(版本10.2)和cuDNN
- 云游戏真的来了,这次的搅局者是 Google,云游戏平台搭建
- stm32 LCD1602显示
- android dtb文件位置_确定msm8937+android7.1采用的dtb文件