iOS加密算法(DES、AES、MD5、SHA512、Base64)

在iOS的項目中,我們經常會用到加密技術,比如說在登錄的時候,我們會先把密碼用MD5加密再傳輸給服務器或者直接對所有的參數進行加密再Post到服務器。

常用加密算法:

  1. DES:Data Encryption Standard,即數據加密算法,它是IBM公司于1975年研究成功并公開發表的。
  2. AES:高級加密標準,這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。高級加密標準已然成為對稱密鑰加密中最流行的算法之一。
  3. MD5:Message-Digest Algorithm 5(信息-摘要算法5),用于確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實現。這個應該是聽到最多的算法,據說是已經被破解了。但是我覺得破解這個應該也要很久吧!
  4. Base64:Base64是網絡上最常見的用于傳輸8Bit字節代碼的編碼方式之一。Base64編碼可用于在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就采用了Base64來將一個較長的唯一 標識符(一般為128-bit的UUID)編碼為一個字符串,用作HTTP表單和HTTP GET URL中的參數。在其應用程序中,也常常需要把二進制數據編碼為適合放在URL(包括隱藏表單域)中的形式。此時,采用Base64編碼具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。

算法實現

介紹完這些算法,接下來我們就來看看它們再iOS下面的具體實現吧!
我再GitHub上做了一個小Demo,可以直接下載,放到項目中直接使用
鏈接地址:https://github.com/yongca887/XTSecurity/

一、DES加密算法
廢話不多說了,直接上代碼:

+ (NSString *)encrypt:(NSString *)sText encryptOrDecrypt:(CCOperation)encryptOperation key:(NSString *)key
{
const void *dataIn;
size_t dataInLength;
if (encryptOperation == kCCDecrypt)//傳遞過來的是decrypt 解碼
{
//解碼 base64
NSData *decryptData = [GTMBase64 decodeData:[sText dataUsingEncoding:NSUTF8StringEncoding]];//轉成utf-8并decode
dataInLength = [decryptData length];
dataIn = [decryptData bytes];
}
else //encrypt
{
NSData* encryptData = [sText dataUsingEncoding:NSUTF8StringEncoding];
dataInLength = [encryptData length];
dataIn = (const void *)[encryptData bytes];
}
/*
DES加密 :用CCCrypt函數加密一下,然后用base64編碼下,傳過去
DES解密 :把收到的數據根據base64,decode一下,然后再用CCCrypt函數解密,得到原本的數據
*/
CCCryptorStatus ccStatus;
uint8_t *dataOut = NULL; //可以理解位type/typedef 的縮寫(有效的維護了代碼,比如:一個人用int,一個人用long。最好用typedef來定義)
size_t dataOutAvailable = 0; //size_t 是操作符sizeof返回的結果類型
size_t dataOutMoved = 0;
dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES – 1);
dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
memset((void *)dataOut, 0x0, dataOutAvailable);//將已開辟內存空間buffer的首 1 個字節的值設為值 0
NSString *initIv = @”12345678″;
const void *vkey = (const void *) [key UTF8String];
const void *iv = (const void *) [initIv UTF8String];
//CCCrypt函數 加密/解密
ccStatus = CCCrypt(encryptOperation,// 加密/解密
kCCAlgorithmDES,// 加密根據哪個標準(des,3des,aes。。。。)
kCCOptionPKCS7Padding,// 選項分組密碼算法(des:對每塊分組加一次密 3DES:對每塊分組加三個不同的密)
vkey, //密鑰 加密和解密的密鑰必須一致
kCCKeySizeDES,// DES 密鑰的大小(kCCKeySizeDES=8)
iv, // 可選的初始矢量
dataIn, // 數據的存儲單元
dataInLength,// 數據的大小
(void *)dataOut,// 用于返回數據
dataOutAvailable,
&dataOutMoved);
NSString *result = nil;
if (encryptOperation == kCCDecrypt)//encryptOperation==1 解碼
{
//得到解密出來的data數據,改變為utf-8的字符串
result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding];
}
else //encryptOperation==0 (加密過程中,把加好密的數據轉成base64的)
{
//編碼 base64
NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
result = [GTMBase64 stringByEncodingData:data];
}
return result;
}

二、AES加密算法

+(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;
}

三、MD5數字摘要。

#pragma mark – MD5 加密
//String轉化為md5加密String
+ (NSString *)md5:(NSString *)str
{
const char *cStr = [str UTF8String];
unsigned char result[16];
CC_MD5(cStr, strlen(cStr), result); // This is the md5 call
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]
];
}

四、SHA512算法

//SHA512加密
+ (NSString) getSHA512String:(NSString)s
{
const char cstr = [s cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:s.length];
uint8_t digest[CC_SHA512_DIGEST_LENGTH];
CC_SHA512(data.bytes, data.length, digest);
NSMutableString output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++)
[output appendFormat:@”%02x”, digest[i]];
return output;
}

五、Base64編碼
首先下載GTMBase64文件,在工程中加入三個文件
GTMDefines.h
GTMBase64.h
GTMBase64.m
你可以在這里找到這三個文件
GTMBase64,
你也可以在下面的demo里面找到這3個文件,demo會完整實現文章里面常用的3種編碼方法。
我在此稍微封裝一下:
.h文件

#pragma mark – base64
+ (NSString)encodeBase64String:(NSString *)input;
+ (NSString)decodeBase64String:(NSString )input;
+ (NSString)encodeBase64Data:(NSData )data;
+ (NSString)decodeBase64Data:(NSData )data;
.m文件
#pragma mark – base64
+ (NSString)encodeBase64String:(NSString * )input {
NSData data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
data = [GTMBase64 encodeData:data];
NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
return base64String;
}
+ (NSString)decodeBase64String:(NSString * )input {
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
data = [GTMBase64 decodeData:data];
NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
return base64String;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容