簡進祥==iOS 3DES加密解密

來源:互聯網
上載者:User

標籤:

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

 

簡進祥==iOS 3DES加密解密

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.