IOS開發(fā)各種加解密,編解碼

1.AES加解密芒划,給NSData添加類別 NSData+AES

添加頭文件#import

- (NSData *)AES256EncryptWithKey:(NSString *)key {//加密

char keyPtr[kCCKeySizeAES256+1];

bzero(keyPtr, sizeof(keyPtr));

[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,

kCCOptionPKCS7Padding | kCCOptionECBMode,

keyPtr, kCCBlockSizeAES128,

NULL,

[self bytes], dataLength,

buffer, bufferSize,

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

}

free(buffer);

return nil;

}

- (NSData *)AES256DecryptWithKey:(NSString *)key {//解密

char keyPtr[kCCKeySizeAES256+1];

bzero(keyPtr, sizeof(keyPtr));

[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesDecrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,

kCCOptionPKCS7Padding | kCCOptionECBMode,

keyPtr, kCCBlockSizeAES128,

NULL,

[self bytes], dataLength,

buffer, bufferSize,

&numBytesDecrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

}

free(buffer);

return nil;

}

2.base64編解碼參考

GTMDefines.h

GTMBase64.h

GTMBase64.m

3.各種加密冬竟,數字摘要欧穴。給NSString添加類別NSString+Encrypto

(1).MD5數字摘要

- (NSString *)md5 {

const char *cStr = [self UTF8String];

unsigned char result[16];

CC_MD5( cStr, strlen(cStr), result );

return [NSString stringWithFormat:@%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X,

result[0], result[1], result[2], result[3],

result[4], result[5], result[6], result[7],

result[8], result[9], result[10], result[11],

result[12], result[13], result[14], result[15]

];

}

(2)SHA1摘要

- (NSString*) sha1

{

const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSData dataWithBytes:cstr length:self.length];

uint8_t digest[CC_SHA1_DIGEST_LENGTH];

CC_SHA1(data.bytes, data.length, digest);

NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)

[output appendFormat:@%02x, digest[i]];

return output;

}

(3)base64編碼

- (NSString *) base64

{

NSData * data = [self dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

data = [GTMBase64 encodeData:data];

NSString * output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

return output;

}

(4)SHA1與base64結合

- (NSString *) sha1_base64

{

const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSData dataWithBytes:cstr length:self.length];

uint8_t digest[CC_SHA1_DIGEST_LENGTH];

CC_SHA1(data.bytes, data.length, digest);

NSData * base64 = [[NSData alloc]initWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];

base64 = [GTMBase64 encodeData:base64];

NSString * output = [[NSString alloc] initWithData:base64 encoding:NSUTF8StringEncoding];

return output;

}

(5)MD5與base64結合

- (NSString *) md5_base64

{

const char *cStr = [self UTF8String];

unsigned char digest[CC_MD5_DIGEST_LENGTH];

CC_MD5( cStr, strlen(cStr), digest );

NSData * base64 = [[NSData alloc]initWithBytes:digest length:CC_MD5_DIGEST_LENGTH];

base64 = [GTMBase64 encodeData:base64];

NSString * output = [[NSString alloc] initWithData:base64 encoding:NSUTF8StringEncoding];

return output;

}

4.3DES是一種對稱的加密方式,因為用的同一個密鑰诱咏。

對于加解密的安全性什么大家可以google氨淌,baidu自己找資料參考遣耍。

我也不過是簡單的說一下通信加密中的一種可實現方案而已繁成。

同樣的3DES加密基本也都是統一的凄贩,系統也直接提供了API,基本代碼如下

//3des加解密

+ (NSString*)TripleDES:(NSString*)plainText encryptOrDecrypt:(CCOperation)encryptOrDecrypt

{

const void *vplainText;

size_t plainTextBufferSize;

if (encryptOrDecrypt == kCCDecrypt)//解密

{

NSData *EncryptData = [GTMBase64 decodeData:[plainText dataUsingEncoding:NSUTF8StringEncoding]];

plainTextBufferSize = [EncryptData length];

vplainText = [EncryptData bytes];

}

else //加密

{

NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];

plainTextBufferSize = [data length];

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);

// memset((void *) iv, 0x0, (size_t) sizeof(iv));

const void *vkey = (const void *) [DESKEY UTF8String];

// NSString *initVec = @init Vec;

//const void *vinitVec = (const void *) [initVec UTF8String];

// Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};

ccStatus = CCCrypt(encryptOrDecrypt,

kCCAlgorithm3DES,

kCCOptionPKCS7Padding | kCCOptionECBMode,

vkey,

kCCKeySize3DES,

nil,

vplainText,

plainTextBufferSize,

(void *)bufferPtr,

bufferPtrSize,

&movedBytes);

//if (ccStatus == kCCSuccess) NSLog(@SUCCESS);

/*else if (ccStatus == kCC ParamError) return @PARAM ERROR;

else if (ccStatus == kCCBufferTooSmall) return @BUFFER TOO SMALL;

else if (ccStatus == kCCMemoryFailure) return @MEMORY FAILURE;

else if (ccStatus == kCCAlignmentError) return @ALIGNMENT;

else if (ccStatus == kCCDecodeError) return @DECODE ERROR;

else if (ccStatus == kCCUnimplemented) return @UNIMPLEMENTED; */

NSString *result;

if (encryptOrDecrypt == kCCDecrypt)

{

result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr

length:(NSUInteger)movedBytes]

encoding:NSUTF8StringEncoding]

autorelease];

}

else

{

NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];

result = [GTMBase64 stringByEncodingData:myData];

}

return result;

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末苟鸯,一起剝皮案震驚了整個濱河市同蜻,隨后出現的幾起案子,更是在濱河造成了極大的恐慌早处,老刑警劉巖湾蔓,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異砌梆,居然都是意外死亡默责,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門咸包,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桃序,“玉大人,你說我怎么就攤上這事烂瘫∶叫埽” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵坟比,是天一觀的道長芦鳍。 經常有香客問我,道長葛账,這世上最難降的妖魔是什么柠衅? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮注竿,結果婚禮上茄茁,老公的妹妹穿的比我還像新娘。我一直安慰自己巩割,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布付燥。 她就那樣靜靜地躺著宣谈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪键科。 梳的紋絲不亂的頭發(fā)上闻丑,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天漩怎,我揣著相機與錄音,去河邊找鬼嗦嗡。 笑死勋锤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的侥祭。 我是一名探鬼主播叁执,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼矮冬!你這毒婦竟也來了谈宛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤胎署,失蹤者是張志新(化名)和其女友劉穎吆录,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體琼牧,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡恢筝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了巨坊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撬槽。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抱究,靈堂內的尸體忽然破棺而出恢氯,到底是詐尸還是另有隱情,我是刑警寧澤鼓寺,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布勋拟,位于F島的核電站,受9級特大地震影響妈候,放射性物質發(fā)生泄漏敢靡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一苦银、第九天 我趴在偏房一處隱蔽的房頂上張望啸胧。 院中可真熱鬧,春花似錦幔虏、人聲如沸纺念。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陷谱。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烟逊,已是汗流浹背渣窜。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪躯,地道東北人乔宿。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像访雪,于是被迫代替她去往敵國和親详瑞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容