
iOS 3DES加密解密(一行代码搞定)
发布日期:2021-05-09 04:04:01
浏览次数:17
分类:博客文章
本文共 4208 字,大约阅读时间需要 14 分钟。
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加密解密需要用到写的 https://github.com/jukai9316/JKEncrypt。
下面先解析以下3DES的实现,然后再说,如何使用JKEncrypt。
注意点:填充方式不一样
在与后台交互的过程中,由于java 里面用的是PKCS5Padding,而iOS只有kCCOptionPKCS7Padding,所以用kCCOptionPKCS7Padding | kCCOptionECBMode 相当于PKCS5Padding。
以下是3DES 256 在iOS开发中的实现:
#import#import #import #import "GTMBase64.h"
//密匙 key#define gkey @"Kyle_Chu"//偏移量#define gIv @"jukai"
//字符串加密-(NSString *)doEncryptStr:(NSString *)originalStr{ //把string 转NSData NSData* data = [originalStr dataUsingEncoding:NSUTF8StringEncoding]; //length size_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]; //配置CCCrypt ccStatus = CCCrypt(kCCEncrypt, kCCAlgorithm3DES, //3DES kCCOptionECBMode|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 *)bufferPtr length:(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);
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月09日 10时47分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Django实战总结 - 快速开发一个Web服务
2021-05-09
ApiTesting全链路接口自动化测试框架 - 实战应用
2021-05-09
Robot Framework 自动化框架大纲
2021-05-09
【DG】主rac + 备rac dg 部署
2021-05-09
【DG】物理DG中主库的LNSn、NSS、NSA进程的比较
2021-05-09
Oracle一次缩小表空间的处理过程
2021-05-09
数据库笔试面试题库(Oracle、MySQL等)
2021-05-09
【三思笔记】 全面学习Oracle分区表及分区索引
2021-05-09
【AIX】AIX内存机制
2021-05-09
造成错误“ORA-12547: TNS:lost contact”的常见原因有哪些?
2021-05-09
wcf webHttpBinding Post 大数据量提交 ios c#客户端
2021-05-09
sql 时间总结
2021-05-09
【权限的思考】(一)使用反射实现动态权限
2021-05-09
多线程设置flag标志位实现同步
2021-05-09
[LeetCode题解]141. 环形链表 | 快慢指针
2021-05-09
MySQL错误日志(Error Log)
2021-05-09
MySQL二进制文件(binlog)
2021-05-09
Redis性能篇(二)CPU核和NUMA架构的影响
2021-05-09
MMORPG大型游戏设计与开发(客户端架构 part3 of vegine)
2021-05-09
C基础 带你手写 redis ae 事件驱动模型
2021-05-09