- //AES加密方式: AES 128 ECB PKCS7Padding 16进制加密解密 //
- NSString *originalStr=@"AES";
- //加密
- NSString *encryStr = [AES128Util AES128Encrypt:originalStr key:AES_KEY];
- //解密
- NSString *decryStr = [AES128Util AES128Decrypt:encryStr key:AES_KEY];
- NSLog(@"\n加密前:%@\n加密后:%@ \n解密后:%@",originalStr,encryStr,decryStr);
- //
- // AES128Util.h
- // ASE128Demo
- //
- // Created by zhenghaishu on 11/11/13.
- // Copyright (c) 2013 Youku.com inc. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- @interface AES128Util : NSObject
- +(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key;
- +(NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString *)key;
- @end
- //
- // AES128Util.m
- // ASE128Demo
- //
- // Created by zhenghaishu on 11/11/13.
- // Copyright (c) 2013 Youku.com inc. All rights reserved.
- //
- #import "AES128Util.h"
- #import <CommonCrypto/CommonCryptor.h>
- #import "GTMBase64.h"
- @implementation AES128Util
- +(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key
- {
- char keyPtr[kCCKeySizeAES128+1];
- memset(keyPtr, 0, sizeof(keyPtr));
- [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
- NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
- NSUInteger dataLength = [data length];
- size_t bufferSize = dataLength + kCCBlockSizeAES128;
- voidvoid *buffer = malloc(bufferSize);
- size_t numBytesEncrypted = 0;
- CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
- kCCAlgorithmAES128,
- kCCOptionPKCS7Padding|kCCOptionECBMode,
- keyPtr,
- kCCBlockSizeAES128,
- NULL,
- [data bytes],
- dataLength,
- buffer,
- bufferSize,
- &numBytesEncrypted);
- if (cryptStatus == kCCSuccess) {
- NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
- //return [GTMBase64 stringByEncodingData:resultData];
- return [self hexStringFromData:resultData];
- }
- free(buffer);
- return nil;
- }
- +(NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString *)key
- {
- char keyPtr[kCCKeySizeAES128 + 1];
- memset(keyPtr, 0, sizeof(keyPtr));
- [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
- //NSData *data = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
- NSData *data=[self dataForHexString:encryptText];
- NSUInteger dataLength = [data length];
- size_t bufferSize = dataLength + kCCBlockSizeAES128;
- voidvoid *buffer = malloc(bufferSize);
- size_t numBytesCrypted = 0;
- CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
- kCCAlgorithmAES128,
- kCCOptionPKCS7Padding|kCCOptionECBMode,
- keyPtr,
- kCCBlockSizeAES128,
- NULL,
- [data bytes],
- dataLength,
- buffer,
- bufferSize,
- &numBytesCrypted);
- if (cryptStatus == kCCSuccess) {
- NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
- return [[[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding] autorelease];
- }
- 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;
- }
- //参考:http://blog.csdn.net/linux_zkf/article/details/17124577
- //十六进制转Data
- + (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
AES在线加密工具
参考工程:https://github.com/zhenghaishu/AES128-for-iOS