1.基于NSData写一个AES128加密方式的分类
NSData+AES128.h 文件的方法声明
1.导入文件
/** AES128加密算法封装的分类 */
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCryptor.h>//引用IOS系统自带的加密框架
@interface NSData (AES128)
#pragma mark-AES128(加密/解密)方法声明
/**
- 加密
- @param key 公钥
- @param iv 偏移量
- @return 加密之后的NSData */
- (NSData *)AES128EncryptWithKey:(NSString *)key iv:(NSString *)iv;
/**
- 解密
- @param key 公钥
- @param iv 偏移量
- @return 解密之后的NSData */
- (NSData *)AES128DecryptWithKey:(NSString *)key iv:(NSString *)iv;
@end
- 方法实现
#import "NSData+AES128.h"
@implementation NSData (AES128)
#pragma mark-AES128(加密/解密)方法实现
/**
- 根据CCOperation,确定加密还是解密
- @param operation kCCEncrypt -> 加密 kCCDecrypt->解密
- @param key 公钥
- @param iv 偏移量
- @return 加密或者解密的NSData */
-
(NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv{ char keyPtr[kCCKeySizeAES128 + 1]; memset(keyPtr, 0, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128 + 1]; memset(ivPtr, 0, sizeof(ivPtr)); [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesCrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(operation,
kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCBlockSizeAES128, ivPtr, [self bytes], dataLength, buffer, bufferSize, &numBytesCrypted);if (cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted]; } free(buffer); return nil; }
-
(NSData *)AES128EncryptWithKey:(NSString *)key iv:(NSString *)iv{ return [self AES128Operation:kCCEncrypt key:key iv:iv]; }
-
(NSData *)AES128DecryptWithKey:(NSString *)key iv:(NSString *)iv{ return [self AES128Operation:kCCDecrypt key:key iv:iv]; }
@end
3.FSAES128(加密/解密方式的封装)
#import <Foundation/Foundation.h>
@interface FSAES128 : NSObject
#pragma mark-工具类方法(加密/解密)的声明
/**
- 加密
- @param string 需要加密的string
- @return 加密后的字符串 */
- (NSString *)AES128EncryptStrig:(NSString *)string;
/**
- 解密
- @param string 加密的字符串
- @return 解密后的内容 */
- (NSString *)AES128DecryptString:(NSString *)string;
@end
#import "FSAES128.h"
#import "NSData+AES128.h"
#pragma mark - 声明一个全局的Key和IV
#define IV @"偏移量 16位长度的字符串"
#define KEY @"key值 16位长度的字符串"
@implementation FSAES128
#pragma mark-工具类方法(加密/解密)的的实现
/**
- 加密
- @param string 需要加密的string
- @return 加密后的字符串 */
- (NSString *)AES128EncryptStrig:(NSString *)string{ NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; NSData *aesData = [data AES128EncryptWithKey:KEY iv:IV]; return [FSAES128 convertDataToHexStr:aesData]; }
/**
- 解密
- @param string 加密的字符串
- @return 解密后的内容 */
- (NSString *)AES128DecryptString:(NSString *)string{ NSData *data = [FSAES128 convertHexStrToData:string]; NSData *aesData = [data AES128DecryptWithKey:KEY iv:IV]; return [[NSString alloc] initWithData:aesData encoding:NSUTF8StringEncoding]; }
/** 16进制转换为NSData */
-
(NSData*)convertHexStrToData:(NSString*)str { if (!str || [str length] ==0) { return nil; } NSMutableData *hexData = [[NSMutableData alloc]initWithCapacity:[str length]*2]; NSRange range; if ([str length] %2==0) { range = NSMakeRange(0,2); } else { range = NSMakeRange(0,1); } for (NSInteger i = range.location; i < [str length]; i +=2) { unsigned int anInt; NSString *hexCharStr = [str substringWithRange:range]; NSScanner *scanner = [[NSScanner alloc]initWithString:hexCharStr];
[scanner scanHexInt:&anInt]; NSData *entity = [[NSData alloc]initWithBytes:&anInt length:1]; [hexData appendData:entity]; range.location+= range.length; range.length=2;} // NSLog(@"hexdata: %@", hexData); return hexData; }
/** NSData转换为16进制 */
- (NSString*)convertDataToHexStr:(NSData*)data { if (!data || [data length] ==0) { return @""; } NSMutableString string = [[NSMutableString alloc]initWithCapacity:[data length]/2]; [data enumerateByteRangesUsingBlock:^(const voidbytes,NSRange byteRange,BOOL*stop) { unsigned char dataBytes = (unsigned char)bytes; for (NSInteger i =0; i < byteRange.length; i++) { NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff]; if ([hexStr length] ==2) { [string appendString:hexStr]; } else { [string appendFormat:@"0%@", hexStr]; } } }]; return string; } @end