Onelong

分享知识,与你一起进步......
RSS icon Home icon
  • AES Demo

    post by onelong / 2016-11-11 20:09 Friday [apple]

    #import "ViewController.h"

    #import <CommonCrypto/CommonDigest.h>

    #import <CommonCrypto/CommonCryptor.h>

     

    #define gkey @"LN_85%@A6f*&0d!k" //自行修改

    #define gIv             @"0b94c817d6a23f5e" //自行修改

     

    @implementation ViewController

     

     

    - (void)viewDidLoad {

        [super viewDidLoad];

     

        // Do any additional setup after loading the view.

        

        NSData *data = [ViewController hexStrToNSData:@"d34e671d3940605d37b8f0436fa09d14"];

        

        //NSData *data =[ViewController AES128Encrypt:@"fffff0000"];

        

       NSData *data1 =  [ViewController AES128Decrypt:data];

        

        

        

       NSString *str = [[NSString alloc]initWithData:data1 encoding:NSUTF8StringEncoding];

       str = [str stringByReplacingOccurrencesOfString:@"'" withString:@"\""];

       NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil];

       NSLog(@"-----%@",str);

        

    }

     

    - (void)setRepresentedObject:(id)representedObject {

        [super setRepresentedObject:representedObject];

     

        // Update the view, if already loaded.

    }

     

    +(NSData *)hexStrToNSData:(NSString *)hexStr

    {

        NSMutableData* data = [NSMutableData data];

        int idx;

        for (idx = 0; idx+2 <= hexStr.length; idx+=2) {

            NSRange range = NSMakeRange(idx, 2);

            NSString* ch = [hexStr substringWithRange:range];

            NSScanner* scanner = [NSScanner scannerWithString:ch];

            unsigned int intValue;

            [scanner scanHexInt:&intValue];

            [data appendBytes:&intValue length:1];

        }

        return data;

    }

     

    +(NSData *)AES128Encrypt:(NSString *)plainText

    {

        char keyPtr[kCCKeySizeAES128+1];

        memset(keyPtr, 0, sizeof(keyPtr));

        [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

        

        char ivPtr[kCCBlockSizeAES128+1];

        memset(ivPtr, 0, sizeof(ivPtr));

        [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

        

        NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];

        NSUInteger dataLength = [data length];

        

        NSUInteger diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);

        NSUInteger newSize = 0;

        

        if(diff > 0)

        {

            newSize = dataLength + diff;

        }

        

        char dataPtr[newSize];

        memcpy(dataPtr, [data bytes], [data length]);

        for(int i = 0; i < diff; i++)

        {

            dataPtr[i + dataLength] = 0x00;

        }

        

        size_t bufferSize = newSize + kCCBlockSizeAES128;

        void *buffer = malloc(bufferSize);

        memset(buffer, 0, bufferSize);

        

        size_t numBytesCrypted = 0;

        

        CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,

                                              kCCAlgorithmAES128,

                                              0x0000,               //No padding

                                              keyPtr,

                                              kCCKeySizeAES128,

                                              ivPtr,

                                              dataPtr,

                                              sizeof(dataPtr),

                                              buffer,

                                              bufferSize,

                                              &numBytesCrypted);

        

        if (cryptStatus == kCCSuccess) {

            NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];

            return resultData;

        }

        free(buffer);

        return nil;

    }

     

     

    +(NSData *)AES128Decrypt:(NSData *)data

    {

        char keyPtr[kCCKeySizeAES128 + 1];

        memset(keyPtr, 0, sizeof(keyPtr));

        [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

        

        char ivPtr[kCCBlockSizeAES128 + 1];

        memset(ivPtr, 0, sizeof(ivPtr));

        [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

        

        //NSData *data = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];

        NSUInteger dataLength = [data length];

        size_t bufferSize = dataLength + kCCBlockSizeAES128;

        void *buffer = malloc(bufferSize);

        

        size_t numBytesCrypted = 0;

        CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,

                                              kCCAlgorithmAES128,

                                              0x0000,

                                              keyPtr,

                                              kCCBlockSizeAES128,

                                              ivPtr,

                                              [data bytes],

                                              dataLength,

                                              buffer,

                                              bufferSize,

                                              &numBytesCrypted);

        if (cryptStatus == kCCSuccess) {

            NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];

            return resultData;//[[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];

        }

        free(buffer);

        return nil;

    }

     

     

     

    @end

    引用地址:
     

    我要评论