当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS base64 加密解密 通用类实例代码

iOS base64 加密解密 通用类实例代码

2019年07月24日  | 移动技术网IT编程  | 我要评论

大明西游记,西线日尔曼,制作人12

在使用过程中,直接将被类引入到项目中即可,不需要其它辅助类。

使用示例:  将此通用类的头文件引入到目标类后,直接使用类名进行调用即可。

nsstring *str = [nsstring stringwithformat:@"ywe="]; 
  nsstring *str1 = [nsstring stringwithformat:@"aa"]; 
  nslog(@"resultstr========%@",[commonfunc textfrombase64string:str]);  //使用类名进行调用 
  nslog(@"resultstr=========%@",[commonfunc base64stringfromtext:str1]); //使用类名进行调用 

源码下载:

在项目中遇到字符串的base64编解码,分享一下工具类:

jkcommonfunc.h

#define __base64( text )    [commonfunc base64stringfromtext:text] 
#define __text( base64 )    [commonfunc textfrombase64string:base64] 
#import <foundation/foundation.h> 
@interface jkcommonfunc : 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 

jkcommonfunc.m

#import "commonfunc.h"    
//引入ios自带密码库  
#import <commoncrypto/commoncryptor.h>  
//空字符串  
#define   localstr_none      @""  
static const char encodingtable[] = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/";  
@implementation commonfunc  
+ (nsstring *)base64stringfromtext:(nsstring *)text  
{  
  if (text && ![text isequaltostring:localstr_none]) {  
    //取项目的bundleidentifier作为key 改动了此处 
    //nsstring *key = [[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]) {  
    //取项目的bundleidentifier作为key  改动了此处 
    //nsstring *key = [[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;  
  }  
}  
/****************************************************************************** 
 函数名称 : + (nsdata *)desencrypt:(nsdata *)data withkey:(nsstring *)key 
 函数描述 : 文本数据进行des加密 
 输入参数 : (nsdata *)data   
     (nsstring *)key 
 输出参数 : n/a 
 返回参数 : (nsdata *) 
 备注信息 : 此函数不可用于过长文本 
 ******************************************************************************/  
+ (nsdata *)desencrypt:(nsdata *)data withkey:(nsstring *)key  
{  
  char keyptr[kcckeysizeaes256+1];  
  bzero(keyptr, sizeof(keyptr));  
  [key getcstring:keyptr maxlength:sizeof(keyptr) encoding:nsutf8stringencoding];  
  nsuinteger datalength = [data length];  
  size_t buffersize = datalength + kccblocksizeaes128;  
  voidvoid *buffer = malloc(buffersize);  
  size_t numbytesencrypted = 0;  
  cccryptorstatus cryptstatus = cccrypt(kccencrypt, kccalgorithmdes,  
                     kccoptionpkcs7padding | kccoptionecbmode,  
                     keyptr, kccblocksizedes,  
                     null,  
                     [data bytes], datalength,  
                     buffer, buffersize,  
                     &numbytesencrypted);  
  if (cryptstatus == kccsuccess) {  
    return [nsdata datawithbytesnocopy:buffer length:numbytesencrypted];  
  }  
  free(buffer);  
  return nil;  
}  
/****************************************************************************** 
 函数名称 : + (nsdata *)desencrypt:(nsdata *)data withkey:(nsstring *)key 
 函数描述 : 文本数据进行des解密 
 输入参数 : (nsdata *)data 
     (nsstring *)key 
 输出参数 : n/a 
 返回参数 : (nsdata *) 
 备注信息 : 此函数不可用于过长文本 
 ******************************************************************************/  
+ (nsdata *)desdecrypt:(nsdata *)data withkey:(nsstring *)key  
{  
  char keyptr[kcckeysizeaes256+1];  
  bzero(keyptr, sizeof(keyptr));  
  [key getcstring:keyptr maxlength:sizeof(keyptr) encoding:nsutf8stringencoding];  
  nsuinteger datalength = [data length];  
  size_t buffersize = datalength + kccblocksizeaes128;  
  voidvoid *buffer = malloc(buffersize);  
  size_t numbytesdecrypted = 0;  
  cccryptorstatus cryptstatus = cccrypt(kccdecrypt, kccalgorithmdes,  
                     kccoptionpkcs7padding | kccoptionecbmode,  
                     keyptr, kccblocksizedes,  
                     null,  
                     [data bytes], datalength,  
                     buffer, buffersize,  
                     &numbytesdecrypted);  
  if (cryptstatus == kccsuccess) {  
    return [nsdata datawithbytesnocopy:buffer length:numbytesdecrypted];  
  }  
  free(buffer);  
  return nil;  
}  
/****************************************************************************** 
 函数名称 : + (nsdata *)datawithbase64encodedstring:(nsstring *)string 
 函数描述 : base64格式字符串转换为文本数据 
 输入参数 : (nsstring *)string 
 输出参数 : n/a 
 返回参数 : (nsdata *) 
 备注信息 : 
 ******************************************************************************/  
+ (nsdata *)datawithbase64encodedstring:(nsstring *)string  
{  
  if (string == nil)  
    [nsexception raise:nsinvalidargumentexception format:nil];  
  if ([string length] == 0)  
    return [nsdata data];  
  static charchar *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 charchar *characters = [string cstringusingencoding:nsasciistringencoding];  
  if (characters == null)   // not an ascii string!  
    return nil;  
  charchar *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];  
}  
/****************************************************************************** 
 函数名称 : + (nsstring *)base64encodedstringfrom:(nsdata *)data 
 函数描述 : 文本数据转换为base64格式字符串 
 输入参数 : (nsdata *)data 
 输出参数 : n/a 
 返回参数 : (nsstring *) 
 备注信息 :  
 ******************************************************************************/  
+ (nsstring *)base64encodedstringfrom:(nsdata *)data  
{  
  if ([data length] == 0)  
    return @"";  
  charchar *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++] = ((charchar *)[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  

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网