`
z251257144
  • 浏览: 89606 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

[iOS]AES加密在iOS上面的实现

    博客分类:
  • iOS
阅读更多

Encryption.h文件

 

//  
//  Encryption.h  
//  DownloadFile  
//  
//  Created by zhoumin on 12-1-16.  
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.  
//  
  
#import <Foundation/Foundation.h>  
  
@class NSString;  
  
@interface NSData (Encryption)  
  
- (NSData *)AES256EncryptWithKey:(NSString *)key;   //加密  
- (NSData *)AES256DecryptWithKey:(NSString *)key;   //解密  
- (NSString *)newStringInBase64FromData;            //追加64编码  
+ (NSString*)base64encode:(NSString*)str;           //同上64编码  
  
@end  
 

 

Encryption.m文件

 

//  
//  Encryption.m  
//  DownloadFile  
//  
//  Created by  on 12-1-16.  
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.  
//  
  
#import "Encryption.h"  
#import <CommonCrypto/CommonCryptor.h>  
  
  
static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  
  
@implementation NSData (Encryption)  
  
- (NSData *)AES256EncryptWithKey:(NSString *)key   //加密  
{  
    char keyPtr[kCCKeySizeAES256+1];  
    bzero(keyPtr, sizeof(keyPtr));  
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  
    NSUInteger dataLength = [self length];  
    size_t bufferSize = dataLength + kCCBlockSizeAES128;  
    void *buffer = malloc(bufferSize);  
    size_t numBytesEncrypted = 0;  
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,  
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,  
                                          keyPtr, kCCBlockSizeAES128,  
                                          NULL,  
                                          [self bytes], dataLength,  
                                          buffer, bufferSize,  
                                          &numBytesEncrypted);  
    if (cryptStatus == kCCSuccess) {  
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];  
    }  
    free(buffer);  
    return nil;  
}  
  
  
- (NSData *)AES256DecryptWithKey:(NSString *)key   //解密  
{  
    char keyPtr[kCCKeySizeAES256+1];  
    bzero(keyPtr, sizeof(keyPtr));  
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  
    NSUInteger dataLength = [self length];  
    size_t bufferSize = dataLength + kCCBlockSizeAES128;  
    void *buffer = malloc(bufferSize);  
    size_t numBytesDecrypted = 0;  
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,  
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,  
                                          keyPtr, kCCBlockSizeAES128,  
                                          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] autorelease];  
    return g;  
}  
  
  
@end

 

 

测试

 

NSString *key = @"my password";  
NSString *secret = @"text to encrypt";  
//加密  
NSData *plain = [secret dataUsingEncoding:NSUTF8StringEncoding];  
NSData *cipher = [plain AES256EncryptWithKey:key];  
NSLog(@"%@",[[cipher newStringInBase64FromData] autorelease]);  
printf("%s\n", [[cipher description] UTF8String]);  
NSLog(@"%@", [[[NSString alloc] initWithData:cipher encoding:NSUTF8StringEncoding] autorelease]);//打印出null,这是因为没有解密。  
//解密  
plain = [cipher AES256DecryptWithKey:key];  
printf("%s\n", [[plain description] UTF8String]);  
NSLog(@"%@", [[[NSString alloc] initWithData:plain encoding:NSUTF8StringEncoding] autorelease]);  
//打印出secret的内容,用密码解密过了。如果使用错误的密码,则打印null  

 

 

demo下载:http://download.csdn.net/detail/z251257144/4820200

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics