您的位置:首页 > 移动开发 > IOS开发

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

2012-07-11 00:01 281 查看
Encryption.h文件

#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文件

#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

------------------------------------------------------------------------------------------------

测试代码

#import "Encryption.h"

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息