引言
在日常设计及开发中,尤其是金融行业,涉及到用户身份敏感信息,包括存储在本地的一些敏感信息包括id,用户名,密码等,在UAT安全测试的时候,通过一定的手段(iPhone越狱),可以拿到存储在本地的信息,为确保数据传输和数据存储的安全,可通过特定的算法,将数据明文加密成复杂的密文,即便是拿到存储在本地的数据,也是一段密文;
1.常用加密方式
- 1.1 单向加密:
通过对数据进行摘要计算生成密文,密文不可逆推还原。
算法代表:Base64,MD5,SHA;
- 1.2 双向加密:
与单向加密相反,可以把密文逆推还原成明文,双向加密又分为对称加密和非对称加密。
- 1.3 对称加密:
指数据使用者必须拥有相同的密钥才可以进行加密解密,就像彼此约定的一串暗号。
算法代表:DES,3DES,AES,IDEA,RC4,RC5;
- 1.4 非对称加密:
相对对称加密而言,无需拥有同一组密钥,非对称加密是一种“信息公开的密钥交换协议”。非对称加密需要公开密钥和私有密钥两组密钥,公开密钥和私有密钥是配对起来的,也就是说使用公开密钥进行数据加密,只有对应的私有密钥才能解密。这两个密钥是数学相关,用某用户密钥加密后的密文,只能使用该用户的加密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个密钥性质。这里把公开的密钥为公钥,不公开的密钥为私钥。
算法代表:RSA,DSA。
2. 这里介绍一下3DES加密
要了解3DES加密,首先得知道,DES加密;
2.1 什么是DES加密
2.1.1 DES概念
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。
2.1.2 DES基本原则
DES设计中使用了分组密码设计的两个原则:
- 混淆(confusion);
混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。
- 扩散(diffusion).
扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。
- 目的
抗击敌手对密码系统的统计分析。
3. 3DES介绍
3.1 3DES概念
3DES(即Triple DES)是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。
3DES是三重数据加密,且可以逆推的一种算法方案。但由于3DES的算法是公开的,所以算法本身没有密钥可言,主要依靠唯一密钥来确保数据加解密的安全。到目前为止,仍没有人能破解3DES。
注意:
3DES密钥的长度必须是8的倍数,可取24位或32位;
加密结果的byte数组转换为字符串,一般采用两种方式:
- Base64处理或;
- 十六进制处理。
3.2 采用两个密钥进行三重加密的好处有:
- 两个密钥合起来有效密钥长度有112bit,可以满足商业应用的需要,若采用总长为168bit的三个密钥,会产生不必要的开销。
- 加密时采用加密-解密-加密,而不是加密-加密-加密的形式,这样有效的实现了与现有DES系统的向后兼容问题。因为当K1=K2时,三重DES的效果就和原来的DES一样,有助于逐渐推广三重DES。
- 三重DES具有足够的安全性,目前还没有关于攻破3DES的报道。
3.3 3DES加密前后结果对比
1
2
3
4
2017-08-10 13:03:39.970 加密解密[73385:4469340] 加密前:文档虐我千百遍,我待文档如初恋
2017-08-10 13:03:39.971 加密解密[73385:4469340] 加密后:oXvL7VLlE3mMHlo88z2zygN2g63c4q+VI8+QVo4m4+LhZvFzRtKetut6jd+u97rkv0qZw4rQZa6LxD5uP9rMpg==
2017-08-10 13:03:39.972 加密解密[73385:4469340] 解密后:文档虐我千百遍,我待文档如初恋
Objective-C 部分代码实现:
具体Demo访问:待上传
1
2
3
4
//加密算法,请保证密钥长度是8,否则后果自负
+ (NSString *)decode3Des:(NSString *)input key1:(NSString *)key1 key2:(NSString *)key2 key3:(NSString *)key3;
+ (NSString *)encode3Des:(NSString *)input key1:(NSString *)key1 key2:(NSString *)key2 key3:(NSString *)key3;
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
+ (NSString *)decode3Des:(NSString *)input key1:(NSString *)key1 key2:(NSString *)key2 key3:(NSString *)key3
{
if ([key1 length] != 8) {
key1 = @"hundsun1";
}
if ([key2 length] != 8) {
key2 = @"hundsun1";
}
if ([key3 length] != 8) {
key3 = @"hundsun1";
}
const char * cText = [input UTF8String];
const char * cKey1 = [key1 UTF8String];
const char * cKey2 = [key2 UTF8String];
const char * cKey3 = [key3 UTF8String];
if(cText==NULL)
return @"";
if(strlen(cText) == 0)
return input;
NSData * data = [Base64 Base64DecodeWithChars:cText];
cText = data.bytes;
if(cText == NULL)
return input;
int outLength = [data length];
//
char* srcbt1 = decryptEncode(cText,cKey3,&outLength);
if(srcbt1 == NULL)
return input;
char* srcbt2 = decryptEncode(srcbt1,cKey2,&outLength);
free(srcbt1);
if(srcbt2 == NULL)
return input;
char* srcbt3 = decryptEncode(srcbt2,cKey1,&outLength);
free(srcbt2);
if(srcbt3 == NULL)
return input;
srcbt3[outLength] = '\0';
NSString * baseStr = [[NSString alloc] initWithBytesNoCopy:srcbt3 length:outLength encoding:NSUTF8StringEncoding freeWhenDone:YES];
return [baseStr autorelease];
}