iOS開發(fā)--DES對稱加密封裝

最近項(xiàng)目里需要對URL的參數(shù)進(jìn)行DES加密,研究了一下,現(xiàn)分享一下.

#封裝好的DES加密邏輯,具體調(diào)用如下:
//加密的密匙(也是解密的密匙)
NSString *str = @"abcdefghigklmnopqrstuvwxyz";
//加密
NSString *eStr = [DesEncrypt base64StringFromText:str];
NSLog(@"--%@",eStr);
//解密
NSLog(@"--%@",[DesEncrypt textFromBase64String:eStr]);

注:偏移量在內(nèi)部已經(jīng)給出(可修改),如有任何疑問歡迎留言交流!

具體實(shí)現(xiàn)參考以下代碼,也可以進(jìn)入github直接下載

DesEncrypt.h
#import <Foundation/Foundation.h>

/******字符串轉(zhuǎn)base64(包括DES加密)******/
#define __BASE64( text )        [Base64codeFunc base64StringFromText:text]

/******base64(通過DES解密)轉(zhuǎn)字符串******/
#define __TEXT( base64 )        [Base64codeFunc textFromBase64String:base64]

@interface DesEncrypt : NSObject

/************************************************************
 函數(shù)名稱 : + (NSString *)base64StringFromText:(NSString *)text
 函數(shù)描述 : 將文本轉(zhuǎn)換為base64格式字符串
 輸入?yún)?shù) : (NSString *)text    文本
 輸出參數(shù) : N/A
 返回參數(shù) : (NSString *)    base64格式字符串
 備注信息 :
 **********************************************************/
+ (NSString *)base64StringFromText:(NSString *)text;

/************************************************************
 函數(shù)名稱 : + (NSString *)textFromBase64String:(NSString *)base64
 函數(shù)描述 : 將base64格式字符串轉(zhuǎn)換為文本
 輸入?yún)?shù) : (NSString *)base64  base64格式字符串
 輸出參數(shù) : N/A
 返回參數(shù) : (NSString *)    文本
 備注信息 :
 **********************************************************/
+ (NSString *)textFromBase64String:(NSString *)base64;

DesEncrypt.m

#import "DesEncrypt.h"

//引入IOS自帶密碼庫
#import <CommonCrypto/CommonCryptor.h>

//空字符串
#define     LocalStr_None           @""

static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

#define     ENCRYPTKEY  @"123456789"
#define     ENCRYPTIV   @"CCCrypr"


@implementation DesEncrypt

+ (NSString *)base64StringFromText:(NSString *)text
{
    if (text && ![text isEqualToString:LocalStr_None]) {
        //取項(xiàng)目的bundleIdentifier作為KEY
        NSString *key = ENCRYPTKEY;//[[NSBundle mainBundle] bundleIdentifier];
        NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];
        //IOS 自帶DES加密 Begin
        data = [self DESEncrypt:data WithKey:key];
        //IOS 自帶DES加密 End
        return [self base64EncodedStringFrom:data];
    }
    else {
        return LocalStr_None;
    }
}

+ (NSString *)textFromBase64String:(NSString *)base64
{
    if (base64 && ![base64 isEqualToString:LocalStr_None]) {
        //取項(xiàng)目的bundleIdentifier作為KEY
        NSString *key = ENCRYPTKEY;//[[NSBundle mainBundle] bundleIdentifier];
        NSData *data = [self dataWithBase64EncodedString:base64];
        //IOS 自帶DES解密 Begin
        data = [self DESDecrypt:data WithKey:key];
        //IOS 自帶DES加密 End
        return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    }
    else {
        return LocalStr_None;
    }
}

/************************************************************
 函數(shù)名稱 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key
 函數(shù)描述 : 文本數(shù)據(jù)進(jìn)行DES加密
 輸入?yún)?shù) : (NSData *)data
 (NSString *)key
 輸出參數(shù) : N/A
 返回參數(shù) : (NSData *)
 備注信息 : 此函數(shù)不可用于過長文本
 **********************************************************/
+ (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key
{
    char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCKeySizeAES256+1];
    bzero(ivPtr, sizeof(ivPtr));
    [ENCRYPTIV getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [data length];
    
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(0, kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          keyPtr, kCCBlockSizeDES,
                                          ivPtr,
                                          [data bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    
    free(buffer);
    return nil;
}

/************************************************************
 函數(shù)名稱 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key
 函數(shù)描述 : 文本數(shù)據(jù)進(jìn)行DES解密
 輸入?yún)?shù) : (NSData *)data
 (NSString *)key
 輸出參數(shù) : N/A
 返回參數(shù) : (NSData *)
 備注信息 : 此函數(shù)不可用于過長文本
 **********************************************************/
+ (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key
{
    char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCKeySizeAES256+1];
    bzero(ivPtr, sizeof(ivPtr));
    [ENCRYPTIV getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [data length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          keyPtr, kCCBlockSizeDES,
                                          ivPtr,
                                          [data bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesDecrypted);
    
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }
    
    free(buffer);
    return nil;
}

/************************************************************
 函數(shù)名稱 : + (NSData *)dataWithBase64EncodedString:(NSString *)string
 函數(shù)描述 : base64格式字符串轉(zhuǎn)換為文本數(shù)據(jù)
 輸入?yún)?shù) : (NSString *)string
 輸出參數(shù) : N/A
 返回參數(shù) : (NSData *)
 備注信息 :
 **********************************************************/
+ (NSData *)dataWithBase64EncodedString:(NSString *)string
{
    if (string == nil)
        [NSException raise:NSInvalidArgumentException format:nil];
    if ([string length] == 0)
        return [NSData data];
    
    static char *decodingTable = NULL;
    if (decodingTable == NULL)
    {
        decodingTable = malloc(256);
        if (decodingTable == NULL)
            return nil;
        memset(decodingTable, CHAR_MAX, 256);
        NSUInteger i;
        for (i = 0; i < 64; i++)
            decodingTable[(short)encodingTable[i]] = i;
    }
    
    const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];
    if (characters == NULL)     //  Not an ASCII string!
        return nil;
    char *bytes = malloc((([string length] + 3) / 4) * 3);
    if (bytes == NULL)
        return nil;
    NSUInteger length = 0;
    
    NSUInteger i = 0;
    while (YES)
    {
        char buffer[4];
        short bufferLength;
        for (bufferLength = 0; bufferLength < 4; i++)
        {
            if (characters[i] == '\0')
                break;
            if (isspace(characters[i]) || characters[i] == '=')
                continue;
            buffer[bufferLength] = decodingTable[(short)characters[i]];
            if (buffer[bufferLength++] == CHAR_MAX)      //  Illegal character!
            {
                free(bytes);
                return nil;
            }
        }
        
        if (bufferLength == 0)
            break;
        if (bufferLength == 1)      //  At least two characters are needed to produce one byte!
        {
            free(bytes);
            return nil;
        }
        
        //  Decode the characters in the buffer to bytes.
        bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);
        if (bufferLength > 2)
            bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);
        if (bufferLength > 3)
            bytes[length++] = (buffer[2] << 6) | buffer[3];
    }
    
    bytes = realloc(bytes, length);
    return [NSData dataWithBytesNoCopy:bytes length:length];
}

/************************************************************
 函數(shù)名稱 : + (NSString *)base64EncodedStringFrom:(NSData *)data
 函數(shù)描述 : 文本數(shù)據(jù)轉(zhuǎn)換為base64格式字符串
 輸入?yún)?shù) : (NSData *)data
 輸出參數(shù) : N/A
 返回參數(shù) : (NSString *)
 備注信息 :
 **********************************************************/
+ (NSString *)base64EncodedStringFrom:(NSData *)data
{
    if ([data length] == 0)
        return @"";
    
    char *characters = malloc((([data length] + 2) / 3) * 4);
    if (characters == NULL)
        return nil;
    NSUInteger length = 0;
    
    NSUInteger i = 0;
    while (i < [data length])
    {
        char buffer[3] = {0,0,0};
        short bufferLength = 0;
        while (bufferLength < 3 && i < [data length])
            buffer[bufferLength++] = ((char *)[data bytes])[i++];
        
        //  Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.
        characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];
        characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];
        if (bufferLength > 1)
            characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];
        else characters[length++] = '=';
        if (bufferLength > 2)
            characters[length++] = encodingTable[buffer[2] & 0x3F];
        else characters[length++] = '=';
    }
    
    return [[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES];
}

@end

如果想詳細(xì)了解DES算法原理,請參考http://www.cocoachina.com/bbs/read.php?tid=105524

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在此特此聲明:一下所有鏈接均來自互聯(lián)網(wǎng),在此記錄下我的查閱學(xué)習(xí)歷程,感謝各位原創(chuàng)作者的無私奉獻(xiàn) ! 技術(shù)一點(diǎn)一點(diǎn)積...
    遠(yuǎn)航的移動開發(fā)歷程閱讀 11,547評論 12 197
  • 自用收藏 原文:http://www.th7.cn/Program/IOS/201606/884245.shtml...
    西瓜皮奧特曼閱讀 2,345評論 0 16
  • 好糾結(jié)、怎么破? 除了我,誰還會把朋友耍成這樣………… 兩個人在家都不說話,各自在各自的房間里玩,真是醉了! 啊~...
    越愛笑越悲傷閱讀 156評論 0 1
  • 當(dāng)我提起筆,想到的是這樣一個人,初見時,時而沉默高冷、時而溫文爾雅。那時的他,沒有驚艷的顏值,也沒有高挑...
    收留你的美好閱讀 432評論 0 1
  • 辣眼睛,作為編輯得天天看些狗屁不通的文字。作為修圖的天天看些可以直接進(jìn)垃圾桶的照片。那開會聽各種邏輯不同的語言,還...
    魚小飛_閱讀 257評論 0 1

友情鏈接更多精彩內(nèi)容