-
3DES(或称为Triple DES)是DES加密算法的一种模式、是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块(先将数据分成固定长度的小数据块,之后进行加密)应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。简单的理解就是对DES加密三次,通过增加DES的密钥长度来避免暴力破解。
-
iOS 7后苹果增加了 CCCrypt函数不需要引入第三方,直接引入 #import <CommonCrypto/CommonCryptor.h>就可以使用3DES加密。
-
使用加密我们主要关注加密模式和填充方式,至于密码和偏移量一般后台会给。下文使用的是3DES算法加密,CBC加密模式和PKCS5Padding填充方式。
//密匙 key
#define gkey @"loprdkldloprdkldloprdkld"
//偏移量
#define gIv @“12345678"
#import <CommonCrypto/CommonCryptor.h>
//十六进制
+ (NSString *)doEncryptHex:(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加密算法
kCCOptionPKCS7Padding, //设置填充模式
vkey, //key 此处key的长度 和下面参数指定的长度要相同
kCCKeySize3DES,//key的长度为24位,所以 vkey必须是24位长度
vinitVec, //偏移量,这里不用,设置为nil;不用的话,必须为nil,不可以为@“” ECB模式不用设置偏移量
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
NSMutableString *hexString = [[NSMutableString alloc] init];
if (ccStatus == kCCSuccess) {
NSData *myData = [NSData dataWithBytes:(const char *)bufferPtr length:(NSUInteger)movedBytes];
// NSString *result = [GTMBase64 stringByEncodingData:myData];//或者输出为base64
NSUInteger len = [myData length];
char * chars = (char *)[myData bytes];
for(NSUInteger i = 0; i < len; i++ ){
[hexString appendString:[NSString stringWithFormat:@"%0.2hhx", chars[i]]];
}
}
return hexString;
}
CCCrypt函数参数解析
-
第一个参数(kCCEncrypt)告诉程序是加密还是解密
-
第二个参数(kCCAlgorithm3DES)告诉程序使用的是3DES加密算法。
-
第三个参数设置的是填充模式,其中kCCOptionPKCS7Padding对应于CBC使用PKCS7Padding的填充模式进行加密,kCCOptionPKCS7Padding | kCCOptionECBMode表示运用了ECB加密模式。
-
第四个参数(vkey)秘钥
-
第五个参数(kCCKeySize3DES)指定秘钥的长度,这个值和第二个加密方式对应的kCCAlgorithm3DES对应的就是24位的kCCKeySize3DES。如果是kCCAlgorithmDES则对应8位的kCCKeySizeDES,以此类推。可以直接点进函数看看。
-
第六个设置偏移量
-
第七个是要加密的值
-
第八个是要加密的值长度
-
在线加密解密测试网站 http://tool.chacuo.net/crypt3des/
网友评论