iOS 3DES加密解密(一行代碼搞定)

 3DES(或稱爲Triple DES)是三重數據加密算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。它至關因而對每一個數據塊應用三次DES加密算法。因爲計算機運算能力的加強,原版DES密碼的密鑰長度變得容易被暴力破解;3DES便是設計用來提供一種相對簡單的方法,即經過增長DES的密鑰長度來避免相似的攻擊,而不是設計一種全新的塊密碼算法。java

3DES又稱Triple DES,是DES加密算法的一種模式,它使用3條56位的密鑰對數據進行三次加密。數據加密標準(DES)是美國的一種由來已久的加密標準,它使用對稱密鑰加密法,並於1981年被ANSI組織規範爲ANSI X.3.92。DES使用56位密鑰和密碼塊的方法,而在密碼塊的方法中,文本被分紅64位大小的文本塊而後再進行加密。比起最初的DES,3DES更爲安全。git

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

下面先解析如下3DES的實現,而後再說,如何使用JKEncrypt。算法

注意點:填充方式不同安全

在與後臺交互的過程當中,因爲java 裏面用的是PKCS5Padding,而iOS只有kCCOptionPKCS7Padding,因此用kCCOptionPKCS7Padding | kCCOptionECBMode 至關於PKCS5Padding。測試

 如下是3DES 256 在iOS開發中的實現:ui

 

#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的使用:spa

 

//一、設置您須要的密匙、偏移量
//密匙 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);

 

相關文章
相關標籤/搜索