日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 【iOS】MD5(加密)/AES/Base64加密和解密

【iOS】MD5(加密)/AES/Base64加密和解密

來源:程序員人生   發布時間:2016-07-05 14:57:56 閱讀次數:3167次

MD5

  • 甚么是MD5

Message Digest Algorithm MD5(中文名為消息摘要算法第5版)為計算機安全領域廣泛使用的1種散列函數,用以提供消息的完全性保護。MD5的典型利用是對1段信息(Message)產生信息摘要(Message-Digest),以避免被篡改。

  • MD5的特點

1、緊縮性:任意長度的數據,算出的MD5值長度都是固定的。
2、容易計算:從原數據計算出MD5值很容易。
3、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區分。
4、強抗碰撞:已知原數據和其MD5值,想找到1個具有相同MD5值的數據(即捏造數據)是非常困難的。
MD5的作用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被”緊縮”成1種保密的格式(就是把1個任意長度的字節串變換成1定長的106進制數字串)。
比如之前在下載windows系統的時候,很多網站都會公布1個MD值,這個是這個軟件對應的MD5值,當系統被修改了,哪怕是1個字節,以后生成的MD5值都會有比較大的差異。
詳細的介紹,可以1步百度百科–MD5
MD5的實現
首先需要包括頭文件:

#import <CommonCrypto/CommonDigest.h>
/** * MD5加密 * * @param string 需要加密的字符串 * * @return 返回加密后的結果 */ + (NSString *)md5:(NSString *)string{ // OC 字符串轉換位C字符串 const char *cStr = [string UTF8String]; // 16位加密 unsigned char digest[CC_MD5_DIGEST_LENGTH]; // 1: 需要加密的C字符串 // 2: 加密的字符串的長度 // 3: 加密長度 CC_MD5(cStr, (CC_LONG)strlen(cStr), digest); NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; // 32位 for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { [result appendFormat:@"%02X", digest[i]]; } // 返回1個32位長度的加密后的字符串 return result; }

關于MD5的加密和解密也能夠在這個網站上測試:http://www.cmd5.com/

AES

  • 甚么是AES
    高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法。AES是1個對稱分組密碼算法,旨在取代DES成為廣泛使用的標準。根據使用的密碼長度,AES最多見的有3種方案,用以適應不同的場景要求,分別是AES⑴28、AES⑴92和AES⑵56。— 《iOS安全之路--AES》
    AES加密數據塊分組長度必須為128比特,密鑰長度可以是128比特、192比特、256比特中的任意1個(如果數據塊及密鑰長度不足時,會補齊)。AES加密有很多輪的重復和變換。大致步驟以下:1、密鑰擴大(KeyExpansion),2、初始輪(Initial Round),3、重復輪(Rounds),每輪又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、終究輪(Final Round),終究輪沒有MixColumns。

  • AES加密的實現

AES 加密的實現我們需要新建1個NSData的Category類,
然后包括兩個頭文件:

#import <CommonCrypto/CommonDigest.h> #import <CommonCrypto/CommonCryptor.h>

AES 加密時,我們需要自己定義1個16位的字符串,作為key。

// 自定義1個KEY #define AES_KEY @"0123456789ABCDEF"
/** * 對data加密 * * @param data 需要加密的數據 * * @return 加密后的數據 */ +(NSData *)aes256EncryptWithData:(NSData *)data{ if (!AES_KEY || AES_KEY.length !=16) { NSLog(@"key length must be 16"); return nil; } char keyPtr[kCCKeySizeAES256+1]; bzero(keyPtr, sizeof(keyPtr)); [AES_KEY getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = data.length; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, data.bytes, dataLength, buffer, bufferSize, &numBytesEncrypted); if (cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; } free(buffer); return nil; } /** * 對data解密 * * @param data 需要解密的數據 * * @return 解密后的數據 */ +(NSData *)aes256DecryptWithData:(NSData *)data{ if (!AES_KEY || AES_KEY.length !=16) { NSLog(@"key length must be 16"); return nil; } char keyPtr[kCCKeySizeAES256+1]; bzero(keyPtr, sizeof(keyPtr)); [AES_KEY getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = data.length; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesDecrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, data.bytes, dataLength, buffer, bufferSize, &numBytesDecrypted); if (cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; } free(buffer); return nil; } /** * 對字符串加密 * * @param string 需要加密的字符串 * * @return 加密后的數據 */ +(NSData*)aes256EncryptWithString:(NSString*)string{ NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; NSData *encryptedData = [self aes256EncryptWithData:data]; return encryptedData; } /** * 解密 * * @param data 需要解密的數據 * * @return 解密后的字符串 */ +(NSString*)aes256DecryptStringWithData:(NSData *)data{ NSData *decryData = [self aes256DecryptWithData:data]; NSString *string = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding]; return string; }

兩種加密和解密,1種是字符串的1種是數據流的。

Base64

  • 甚么是base64

Base64是網絡上最多見的用于傳輸8Bit字節代碼的編碼方式之1,大家可以查看RFC2045~RFC2049,上面有MIME的詳細規范。Base64編碼可用于在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就采取了Base64來將1個較長的唯1標識符(1般為128-bit的UUID)編碼為1個字符串,用作HTTP表單和HTTP GET URL中的參數。在其他利用程序中,也常常需要把2進制數據編碼為合適放在URL(包括隱藏表單域)中的情勢。此時,采取Base64編碼具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。

  • base64原理

轉碼進程例子:
3*8=4*6
內存1個字符占8位
轉前: s 1 3
先轉成ascii:對應 115 49 51
2進制: 01110011 00110001 00110011
6個1組(4組) 011100110011000100110011
然后才有后面的 011100 110011 000100 110011
然后計算機是8位8位的存數 6不夠,自動就補兩個高位0了
所有有了 高位補0
科學計算器輸入 00011100 00110011 00000100 00110011
得到 28 51 4 51

  • base64的實現

base64和AES1樣,需要1個NSData的Category類,但是不需要包括那兩個頭文件。

base64需要自己定義1個64位長度的編碼表。

static const char base64EncodingTable[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

base64還需要1個解碼表。

static const short base64DecodingTable[256] = { -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -2, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, -2, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, ⑵, ⑵, ⑵, ⑵, ⑵, ⑵, -2, 0, 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, ⑵, ⑵, ⑵, ⑵, ⑵, -2, 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, ⑵, ⑵, ⑵, ⑵, ⑵, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2 };
/** * 數據流加密 * * @param data 需要加密的數據流 * * @return 加密后的字符串 */ +(NSString *)base64EncodedWithData:(NSData *)data{ NSUInteger length = data.length; if (length == 0) return @""; NSUInteger out_length = ((length + 2) / 3) * 4; uint8_t *output = malloc(((out_length + 2) / 3) * 4); if (output == NULL) return nil; const char *input = data.bytes; NSInteger i, value; for (i = 0; i < length; i += 3) { value = 0; for (NSInteger j = i; j < i + 3; j++) { value <<= 8; if (j < length) { value |= (0xFF & input[j]); } } NSInteger index = (i / 3) * 4; output[index + 0] = base64EncodingTable[(value >> 18) & 0x3F]; output[index + 1] = base64EncodingTable[(value >> 12) & 0x3F]; output[index + 2] = ((i + 1) < length) ? base64EncodingTable[(value >> 6) & 0x3F] : '='; output[index + 3] = ((i + 2) < length) ? base64EncodingTable[(value >> 0) & 0x3F] : '='; } NSString *base64 = [[NSString alloc] initWithBytes:output length:out_length encoding:NSASCIIStringEncoding]; free(output); return base64; } /** * 字符串解密 * * @param base64EncodedString 需要解密的字符串 * * @return 解密后的數據流 */ +(NSData *)base64DecryptWithString:(NSString *)base64EncodedString{ NSInteger length = base64EncodedString.length; const char *string = [base64EncodedString cStringUsingEncoding:NSASCIIStringEncoding]; if (string == NULL) return nil; while (length > 0 && string[length - 1] == '=') length--; NSInteger outputLength = length * 3 / 4; NSMutableData *data = [NSMutableData dataWithLength:outputLength]; if (data == nil) return nil; if (length == 0) return data; uint8_t *output = data.mutableBytes; NSInteger inputPoint = 0; NSInteger outputPoint = 0; while (inputPoint < length) { char i0 = string[inputPoint++]; char i1 = string[inputPoint++]; char i2 = inputPoint < length ? string[inputPoint++] : 'A'; char i3 = inputPoint < length ? string[inputPoint++] : 'A'; output[outputPoint++] = (base64DecodingTable[i0] << 2) | (base64DecodingTable[i1] >> 4); if (outputPoint < outputLength) { output[outputPoint++] = ((base64DecodingTable[i1] & 0xf) << 4) | (base64DecodingTable[i2] >> 2); } if (outputPoint < outputLength) { output[outputPoint++] = ((base64DecodingTable[i2] & 0x3) << 6) | base64DecodingTable[i3]; } } return data; } /** * 字符串做加密 * * @param str 需要加密的字符串 * * @return 加密后的字符串 */ +(NSString *)base64EncodedWithString:(NSString *)str{ NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding]; return [self base64EncodedWithData:data]; } /** * 對字符串解密 * * @param base64EncodedString 需要解密的字符串 * * @return 解密后的字符串 */ + (NSString *)base64DecryptString:(NSString *)base64EncodedString{ NSData *data = [self base64DecryptWithString:base64EncodedString]; return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; }

加密和解密也是對應有字符串和NSData兩種方法。

總結

從代碼上看,這3種加密方式還是有點難度的,但是網上1堆代碼,我們需要知道怎樣使用。在實際項目中的使用,我使用的兩點就是,和后臺交互的時候,對接口中的參數加密就是接口地址“?”后面的數據,還有1點就是對服務器返回的json數據的加密。1般是前臺對接口參數加密后臺解密,后臺對接口返回參數加密,前臺對返回的數據解密。
代碼下載地址:加密+解密。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日韩电影一区二区三区 | av片在线看 | 成人激情视频网站 | 成人福利电影 | 中文天堂视频在线 | 九色av| 精品久久久久久久久久中文字幕 | 亚洲一区网 | 一级视频在线观看 | 99在线视频观看 | 成人免费观看在线 | 欧美 日韩 亚洲 国产 | 成人高清在线视频 | 国产激情在线观看视频 | 强公把我次次高潮hd | 国产成人精品午夜 | 亚洲乱码国产乱码精品精98午夜 | 日韩美女乱淫aaa高清视频 | av首页在线 | 深夜成人av | 欧美特黄一级 | 日韩精品一区二区三区免费视频 | 成人精品一区二区三区校园激情 | 黄色av网站在线免费观看 | 欧美日韩一二三 | www.伊人.com| 99爱免费视频 | 国产香蕉视频在线播放 | 美女视频黄 | 亚洲国产综合网 | 国产区在线看 | 久久久蜜臀国产一区二区 | 5999在线视频免费观看 | 精品电影一区 | 久久久久久亚洲精品视频 | 金瓶狂野欧美性猛交xxxx | 欧美日韩电影一区 | 最新国产精品精品视频 | 一级黄色毛片 | 日韩精品视频一区二区三区 | 国产精品久久久久久久久久新婚 |