服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - 一行代码实现IOS 3DES加密解密

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

2020-12-31 18:17鸿鹄当高远 IOS

这篇文章主要介绍了一行代码实现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更为安全。

一行代码实现IOS 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);

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

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算法了。

延伸 · 阅读

精彩推荐
  • IOSiOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)

    iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和

    这篇文章主要介绍了iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)的相关资料,需要的朋友可以参考下...

    CodingFire13652021-02-26
  • IOSiOS实现控制屏幕常亮不变暗的方法示例

    iOS实现控制屏幕常亮不变暗的方法示例

    最近在工作中遇到了要将iOS屏幕保持常亮的需求,所以下面这篇文章主要给大家介绍了关于利用iOS如何实现控制屏幕常亮不变暗的方法,文中给出了详细的...

    随风13332021-04-02
  • IOSiOS自定义UICollectionViewFlowLayout实现图片浏览效果

    iOS自定义UICollectionViewFlowLayout实现图片浏览效果

    这篇文章主要介绍了iOS自定义UICollectionViewFlowLayout实现图片浏览效果的相关资料,需要的朋友可以参考下...

    jiangamh8882021-01-11
  • IOS详解iOS中多个网络请求的同步问题总结

    详解iOS中多个网络请求的同步问题总结

    这篇文章主要介绍了详解iOS中多个网络请求的同步问题总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    liang199111302021-03-15
  • IOSiOS中MD5加密算法的介绍和使用

    iOS中MD5加密算法的介绍和使用

    MD5加密是最常用的加密方法之一,是从一段字符串中通过相应特征生成一段32位的数字字母混合码。对输入信息生成唯一的128位散列值(32个字符)。这篇文...

    LYSNote5432021-02-04
  • IOSiOS开发技巧之状态栏字体颜色的设置方法

    iOS开发技巧之状态栏字体颜色的设置方法

    有时候我们需要根据不同的背景修改状态栏字体的颜色,下面这篇文章主要给大家介绍了关于iOS开发技巧之状态栏字体颜色的设置方法,文中通过示例代码...

    梦想家-mxj8922021-05-10
  • IOSiOS中UILabel实现长按复制功能实例代码

    iOS中UILabel实现长按复制功能实例代码

    在iOS开发过程中,有时候会用到UILabel展示的内容,那么就设计到点击UILabel复制它上面展示的内容的功能,也就是Label长按复制功能,下面这篇文章主要给大...

    devilx12792021-04-02
  • IOSiOS开发之视图切换

    iOS开发之视图切换

    在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单。在iOS开发中常用的视图切换有三种,今天我们将...

    执着丶执念5272021-01-16