//
|
// JHAES.m
|
// 测试
|
//
|
// Created by CSDC on 2017/2/23.
|
// Copyright © 2017年 jianhekeji. All rights reserved.
|
//
|
|
#import "JHAES.h"
|
#import <CommonCrypto/CommonCryptor.h>
|
#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
|