MD5算法和DES算法是常見的兩種加密算法。算法
MD5:MD5是一種不可逆的加密算法,按個人理解,所謂不可逆,就是不能解密,那麼它有什麼用的,它的用處大了,大多數的登陸功能都會使用到這種算法。後面根據個人項目經驗來介紹。服務器
DES:一種使用密鑰加密的塊算法,因此,使用它加密時,須要一個密鑰,加上一些設置和你須要加密的文段。app
在IOS中,使用這兩種加密算法很是簡單,系統的<CommonCrypto/CommonCrypto.h>庫給咱們提供的邊界的接口。在不少移動項目中,安卓平臺和IOS平臺的後臺服務是統一的,好比一個登陸功能是這樣的流程:加密
一、客戶端向服務端請求密鑰,請求的參數是雙方約定好的一個MD5加密的字符串。咱們能夠經過下面的進行第一步加密:spa
- (NSString *)MD5Digest { //要進行UTF8的轉碼 const char* input = [self UTF8String]; unsigned char result[CC_MD5_DIGEST_LENGTH]; CC_MD5(input, (CC_LONG)strlen(input), result); NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { [digest appendFormat:@"%02x", result[i]]; } return digest; }
經過這樣的方法,咱們能夠很容易的獲得一串MD5加密字符串,可是必定要和後臺約定好,MD5加密的位數是16位仍是32位,用上述方法加密出來的時32位,固然他們之間是有聯繫的,經過下面的方法能夠將其轉成16爲:code
+(NSString *)trransFromMD532ToMD516:(NSString *)MD532{ NSString * string; for (int i=0; i<24; i++) { string=[MD532 substringWithRange:NSMakeRange(8, 16)]; } return string; }
還有一點須要注意,加密後的大小寫也要對應。orm
二、服務端將獲得的MD5串和以約定好的MD5串進行對比,若是一致,能夠放行,返回密鑰。接口
三、客戶端取到密鑰,將密鑰再進行一次MD5加密,而後經過DES將要傳送的數據加密發給服務器。ip
這一步相當重要,咱們先看DES的加密代碼ci
+(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key andiv:(NSString *)iv { //這個iv 是DES加密的初始化向量,能夠用和密鑰同樣的MD5字符 NSData * date = [iv dataUsingEncoding:NSUTF8StringEncoding]; NSString *ciphertext = nil; NSUInteger dataLength = [clearText length]; NSData *textData = [clearText dataUsingEncoding:NSUTF8StringEncoding]; unsigned char buffer[1024]; memset(buffer, 0, sizeof(char)); size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,//加密模式 kCCDecrypt 表明解密 kCCAlgorithmDES,//加密方式 kCCOptionPKCS7Padding,//填充算法 [key UTF8String], //密鑰字符串 kCCKeySizeDES,//加密位數 [date bytes],//初始化向量 [textData bytes] , dataLength, buffer, 1024, &numBytesEncrypted); if (cryptStatus == kCCSuccess) { NSLog(@"DES加密成功"); NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted]; Byte* bb = (Byte*)[data bytes]; ciphertext = [Base64 parseByteArray2HexString:bb]; }else{ NSLog(@"DES加密失敗"); } return ciphertext; }
幾點注意:
(1)加密方式,IOS官方提供的是以下幾種
enum { kCCAlgorithmAES128 = 0, kCCAlgorithmAES = 0, kCCAlgorithmDES, kCCAlgorithm3DES, kCCAlgorithmCAST, kCCAlgorithmRC4, kCCAlgorithmRC2, kCCAlgorithmBlowfish };
(2)填充算法
enum { /* options for block ciphers */ kCCOptionPKCS7Padding = 0x0001, kCCOptionECBMode = 0x0002 /* stream ciphers currently have no options */ };
咱們能夠發現,官方提供的只有這兩種,然而JAVA使用的倒是
kCCOptionPKCS7Padding
可是不用擔憂,在密鑰是8位的時候,這兩種填充算法加密出來的結果試如出一轍的。
四、服務器經過相同的方式,解密出密文,通配安卓端。
專一技術,熱愛生活,交流技術,也作朋友。
——琿少 QQ羣:203317592