NSString加密,解密和64编码

来源:互联网 发布:sql 2005 32位 下载 编辑:程序博客网 时间:2024/06/05 04:58

#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 = [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,

                                          [selfbytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess) {

        return [NSData dataWithBytesNoCopy: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 = [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,

                                          [selfbytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesDecrypted);

    if (cryptStatus == kCCSuccess) {

        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

    }

    free(buffer);

returnnil;

}



- (NSString *)newStringInBase64FromData           //追加64编码

{

NSMutableString *dest = [[NSMutableStringalloc] initWithString:@""];

    unsigned char * working = (unsignedchar *)[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 ([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