最近突然項(xiàng)目突然需要使用DES加密硝训,然后吧响委,又不是+GTMBase64的,網(wǎng)上找了很多的代碼都是DES+GTMBase64的窖梁,而且解密的時候吧赘风,返回是NULL,很是頭大纵刘。找了好久才找到了一段代碼可用邀窃,目前也沒有時間去深入了解,看到網(wǎng)上有很多人都在問這個假哎,所有將其分享一下瞬捕。原文來至https://github.com/SalehAlDhobaie/DES。
使用:
NSString *cont1 = [DEST encryptSting:str1 key:key1 andDesiv:key1];
NSLog(@"加密結(jié)果:%@",cont1);
NSString *cont2 = [DEST decryptWithDESString:str2 key:key2 andiV:key2];
NSLog(@"解密結(jié)果:%@",cont2);
代碼:
*********************************************************************************
#import@interface DEST : NSObject
//DES加密
+(NSString *)encryptSting:(NSString *)sText key:(NSString *)key andDesiv:(NSString *)ivDes;
//DES解密
+(NSString *)decryptWithDESString:(NSString *)sText key:(NSString *)key andiV:(NSString *)iv;
@end
*********************************************************************************
#import "DEST.h"#import@implementation DEST
//DES加密
+(NSString *)encryptSting:(NSString *)sText key:(NSString *)key andDesiv:(NSString *)ivDes
{
if ((sText == nil || sText.length == 0)
|| (sText == nil || sText.length == 0)
|| (ivDes == nil || ivDes.length == 0)) {
return @"";
}
//gb2312 編碼
NSStringEncoding encoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData* encryptData = [sText dataUsingEncoding:encoding];
size_t? dataInLength = [encryptData length];
const void *? dataIn = (const void *)[encryptData bytes];
//? ? CCCryptorStatus ccStatus = nil;
uint8_t *dataOut = NULL; //可以理解位type/typedef 的縮寫(有效的維護(hù)了代碼舵抹,比如:一個人用int肪虎,一個人用long。最好用typedef來定義)
size_t dataOutMoved = 0;
size_t? ? dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);? dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
memset((void *)dataOut, 0x0, dataOutAvailable);//將已開辟內(nèi)存空間buffer的首 1 個字節(jié)的值設(shè)為值 0
const void *iv = (const void *) [ivDes cStringUsingEncoding:NSASCIIStringEncoding];
//CCCrypt函數(shù) 加密/解密
CCCryptorStatus ccStatus = CCCrypt(kCCEncrypt,//? 加密/解密
kCCAlgorithmDES,//? 加密根據(jù)哪個標(biāo)準(zhǔn)(des惧蛹,3des扇救,aes。香嗓。迅腔。。)
kCCOptionPKCS7Padding,//? 選項(xiàng)分組密碼算法(des:對每塊分組加一次密? 3DES:對每塊分組加三個不同的密)
[key UTF8String],? //密鑰? ? 加密和解密的密鑰必須一致
kCCKeySizeDES,//? DES 密鑰的大锌坑椤(kCCKeySizeDES=8)
iv, //? 可選的初始矢量
dataIn, // 數(shù)據(jù)的存儲單元
dataInLength,// 數(shù)據(jù)的大小
(void *)dataOut,// 用于返回?cái)?shù)據(jù)
dataOutAvailable,
&dataOutMoved);
//編碼 base64
NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
Byte *bytes = (Byte *)[data bytes];
//下面是Byte 轉(zhuǎn)換為16進(jìn)制沧烈。
NSString *hexStr=@"";
for(int i=0;i<[data length];i++){
NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16進(jìn)制數(shù)
if([newHexStr length]==1)
hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
else
hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
}
free(dataOut);
return hexStr;
}
//DES解密
+(NSString *)decryptWithDESString:(NSString *)sText key:(NSString *)key andiV:(NSString *)iv
{
if ((sText == nil || sText.length == 0)||
(sText == nil || sText.length == 0)||
(iv == nil || iv.length == 0)) {
return @"";
}
const void *dataIn;
size_t dataInLength;
char *myBuffer = (char *)malloc((int)[sText length] / 2 + 1);
bzero(myBuffer, [sText length] / 2 + 1);
for (int i = 0; i < [sText length] - 1; i += 2) {
unsigned int anInt;
NSString * hexCharStr = [sText substringWithRange:NSMakeRange(i, 2)];
NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr];
[scanner scanHexInt:&anInt];
myBuffer[i / 2] = (char)anInt;
}
NSData *decryptData =[NSData dataWithBytes:myBuffer length:[sText length] / 2 ];//轉(zhuǎn)成utf-8并decode
dataInLength = [decryptData length];
dataIn = [decryptData bytes];
free(myBuffer);
CCCryptorStatus ccStatus = nil;
uint8_t *dataOut = NULL; //可以理解位type/typedef 的縮寫(有效的維護(hù)了代碼,比如:一個人用int饱岸,一個人用long掺出。最好用typedef來定義)
size_t dataOutAvailable = 0; //size_t? 是操作符sizeof返回的結(jié)果類型
size_t dataOutMoved = 0;
dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
memset((void *)dataOut, 0x0, dataOutAvailable);//將已開辟內(nèi)存空間buffer的首 1 個字節(jié)的值設(shè)為值 0
const void *ivDes = (const void *) [iv cStringUsingEncoding:NSASCIIStringEncoding];
//CCCrypt函數(shù) 加密/解密
ccStatus = CCCrypt(kCCDecrypt,//? 加密/解密
kCCAlgorithmDES,//? 加密根據(jù)哪個標(biāo)準(zhǔn)(des,3des苫费,aes汤锨。。百框。闲礼。)
kCCOptionPKCS7Padding,//? 選項(xiàng)分組密碼算法(des:對每塊分組加一次密? 3DES:對每塊分組加三個不同的密)
[key UTF8String],? //密鑰? ? 加密和解密的密鑰必須一致
kCCKeySizeDES,//? DES 密鑰的大小(kCCKeySizeDES=8)
ivDes, //? 可選的初始矢量
dataIn, // 數(shù)據(jù)的存儲單元
dataInLength,// 數(shù)據(jù)的大小
(void *)dataOut,// 用于返回?cái)?shù)據(jù)
dataOutAvailable,
&dataOutMoved);
NSStringEncoding encoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString *result? = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:encoding];
free(dataOut);
return result;
}
@end