现在的位置: 首页 > 综合 > 正文

DES加密解密(配合GTMBase64)

2017年12月09日 ⁄ 综合 ⁄ 共 3354字 ⁄ 字号 评论关闭

DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密

用DES实现加密和解密的过程:(网络搜索后加以修改而来)

DesEncry.h文件中:

  1. + (NSString *)encryptWithText:(NSString *)sText forKey:(NSString*)
    key;//加密  
  2. + (NSString *)decryptWithText:(NSString *)sText forKey:(NSString*)
    key;//解密  

注释: key 也就是密匙,自己约定

DesEncry.m文件中  

#import"GTMBase64.h"

#import<CommonCrypto/CommonCryptor.h>

  1. + (NSString *)encryptWithText:(NSString *)sText forKey:(NSString*) key  
  2. {  
  3.     //kCCEncrypt 加密  
  4.     return [self encrypt:sText encryptOrDecrypt:kCCEncrypt key:key];  
  5. }  
  6.   
  7. + (NSString *)decryptWithText:(NSString *)sText  forKey:(NSString*) key
  8. {  
  9.     //kCCDecrypt 解密  
  10.     return [self encrypt:sText encryptOrDecrypt:kCCDecrypt key:key];  
  11. }  
  12.   

    static Byte iv[] = {1,2,3,4,5,6,7,8};

  13. + (NSString *)encrypt:(NSString *)sText encryptOrDecrypt:(CCOperation)encryptOperation key:(NSString *)key  
  14. {  
  15.     const void *dataIn;  
  16.     size_t dataInLength;  
  17.       
  18.     if (encryptOperation == kCCDecrypt)//传递过来的是decrypt 解码  
  19.     {  
  20.         //解码 base64  
  21.         NSData *decryptData = [GTMBase64 decodeData:[sText dataUsingEncoding:NSUTF8StringEncoding]];//转成utf-8并decode  
  22.         dataInLength = [decryptData length];  
  23.         dataIn = [decryptData bytes];  
  24.     }  
  25.     else  //encrypt  
  26.     {  
  27.         NSData* encryptData = [sText dataUsingEncoding:NSUTF8StringEncoding];  
  28.         dataInLength = [encryptData length];  
  29.         dataIn = (const void *)[encryptData bytes];  
  30.     }  
  31.       
  32.     /* 
  33.      DES加密 :用CCCrypt函数加密一下,然后用base64编码下,传过去 
  34.      DES解密 :把收到的数据根据base64,decode一下,然后再用CCCrypt函数解密,得到原本的数据 
  35.      */  
  36.     CCCryptorStatus ccStatus;  
  37.     uint8_t *dataOut = NULL; //可以理解位type/typedef 的缩写(有效的维护了代码,比如:一个人用int,一个人用long。最好用typedef来定义)  
  38.     size_t dataOutAvailable = 0; //size_t  是操作符sizeof返回的结果类型  
  39.     size_t dataOutMoved = 0;  
  40.       
  41.     dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);  
  42.     dataOut = malloc( dataOutAvailable * sizeof(uint8_t));  
  43.     memset((void *)dataOut, 0x0, dataOutAvailable);//将已开辟内存空间buffer的首 1 个字节的值设为值 0  
  44.       
  45.     const void *vkey = (const void *) [key UTF8String];
     
  46.     const void *iv = (const void *) [initIv UTF8String];  
  47.       
  48.     //CCCrypt函数 加密/解密  
  49.     ccStatus = CCCrypt(encryptOperation,//  加密/解密  
  50.                        kCCAlgorithmDES,//  加密根据哪个标准(des,3des,aes。。。。)  
  51.                        kCCOptionPKCS7Padding,//  选项分组密码算法(des:对每块分组加一次密  3DES:对每块分组加三个不同的密)  
  52.                        vkey,  //密钥    加密和解密的密钥必须一致  
  53.                        kCCKeySizeDES,//   DES 密钥的大小(kCCKeySizeDES=8)  
  54.                        iv, //  可选的初始矢量  
  55.                        dataIn, // 数据的存储单元  
  56.                        dataInLength,// 数据的大小  
  57.                        (void *)dataOut,// 用于返回数据  
  58.                        dataOutAvailable,  
  59.                        &dataOutMoved);  
  60.       
  61.     NSString *result = nil;  
  62.       
  63.     if (encryptOperation == kCCDecrypt)//encryptOperation==1  解码  
  64.     {  
  65.         //得到解密出来的data数据,改变为utf-8的字符串  
  66.         result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding] autorelease];  
  67.     }  
  68.     else //encryptOperation==0  (加密过程中,把加好密的数据转成base64的)  
  69.     {  
  70.         //编码 base64  
  71.         NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];  
  72.         result = [GTMBase64 stringByEncodingData:data];  
  73.     }  
  74.       
  75.     return result;  
  76. }  
【上篇】
【下篇】

抱歉!评论已关闭.