#import<Foundation/Foundation.h>
@classNSString;
@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>
staticchar base64[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@implementation NSData (Encryption)
- (NSData *)AES256EncryptWithKey:(NSString *)key //加密
{
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,sizeof(keyPtr));
[keygetCString:keyPtr maxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [selflength];
size_t bufferSize = dataLength +kCCBlockSizeAES128;
void *buffer =malloc(bufferSize);
size_t numBytesEncrypted =0;
CCCryptorStatus cryptStatus =CCCrypt(kCCEncrypt,kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,kCCBlockSizeAES128,
NULL,
[selfbytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus ==kCCSuccess) {
return [NSDatadataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
returnnil;
}
- (NSData *)AES256DecryptWithKey:(NSString *)key //解密
{
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,sizeof(keyPtr));
[keygetCString:keyPtr maxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [selflength];
size_t bufferSize = dataLength +kCCBlockSizeAES128;
void *buffer =malloc(bufferSize);
size_t numBytesDecrypted =0;
CCCryptorStatus cryptStatus =CCCrypt(kCCDecrypt,kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,kCCBlockSizeAES128,
NULL,
[selfbytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus ==kCCSuccess) {
return [NSDatadataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
returnnil;
}
- (NSString *)newStringInBase64FromData //追加64编码
{
NSMutableString *dest = [[NSMutableStringalloc] initWithString:@""];
unsignedchar * working = (unsignedchar *)[self bytes];
int srcLen = [selflength];
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;
unsignedchar 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 ([strlength] == 0)
return@"";
constchar *source = [strUTF8String];
int strlength =strlen(source);
char *characters =malloc(((strlength + 2) / 3) * 4);
if (characters ==NULL)
returnnil;
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 = [[[NSStringalloc] initWithBytesNoCopy:characterslength:length encoding:NSASCIIStringEncodingfreeWhenDone:YES]autorelease];
return g;
}
@end