一行代码实现IOS 3DES加密解密

转载 2016年08月29日 09:49:34

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开发中的实现:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#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 转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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//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);

ps:iOS DES加密与3DES加密

最近项目中遇到了加解密的问题,然后翻阅了相关资料,成功搞定。 现在将这些知识点总结一下,一是为了以后复习,二是为了给大家提供参考。

1.  先来说说DES操作,定义我这里就不叙述了,网上一堆一堆的。接下来说一下使用时应该注意的几点。 首先,大家要分清Key(密钥),Data(待操作数据)跟Mode(加密模式)。其中Key必须为8字节(64位),Data需要是8字节(64位)的倍数,这里需要注意了,如果Data不是8字节的倍数,那么我们需要进行数据填充,数据填充使用的算法不一定相同。Mode貌似有许多种,这里只简单的说一下ECB跟CBC模式。

ECB模式:将待处理的数据分成若干块,每块的长度都为8字节(64位),与Key长度相同。然后对每块进行加密或解密,最后将他们连接在一起便是最终的结果。每一块的数据互不干扰。

CBC模式:也需要将待处理的数据分块,但是每一块数据在加密或者解密之前都要与前一块的结果做一次异或操作,因此该模式需要定义一个特殊的8字节Key,用于和第一块数据做异或操作。这个特殊的Key就是通常说的初始化向量。在代码中书写时需要配置iv参数,注意iv参数是对应CBC模式的。这样一来,每一块数据都是有联系的,这是与ECB模式不同的一点。

2. 再来说说3DES操作,也就是进行3次DES操作。设Ek()和Dk()分别代表DES算法的加密和解密过程,k代表DES算法使用的密钥,P代表明文,C代表密文,则3DES算法的过程可表示为:

C = Ek3(Dk2(Ek1(P)))

P = Dk1(Ek2(Dk3(C)))

3DES同样有ECB跟CBC模式,同上面讲的一样。这里需要注意一下Key的长度,应该是24位。比如我们已知的Key是16位的,那么我们需要将其分为2段,每一段都是8位,则k1=左8位, k2=右8位,k3=左8位,也就是  k1=k3,但不能k1=k2=k3,因为如果每段使用的Key都相同,就回到DES算法了。

iOS 3DES加密解密(一行代码搞定)

iOS 3DES加密解密(一行代码搞定)  3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密...

简单的一行代码实现加密解密

iOS端公钥加密私钥解密、java端公钥加密私钥解密,java端私钥加密公钥解密都容易做到,iOS不能私钥加密公钥解密,只能用于验签。 问题1:iOS端公钥加密的数据用Java端私钥解密。 iOS无论...
  • hbblzjy
  • hbblzjy
  • 2016年06月22日 12:17
  • 1143

iOS一行代码进行RSA、DES 、AES、MD5加密、解密

本文为投稿文章,作者:Flying_Einstein(简书) 加密的Demo,欢迎下载 JAVA端的加密解密,读者可以看我同事的这篇文章:http://www.jianshu.com/p/98569e...

iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

加密的Demo 最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,服务器也会返回数据,服务器是用Java开发的,客户端要同时支持多平台(Android、iOS),在处理iOS的...

iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

加密的Demo,欢迎下载 JAVA端的加密解密,读者可以看我同事的这篇文章:http://www.jianshu.com/p/98569e81cc0b 最近做了一个移动项目,是有服务器和客...

C# 3DES加密解密算法实例代码

C#的3DES加密解密算法实例代码 C#类如下: 复制代码代码如下: using System; using System.Collections.Generic; us...

iPhone中3DES+Base64 加密解密的代码

#import #import "GTMBase64.h" // Open source,base64处理,就两个文件,自己从网上下载下吧 + (NSString*)TripleDES...
  • gckjdev
  • gckjdev
  • 2011年11月30日 22:34
  • 1566

ios学习--IOS 3DES加密解密

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计...

iOS,一行代码进行RSA、DES 、AES加密、解密及MD5加密

更新:MD5加密是单向的,只能加密不能解密(破解除外)。标题可能会引起读者误解,已经改正,感谢Li_Cheng同学的提醒,另外笔者发现Li_Cheng同学有篇MD5加密更为详尽的文章,推荐阅读:iOS...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一行代码实现IOS 3DES加密解密
举报原因:
原因补充:

(最多只允许输入30个字)