注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

IOS加密 AES 256算法(EncryptAndDecrypt.h)  

2014-01-06 21:03:09|  分类: ios开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
[cpp]  
////EncryptAndDecrypt.h  
#import <Foundation/Foundation.h>  
  
@class NSString;  
  
@interface NSData (Encryption)  
  
- (NSData *)AES256EncryptWithKey:(NSData *)key;   //加密  
  
- (NSData *)AES256DecryptWithKey:(NSData *)key;   //解密  
  
- (NSString *)newStringInBase64FromData;            //追加64编码  
  
+ (NSString*)base64encode:(NSString*)str;           //同上64编码  
  
+(NSData*)stringToByte:(NSString*)string;  
  
+(NSString*)byteToString:(NSData*)data;  
  
  
  
@end  
 
 
[cpp] 
///EncryptAndDecrypt.m  
  
  
#import "EncryptAndDecrypt.h"  
  
#import <CommonCrypto/CommonCrypto.h>  
  
static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  
  
@implementation NSData (Encryption)  
  
- (NSData *)AES256EncryptWithKey:(NSData *)key   //加密  
{  
    //AES256加密,密钥应该是32位的  
  
    const void * keyPtr2 = [key bytes];  
  
    char (*keyPtr)[32] = keyPtr2;  
  
    //对于块加密算法,输出大小总是等于或小于输入大小加上一个块的大小  
  
    //所以在下边需要再加上一个块的大小  
  
    NSUInteger dataLength = [self length];  
  
    size_t bufferSize = dataLength + kCCBlockSizeAES128;  
  
    void *buffer = malloc(bufferSize);  
  
    size_t numBytesEncrypted = 0;  
  
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,  
                                            
                                          kCCOptionPKCS7Padding/*这里就是刚才说到的PKCS7Padding填充了*/| kCCOptionECBMode,  
                                            
                                          [key bytes], kCCKeySizeAES256,  
                                            
                                          NULL,/* 初始化向量(可选) */  
                                            
                                          [self bytes], dataLength,/*输入*/  
                                            
                                          buffer, bufferSize,/* 输出 */  
                                            
                                          &numBytesEncrypted);  
  
    if (cryptStatus == kCCSuccess) {  
  
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];  
  
    }  
  
    free(buffer);//释放buffer  
  
    return nil;  
  
}  
  
- (NSData *)AES256DecryptWithKey:(NSData *)key   //解密  
{  
    //同理,解密中,密钥也是32位的  
  
    const void * keyPtr2 = [key bytes];  
  
    char (*keyPtr)[32] = keyPtr2;  
  
    //对于块加密算法,输出大小总是等于或小于输入大小加上一个块的大小  
  
    //所以在下边需要再加上一个块的大小  
  
    NSUInteger dataLength = [self length];  
  
    size_t bufferSize = dataLength + kCCBlockSizeAES128;  
  
    void *buffer = malloc(bufferSize);  
  
    size_t numBytesDecrypted = 0;  
  
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,  
                                          
                                          kCCOptionPKCS7Padding/*这里就是刚才说到的PKCS7Padding填充了*/| kCCOptionECBMode,  
                                          
                                          keyPtr, kCCKeySizeAES256,  
                                           
                                          NULL,/* 初始化向量(可选) */  
                                            
                                          [self bytes], dataLength,/* 输入 */  
                                            
                                          buffer, bufferSize,/* 输出 */  
                                            
                                          &numBytesDecrypted);  
      
    if (cryptStatus == kCCSuccess) {  
          
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];  
          
    }  
      
    free(buffer);  
      
    return nil;  
      
}  
  
  
- (NSString *)newStringInBase64FromData            //追加64编码  
{  
     
    NSMutableString *dest = [[NSMutableString alloc] initWithString:@""];  
     
    unsigned char * working = (unsigned char *)[self bytes];  
      
    int srcLen = [self length];  
    
    for (int i=0; i<srcLen; i += 3) {  
          
        for (int nib=0; nib<4; nib++) {  
              
            int byt = (nib == 0)?0:nib-1;  
              
            int ix = (nib+1)*2;  
              
            if (i+byt >= srcLen) break;  
            
            unsigned char curr = ((working[i+byt] << (8-ix)) & 0x3F);  
        
            if (i+nib < srcLen) curr |= ((working[i+nib] >> ix) & 0x3F);  
        
            [dest appendFormat:@"%c", base64[curr]];  
          
        }  
         
    }  
     
    return dest;  
    
}  
  
+ (NSString*)base64encode:(NSString*)str  
{  
     
    if ([str length] == 0)  
         
        return @"";  
      
    const char *source = [str UTF8String];  
     
    int strlength  = strlen(source);  
     
    char *characters = malloc(((strlength + 2) / 3) * 4);  
      
    if (characters == NULL)  
      
        return nil;  
      
    NSUInteger length = 0;  
      
    NSUInteger i = 0;  
      
    while (i < strlength) {  
          
        char buffer[3] = {0,0,0};  
          
        short bufferLength = 0;  
          
        while (bufferLength < 3 && i < strlength)  
              
            buffer[bufferLength++] = source[i++];  
          
        characters[length++] = base64[(buffer[0] & 0xFC) >> 2];  
          
        characters[length++] = base64[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];  
          
        if (bufferLength > 1)  
              
            characters[length++] = base64[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];  
          
        else characters[length++] = '=';  
          
        if (bufferLength > 2)  
              
            characters[length++] = base64[buffer[2] & 0x3F];  
          
        else characters[length++] = '=';  
          
    }  
      
    NSString *g = [[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES];  
      
    return g;  
      
}  
  
+(NSData*)stringToByte:(NSString*)string  
{  
    NSString *hexString=[[string uppercaseString] stringByReplacingOccurrencesOfString:@" " withString:@""];  
    if ([hexString length]%2!=0) {  
        return nil;  
    }  
    Byte tempbyt[1]={0};  
    NSMutableData* bytes=[NSMutableData data];  
    for(int i=0;i<[hexString length];i++)  
    {  
        unichar hex_char1 = [hexString characterAtIndex:i]; ////两位16进制数中的第一位(高位*16)  
        int int_ch1;  
        if(hex_char1 >= '0' && hex_char1 <='9')  
            int_ch1 = (hex_char1-48)*16;   //// 0 的Ascll - 48  
        else if(hex_char1 >= 'A' && hex_char1 <='F')  
            int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65  
        else  
            return nil;  
        i++;  
          
        unichar hex_char2 = [hexString characterAtIndex:i]; ///两位16进制数中的第二位(低位)  
        int int_ch2;  
        if(hex_char2 >= '0' && hex_char2 <='9')  
            int_ch2 = (hex_char2-48); //// 0 的Ascll - 48  
        else if(hex_char2 >= 'A' && hex_char2 <='F')  
            int_ch2 = hex_char2-55; //// A 的Ascll - 65  
        else  
            return nil;  
          
        tempbyt[0] = int_ch1+int_ch2;  ///将转化后的数放入Byte数组里  
        [bytes appendBytes:tempbyt length:1];  
    }  
    return bytes;  
}  
  
+(NSString*)byteToString:(NSData*)data  
{  
    Byte *plainTextByte = (Byte *)[data bytes];  
    NSString *hexStr=@"";  
    for(int i=0;i<[data length];i++)  
    {  
        NSString *newHexStr = [NSString stringWithFormat:@"%x",plainTextByte[i]&0xff];///16进制数  
        if([newHexStr length]==1)  
            hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];  
        else  
            hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];  
    }  
    return hexStr;  
}  
  
  
@end  
 
 
使用
[cpp]  
-(void)Jiami  
{  
    NSString *plainText = @"AES中国";//明文  
      
    NSData *plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];  
    
      
    NSString *keyStr = @"12345678901234567890123456789012";  
    NSData *keyDataStr = [keyStr dataUsingEncoding:NSUTF8StringEncoding];  
  
      
    NSData *cipherTextData = [plainTextData AES256EncryptWithKey:keyDataStr];  
      
    NSString *hexStr = [NSData byteToString:cipherTextData];  
  
    NSLog(@"密文:%@",hexStr);  
    [self Jiemi:hexStr];  
      
     
  
}  
  
-(void)Jiemi:(NSString *)hexString  
{  
    NSString *keyStr = @"12345678901234567890123456789012";  
    NSData *keyDataStr = [keyStr dataUsingEncoding:NSUTF8StringEncoding];  
     
    NSData *data = [NSData stringToByte:hexString];  
      
    /////////////////   www.2cto.com
      
    NSData *datas = [data AES256DecryptWithKey:keyDataStr];  
    NSLog([[NSString alloc]initWithData:datas encoding:NSUTF8StringEncoding]);  
}  
  评论这张
 
阅读(58)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017