你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 一行代碼完成IOS 3DES加密解密

一行代碼完成IOS 3DES加密解密

編輯:IOS開發綜合

3DES(或稱為Triple DES)是三重數據加密算法(TDEA,Triple Data Encryption Algorithm)塊暗碼的通稱。它相當因而對每一個數據塊運用三次DES加密算法。因為盤算機運算才能的加強,原版DES暗碼的密鑰長度變得輕易被暴力破解;3DES等於設計用來供給一種絕對簡略的辦法,即經由過程增長DES的密鑰長度來防止相似的進擊,而不是設計一種全新的塊暗碼算法。 

3DES又稱Triple DES,是DES加密算法的一種形式,它應用3條56位的密鑰對數據停止三次加密。數據加密尺度(DES)是美國的一種由來已久的加密尺度,它應用對稱密鑰加密法,並於1981年被ANSI組織標准為ANSI X.3.92。DES應用56位密鑰和暗碼塊的辦法,而在暗碼塊的辦法中,文本被分紅64位年夜小的文本塊然後再停止加密。比起最後的DES,3DES更加平安。

一行代碼完成3DES加密解密須要用到寫的 JKEncrypt  https://github.com/jukai9316/JKEncrypt。

上面先解析以下3DES的完成,然後再說,若何應用JKEncrypt。

留意點:填充方法紛歧樣

在與後台交互的進程中,因為java 外面用的是PKCS5Padding,而IOS只要kCCOptionPKCS7Padding,所以用kCCOptionPKCS7Padding | kCCOptionECBMode 相當於PKCS5Padding。

 以下是3DES 256 在IOS開辟中的完成:

#import <CommonCrypto/CommonDigest.h> 
#import <CommonCrypto/CommonCryptor.h>
#import <Security/Security.h>
#import "GTMBase64.h" 
//密匙 key
#define gkey      @"Kyle_Chu"
//偏移量
#define gIv       @"jukai" 
//字符串加密
-(NSString *)doEncryptStr:(NSString *)originalStr{
  //把string 轉NSData
  NSData* data = [originalStr dataUsingEncoding:NSUTF8StringEncoding];
  //length
  size_t plainTextBufferSize = [data length];
  const void *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);
  const void *vkey = (const void *) [gkey UTF8String];
  //偏移量
  const void *vinitVec = (const void *) [gIv UTF8String];
  //設置裝備擺設CCCrypt
  ccStatus = CCCrypt(kCCEncrypt,
            kCCAlgorithm3DES, //3DES
            kCCOptionECBMode|kCCOptionPKCS7Padding, //設置形式
            vkey,  //key
            kCCKeySize3DES,
            vinitVec,   //偏移量,這裡不消,設置為nil;不消的話,必需為nil,弗成認為@“”
            vplainText,
            plainTextBufferSize,
            (void *)bufferPtr,
            bufferPtrSize,
            &movedBytes);
  NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
  NSString *result = [GTMBase64 stringByEncodingData:myData];
  return result;
} 
//字符串解密
-(NSString*)doDecEncryptStr:(NSString *)encryptStr{
  NSData *encryptData = [GTMBase64 decodeData:[encryptStr dataUsingEncoding:NSUTF8StringEncoding]];
  size_t plainTextBufferSize = [encryptData length];
  const void *vplainText = [encryptData 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);
  const void *vkey = (const void *) [gkey UTF8String];
  const void *vinitVec = (const void *) [gIv UTF8String];
  ccStatus = CCCrypt(kCCDecrypt,
            kCCAlgorithm3DES,
            kCCOptionPKCS7Padding|kCCOptionECBMode,
            vkey,
            kCCKeySize3DES,
            vinitVec,
            vplainText,
            plainTextBufferSize,
            (void *)bufferPtr,
            bufferPtrSize,
            &movedBytes);
  NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
                                   length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];
  return result;
} 

十六進制的完成省略了,可以浏覽JKEncrypt.m

JKEncrypt的應用:

//1、設置您須要的密匙、偏移量
//密匙 key
#define gkey      @"Kyle_Chu"
//偏移量
#define gIv       @"jukai" 
// @"kyle_jukai" 是測試字符串,換成您須要加密的內容便可
JKEncrypt * en = [[JKEncrypt alloc]init];
//加密
NSString * encryptStr = [en doEncryptStr: @"kyle_jukai"];
NSString * encryptHex = [en doEncryptHex: @"kyle_jukai"];
NSLog(@"字符串加密:%@",encryptStr);
NSLog(@"十六進制加密:%@",encryptHex);
//解密
NSString *decEncryptStr = [en doDecEncryptStr:encryptStr];
NSString *decEncryptHex = [en doEncryptHex:encryptHex];
NSLog(@"字符串解密:%@",decEncryptStr);
NSLog(@"字符串解密:%@",decEncryptHex); 

ps:IOS DES加密與3DES加密

比來項目中碰到了加解密的成績,然後翻閱了相干材料,勝利弄定。 如今將這些常識點總結一下,一是為了今後溫習,二是為了給年夜家供給參考。

1.  先來講說DES操作,界說我這裡就不論述了,網上一堆一堆的。接上去說一下應用時應當留意的幾點。 起首,年夜家要分清Key(密鑰),Data(待操作數據)跟Mode(加密形式)。個中Key必需為8字節(64位),Data須要是8字節(64位)的倍數,這裡須要留意了,假如Data不是8字節的倍數,那末我們須要停止數據填充,數據填充應用的算法紛歧定雷同。Mode貌似有很多種,這裡只簡略的說一下ECB跟CBC形式。

ECB形式:將待處置的數據分紅若干塊,每塊的長度都為8字節(64位),與Key長度雷同。然後對每塊停止加密或解密,最初將他們銜接在一路就是終究的成果。每塊的數據互不攪擾。

CBC形式:也須要將待處置的數據分塊,然則每塊數據在加密或許解密之前都要與前一塊的成果做一次異或操作,是以該形式須要界說一個特別的8字節Key,用於和第一塊數據做異或操作。這個特別的Key就是平日說的初始化向量。在代碼中書寫時須要設置裝備擺設iv參數,留意iv參數是對應CBC形式的。如許一來,每塊數據都是有接洽的,這是與ECB形式分歧的一點。

2. 再來講說3DES操作,也就是停止3次DES操作。設Ek()和Dk()分離代表DES算法的加密息爭密進程,k代表DES算法應用的密鑰,P代注解文,C代表密文,則3DES算法的進程可表現為:

C = Ek3(Dk2(Ek1(P)))

P = Dk1(Ek2(Dk3(C)))

3DES異樣有ECB跟CBC形式,同下面講的一樣。這裡須要留意一下Key的長度,應當是24位。好比我們已知的Key是16位的,那末我們須要將其分為2段,每段都是8位,則k1=左8位, k2=右8位,k3=左8位,也就是  k1=k3,但不克不及k1=k2=k3,由於假如每段應用的Key都雷同,就回到DES算法了。

【一行代碼完成IOS 3DES加密解密】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved