ios 字符串的base64编解码和加密

本文介绍了一个用于Base64编码和解码的工具类实现,该工具类使用了iOS自带的密码库进行文本数据的加密和解密处理,并提供了方便使用的宏定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

============================================================
博文原创,转载请声明出处
电子咖啡(原id蓝岩)
============================================================
在项目中遇到字符串的base64编解码,分享一下工具类:

CommonFunc.h

  1. //   
  2. //  CommonFunc.h   
  3. //  PRJ_base64   
  4. //   
  5. //  Created by wangzhipeng on 12-11-29.   
  6. //  Copyright (c) 2012年 com.comsoft. All rights reserved.   
  7. //   
  8.   
  9. #import <Foundation/Foundation.h>   
  10.   
  11. #define __BASE64( text )        [CommonFunc base64StringFromText:text]   
  12. #define __TEXT( base64 )        [CommonFunc textFromBase64String:base64]   
  13.   
  14. @interface CommonFunc : NSObject  
  15.   
  16. /****************************************************************************** 
  17.  函数名称 : + (NSString *)base64StringFromText:(NSString *)text 
  18.  函数描述 : 将文本转换为base64格式字符串 
  19.  输入参数 : (NSString *)text    文本 
  20.  输出参数 : N/A 
  21.  返回参数 : (NSString *)    base64格式字符串 
  22.  备注信息 : 
  23.  ******************************************************************************/  
  24. + (NSString *)base64StringFromText:(NSString *)text;  
  25.   
  26. /****************************************************************************** 
  27.  函数名称 : + (NSString *)textFromBase64String:(NSString *)base64 
  28.  函数描述 : 将base64格式字符串转换为文本 
  29.  输入参数 : (NSString *)base64  base64格式字符串 
  30.  输出参数 : N/A 
  31.  返回参数 : (NSString *)    文本 
  32.  备注信息 : 
  33.  ******************************************************************************/  
  34. + (NSString *)textFromBase64String:(NSString *)base64;  
  35.   
  36. @end  
//
//  CommonFunc.h
//  PRJ_base64
//
//  Created by wangzhipeng on 12-11-29.
//  Copyright (c) 2012年 com.comsoft. All rights reserved.
//

#import <Foundation/Foundation.h>

#define __BASE64( text )        [CommonFunc base64StringFromText:text]
#define __TEXT( base64 )        [CommonFunc textFromBase64String:base64]

@interface CommonFunc : NSObject

/******************************************************************************
 函数名称 : + (NSString *)base64StringFromText:(NSString *)text
 函数描述 : 将文本转换为base64格式字符串
 输入参数 : (NSString *)text    文本
 输出参数 : N/A
 返回参数 : (NSString *)    base64格式字符串
 备注信息 :
 ******************************************************************************/
+ (NSString *)base64StringFromText:(NSString *)text;

/******************************************************************************
 函数名称 : + (NSString *)textFromBase64String:(NSString *)base64
 函数描述 : 将base64格式字符串转换为文本
 输入参数 : (NSString *)base64  base64格式字符串
 输出参数 : N/A
 返回参数 : (NSString *)    文本
 备注信息 :
 ******************************************************************************/
+ (NSString *)textFromBase64String:(NSString *)base64;

@end


CommonFunc.m

  1. //   
  2. //  CommonFunc.m   
  3. //  PRJ_base64   
  4. //   
  5. //  Created by wangzhipeng on 12-11-29.   
  6. //  Copyright (c) 2012年 com.comsoft. All rights reserved.   
  7. //   
  8.   
  9. #import "CommonFunc.h"   
  10.   
  11. //引入IOS自带密码库   
  12. #import <CommonCrypto/CommonCryptor.h>   
  13.   
  14. //空字符串   
  15. #define     LocalStr_None           @""   
  16.   
  17. static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  
  18.   
  19. @implementation CommonFunc  
  20.   
  21. + (NSString *)base64StringFromText:(NSString *)text  
  22. {  
  23.     if (text && ![text isEqualToString:LocalStr_None]) {  
  24.         //取项目的bundleIdentifier作为KEY   
  25.         NSString *key = [[NSBundle mainBundle] bundleIdentifier];  
  26.         NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];  
  27.         //IOS 自带DES加密 Begin   
  28.         data = [self DESEncrypt:data WithKey:key];  
  29.         //IOS 自带DES加密 End   
  30.         return [self base64EncodedStringFrom:data];  
  31.     }  
  32.     else {  
  33.         return LocalStr_None;  
  34.     }  
  35. }  
  36.   
  37. + (NSString *)textFromBase64String:(NSString *)base64  
  38. {  
  39.     if (base64 && ![base64 isEqualToString:LocalStr_None]) {  
  40.         //取项目的bundleIdentifier作为KEY   
  41.         NSString *key = [[NSBundle mainBundle] bundleIdentifier];  
  42.         NSData *data = [self dataWithBase64EncodedString:base64];  
  43.         //IOS 自带DES解密 Begin   
  44.         data = [self DESDecrypt:data WithKey:key];  
  45.         //IOS 自带DES加密 End   
  46.         return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
  47.     }  
  48.     else {  
  49.         return LocalStr_None;  
  50.     }  
  51. }  
  52.   
  53. /****************************************************************************** 
  54.  函数名称 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key 
  55.  函数描述 : 文本数据进行DES加密 
  56.  输入参数 : (NSData *)data     
  57.           (NSString *)key 
  58.  输出参数 : N/A 
  59.  返回参数 : (NSData *) 
  60.  备注信息 : 此函数不可用于过长文本 
  61.  ******************************************************************************/  
  62. + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key  
  63. {  
  64.     char keyPtr[kCCKeySizeAES256+1];  
  65.     bzero(keyPtr, sizeof(keyPtr));  
  66.       
  67.     [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  
  68.       
  69.     NSUInteger dataLength = [data length];  
  70.       
  71.     size_t bufferSize = dataLength + kCCBlockSizeAES128;  
  72.     void *buffer = malloc(bufferSize);  
  73.       
  74.     size_t numBytesEncrypted = 0;  
  75.     CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,  
  76.                                           kCCOptionPKCS7Padding | kCCOptionECBMode,  
  77.                                           keyPtr, kCCBlockSizeDES,  
  78.                                           NULL,  
  79.                                           [data bytes], dataLength,  
  80.                                           buffer, bufferSize,  
  81.                                           &numBytesEncrypted);  
  82.     if (cryptStatus == kCCSuccess) {  
  83.         return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];  
  84.     }  
  85.       
  86.     free(buffer);  
  87.     return nil;  
  88. }  
  89.   
  90. /****************************************************************************** 
  91.  函数名称 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key 
  92.  函数描述 : 文本数据进行DES解密 
  93.  输入参数 : (NSData *)data 
  94.           (NSString *)key 
  95.  输出参数 : N/A 
  96.  返回参数 : (NSData *) 
  97.  备注信息 : 此函数不可用于过长文本 
  98.  ******************************************************************************/  
  99. + (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key  
  100. {  
  101.     char keyPtr[kCCKeySizeAES256+1];  
  102.     bzero(keyPtr, sizeof(keyPtr));  
  103.       
  104.     [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  
  105.       
  106.     NSUInteger dataLength = [data length];  
  107.       
  108.     size_t bufferSize = dataLength + kCCBlockSizeAES128;  
  109.     void *buffer = malloc(bufferSize);  
  110.       
  111.     size_t numBytesDecrypted = 0;  
  112.     CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,  
  113.                                           kCCOptionPKCS7Padding | kCCOptionECBMode,  
  114.                                           keyPtr, kCCBlockSizeDES,  
  115.                                           NULL,  
  116.                                           [data bytes], dataLength,  
  117.                                           buffer, bufferSize,  
  118.                                           &numBytesDecrypted);  
  119.       
  120.     if (cryptStatus == kCCSuccess) {  
  121.         return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];  
  122.     }  
  123.       
  124.     free(buffer);  
  125.     return nil;  
  126. }  
  127.   
  128. /****************************************************************************** 
  129.  函数名称 : + (NSData *)dataWithBase64EncodedString:(NSString *)string 
  130.  函数描述 : base64格式字符串转换为文本数据 
  131.  输入参数 : (NSString *)string 
  132.  输出参数 : N/A 
  133.  返回参数 : (NSData *) 
  134.  备注信息 : 
  135.  ******************************************************************************/  
  136. + (NSData *)dataWithBase64EncodedString:(NSString *)string  
  137. {  
  138.     if (string == nil)  
  139.         [NSException raise:NSInvalidArgumentException format:nil];  
  140.     if ([string length] == 0)  
  141.         return [NSData data];  
  142.       
  143.     static char *decodingTable = NULL;  
  144.     if (decodingTable == NULL)  
  145.     {  
  146.         decodingTable = malloc(256);  
  147.         if (decodingTable == NULL)  
  148.             return nil;  
  149.         memset(decodingTable, CHAR_MAX, 256);  
  150.         NSUInteger i;  
  151.         for (i = 0; i < 64; i++)  
  152.             decodingTable[(short)encodingTable[i]] = i;  
  153.     }  
  154.       
  155.     const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];  
  156.     if (characters == NULL)     //  Not an ASCII string!   
  157.         return nil;  
  158.     char *bytes = malloc((([string length] + 3) / 4) * 3);  
  159.     if (bytes == NULL)  
  160.         return nil;  
  161.     NSUInteger length = 0;  
  162.       
  163.     NSUInteger i = 0;  
  164.     while (YES)  
  165.     {  
  166.         char buffer[4];  
  167.         short bufferLength;  
  168.         for (bufferLength = 0; bufferLength < 4; i++)  
  169.         {  
  170.             if (characters[i] == '\0')  
  171.                 break;  
  172.             if (isspace(characters[i]) || characters[i] == '=')  
  173.                 continue;  
  174.             buffer[bufferLength] = decodingTable[(short)characters[i]];  
  175.             if (buffer[bufferLength++] == CHAR_MAX)      //  Illegal character!   
  176.             {  
  177.                 free(bytes);  
  178.                 return nil;  
  179.             }  
  180.         }  
  181.           
  182.         if (bufferLength == 0)  
  183.             break;  
  184.         if (bufferLength == 1)      //  At least two characters are needed to produce one byte!   
  185.         {  
  186.             free(bytes);  
  187.             return nil;  
  188.         }  
  189.           
  190.         //  Decode the characters in the buffer to bytes.   
  191.         bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);  
  192.         if (bufferLength > 2)  
  193.             bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);  
  194.         if (bufferLength > 3)  
  195.             bytes[length++] = (buffer[2] << 6) | buffer[3];  
  196.     }  
  197.       
  198.     bytes = realloc(bytes, length);  
  199.     return [NSData dataWithBytesNoCopy:bytes length:length];  
  200. }  
  201.   
  202. /****************************************************************************** 
  203.  函数名称 : + (NSString *)base64EncodedStringFrom:(NSData *)data 
  204.  函数描述 : 文本数据转换为base64格式字符串 
  205.  输入参数 : (NSData *)data 
  206.  输出参数 : N/A 
  207.  返回参数 : (NSString *) 
  208.  备注信息 :  
  209.  ******************************************************************************/  
  210. + (NSString *)base64EncodedStringFrom:(NSData *)data  
  211. {  
  212.     if ([data length] == 0)  
  213.         return @"";  
  214.       
  215.     char *characters = malloc((([data length] + 2) / 3) * 4);  
  216.     if (characters == NULL)  
  217.         return nil;  
  218.     NSUInteger length = 0;  
  219.       
  220.     NSUInteger i = 0;  
  221.     while (i < [data length])  
  222.     {  
  223.         char buffer[3] = {0,0,0};  
  224.         short bufferLength = 0;  
  225.         while (bufferLength < 3 && i < [data length])  
  226.             buffer[bufferLength++] = ((char *)[data bytes])[i++];  
  227.           
  228.         //  Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.   
  229.         characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];  
  230.         characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];  
  231.         if (bufferLength > 1)  
  232.             characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];  
  233.         else characters[length++] = '=';  
  234.         if (bufferLength > 2)  
  235.             characters[length++] = encodingTable[buffer[2] & 0x3F];  
  236.         else characters[length++] = '=';  
  237.     }  
  238.       
  239.     return [[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES];  
  240. }  
  241.   
  242. @end  

http://blog.youkuaiyun.com/shencaifeixia1/article/details/8530884

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值