AES 加解密

//
// NSData+AES.h
// Smile
//
// Created by 蒲晓涛 on 12-11-24.
// Copyright (c) 2012年 BOX. All rights reserved.
// // 版权属于原作者
// http://code4app.com (cn) http://code4app.net (en)
// 发布代码于最专业的源码分享网站: Code4App.com #import <Foundation/Foundation.h> @class NSString; @interface NSData (Encryption) - (NSData *)AES128EncryptWithKey:(NSString *)key; //加密
- (NSData *)AES128DecryptWithKey:(NSString *)key; //解密 @end
//
// NSData+AES.h
// Smile
//
// Created by 蒲晓涛 on 12-11-24.
// Copyright (c) 2012年 BOX. All rights reserved.
// // 版权属于原作者
// http://code4app.com (cn) http://code4app.net (en)
// 发布代码于最专业的源码分享网站: Code4App.com #import "NSData+AES.h"
#import <CommonCrypto/CommonCryptor.h> #define gIv @"205681D89D731A8F" //可以自行修改 @implementation NSData (Encryption) //(key和iv向量这里是16位的) 这里是CBC加密模式,安全性更高 - (NSData *)AES128EncryptWithKey:(NSString *)key {//加密
char keyPtr[kCCKeySizeAES128+];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCKeySizeAES128+];
memset(ivPtr, , sizeof(ivPtr));
[gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = ; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
} - (NSData *)AES128DecryptWithKey:(NSString *)key {//解密
char keyPtr[kCCKeySizeAES128+];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCKeySizeAES128+];
memset(ivPtr, , sizeof(ivPtr));
[gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = ;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
return nil;
} @end
//
// SecurityUtil.h
// Smile
//
// Created by 蒲晓涛 on 12-11-24.
// Copyright (c) 2012年 BOX. All rights reserved.
// // 版权属于原作者
// http://code4app.com (cn) http://code4app.net (en)
// 发布代码于最专业的源码分享网站: Code4App.com #import <Foundation/Foundation.h> @interface SecurityUtil : NSObject #pragma mark - base64
+ (NSString*)encodeBase64String:(NSString *)input;
+ (NSString*)decodeBase64String:(NSString *)input; + (NSString*)encodeBase64Data:(NSData *)data;
+ (NSString*)decodeBase64Data:(NSData *)data; #pragma mark - AES加密
//将string转成带密码的data
//加密后16进制输出
+(NSString*)encryptAESDataToHexString:(NSString*)string app_key:(NSString*)key ; //加密后base64输出
+(NSString*)encryptAESDataToBase64:(NSString*)string app_key:(NSString*)key; //将带密码的data转成string
//解密base64
+(NSString*)decryptAESStringFromBase64:(NSString *)string app_key:(NSString*)key; //解密16进制
+(NSString*)decryptAESStringFromHexString:(NSString *)string app_key:(NSString*)key; @end

//
// SecurityUtil.h
// Smile
//
// Created by 蒲晓涛 on 12-11-24.
// Copyright (c) 2012年 BOX. All rights reserved.
// // 版权属于原作者
// http://code4app.com (cn) http://code4app.net (en)
// 发布代码于最专业的源码分享网站: Code4App.com #import "SecurityUtil.h"
#import "GTMBase64.h"
#import "NSData+AES.h" #define C2I(c) ((c >= '0' && c<='9') ? (c-'0') : ((c >= 'a' && c <= 'z') ? (c - 'a' + 10): ((c >= 'A' && c <= 'Z')?(c - 'A' + 10):(-1))))
@implementation SecurityUtil #pragma mark - base64
+ (NSString*)encodeBase64String:(NSString * )input {
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
data = [GTMBase64 encodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
} + (NSString*)decodeBase64String:(NSString * )input {
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
data = [GTMBase64 decodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
} + (NSString*)encodeBase64Data:(NSData *)data {
data = [GTMBase64 encodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
} + (NSString*)decodeBase64Data:(NSData *)data {
data = [GTMBase64 decodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
} #pragma mark - AES加密
//将string转成带密码的data
+(NSString*)encryptAESDataToHexString:(NSString*)string app_key:(NSString*)key
{
//将nsstring转化为nsdata
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSData *encryptedData = [data AES128EncryptWithKey:key];
Byte *bytes = (Byte *)[encryptedData bytes];
NSLog(@"%@", encryptedData);
//下面是Byte 转换为16进制。
NSString *hexStr=@"";
for(int i=;i<[encryptedData length];i++) {
NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数 if([newHexStr length]==) hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr]; else hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
}
NSLog(@"%@", hexStr);
NSLog(@"%@", hexStr.uppercaseString);
return hexStr.uppercaseString;
} +(NSString*)encryptAESDataToBase64:(NSString*)string app_key:(NSString*)key
{
//将nsstring转化为nsdata
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSData *encryptedData = [data AES128EncryptWithKey:key];
Byte *bytes = (Byte *)[encryptedData bytes];
NSLog(@"%@", encryptedData);
NSLog(@"加密后的字符串 :%@",[encryptedData base64Encoding]); return [encryptedData base64Encoding];
} #pragma mark - 转16进制
-(NSString *)hexStringFromData:(NSData *)data{
Byte *bytes = (Byte *)[data bytes];
//下面是Byte 转换为16进制。
NSString *hexStr=@"";
for(int i=;i<[data length];i++) {
NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数 if([newHexStr length]==) hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr]; else hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
}
return hexStr;
} #pragma mark - 16进制转data
-(NSData *)convert:(NSString *)str { const char* cs = str.UTF8String; int count = strlen(cs); int8_t bytes[count / ]; for(int i = ; i<count; i+=)
{
char c1 = *(cs + i);
char c2 = *(cs + i + );
if(C2I(c1) >= && C2I(c2) >= ){
bytes[i / ] = C2I(c1) * + C2I(c2);
}else{
return nil;
}
}
return [NSData dataWithBytes:bytes length:count / ];
} #pragma mark - AES解密
//将带密码的data转成string
+(NSString*)decryptAESStringFromBase64:(NSString *)string app_key:(NSString*)key
{
NSData *EncryptData = [GTMBase64 decodeString:string]; //解密前进行GTMBase64编码
//使用密码对data进行解密
NSData *decryData = [EncryptData AES128DecryptWithKey:key];
//将解了密码的nsdata转化为nsstring
NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding];
return str;
}
//--------------------------------------------------------
+(NSString*)decryptAESStringFromHexString:(NSString *)string app_key:(NSString*)key
{
//16进制转data
const char* cs = string.UTF8String; int count = strlen(cs); int8_t bytes[count / ]; for(int i = ; i<count; i+=)
{
char c1 = *(cs + i);
char c2 = *(cs + i + );
if(C2I(c1) >= && C2I(c2) >= ){
bytes[i / ] = C2I(c1) * + C2I(c2);
}else{
return nil;
}
}
NSData * newData = [NSData dataWithBytes:bytes length:count / ];
NSLog(@"%@", newData);
//NSData *EncryptData = [GTMBase64 decodeString:string]; //解密前进行GTMBase64编码
//使用密码对data进行解密
NSData *decryData = [newData AES128DecryptWithKey:key];
//将解了密码的nsdata转化为nsstring
NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding];
return str;
} @end
 
上一篇:C#运算符之与,或,异或及移位运算


下一篇:Qt中添加静态库.lb,.a和动态库.dll,.so,头文件和.cpp文件