// // JHAES.m // 测试 // // Created by CSDC on 2017/2/23. // Copyright © 2017年 jianhekeji. All rights reserved. // #import "JHAES.h" #import #import "GTMBase64.h" @implementation JHAES +(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)gkey iv:(NSString *)gIv{ char keyPtr[kCCKeySizeAES128+1]; bzero(keyPtr, sizeof(keyPtr)); [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCKeySizeAES128+1]; memset(ivPtr, 0, sizeof(ivPtr)); [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding]; NSUInteger dataLength = [data length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; //kCCOptionPKCS7Padding CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCBlockSizeAES128, ivPtr, [data bytes], dataLength, buffer, bufferSize, &numBytesEncrypted); if (cryptStatus == kCCSuccess) { NSData *encryptedData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; return [self hexStringFromData:encryptedData]; } free(buffer); return nil; // 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]; // int dataLength = (int)[data length]; // int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128); // int 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, // kCCOptionPKCS7Padding, // keyPtr, // kCCKeySizeAES128, // ivPtr, // dataPtr, // sizeof(dataPtr), // buffer, // bufferSize, // &numBytesCrypted); // // if (cryptStatus == kCCSuccess) { // NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted]; // return [GTMBase64 stringByEncodingData:resultData]; // } // free(buffer); // return nil; } + (NSString *)hexStringFromData:(NSData *)data { Byte *bytes = (Byte *)[data bytes]; // 下面是Byte 转换为16进制。 NSString *hexStr = @""; for(int i=0; i<[data length]; i++) { NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i] & 0xff]; //16进制数 newHexStr = [newHexStr uppercaseString]; if([newHexStr length] == 1) { newHexStr = [NSString stringWithFormat:@"0%@",newHexStr]; } hexStr = [hexStr stringByAppendingString:newHexStr]; } return hexStr; } +(NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString *)gkey iv:(NSString *)gIv { 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]]; NSData *data = [self dataForHexString:encryptText]; NSUInteger dataLength = [data length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesCrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCBlockSizeAES128, ivPtr, [data bytes], dataLength, buffer, bufferSize, &numBytesCrypted); if (cryptStatus == kCCSuccess) { NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted]; return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding]; } free(buffer); return nil; } + (NSData*)dataForHexString:(NSString*)hexString { if (hexString == nil) { return nil; } const char* ch = [[hexString lowercaseString] cStringUsingEncoding:NSUTF8StringEncoding]; NSMutableData* data = [NSMutableData data]; while (*ch) { if (*ch == ' ') { continue; } char byte = 0; if ('0' <= *ch && *ch <= '9') { byte = *ch - '0'; }else if ('a' <= *ch && *ch <= 'f') { byte = *ch - 'a' + 10; }else if ('A' <= *ch && *ch <= 'F') { byte = *ch - 'A' + 10; } ch++; byte = byte << 4; if (*ch) { if ('0' <= *ch && *ch <= '9') { byte += *ch - '0'; } else if ('a' <= *ch && *ch <= 'f') { byte += *ch - 'a' + 10; }else if('A' <= *ch && *ch <= 'F'){ byte += *ch - 'A' + 10; } ch++; } [data appendBytes:&byte length:1]; } return data; } @end