最近有个项目用过AES128 的加解密,搜了不少资料,最后封装了一个公共方法,分享一下。代码如下
一:.h文件
#import <Foundation/Foundation.h>
@interface FSAES128 : NSObject
/**
* 加密
*
* @param string 需要加密的string
*
* @return 加密后的字符串
*/
+ (NSString *)AES128EncryptStrig:(NSString *)string;
/**
* 解密
*
* @param string 加密的字符串
*
* @return 解密后的内容
*/
+ (NSString *)AES128DecryptString:(NSString *)string;
@end
二:.m文件
#import "FSAES128.h"
#import "NSData+AES128.h"
#define IV @"偏移量 16位长度的字符串"
#define KEY @"key值 16位长度的字符串"
@implementation FSAES128
/**
* 加密
*
* @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 void*bytes,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
三:NSData+AES128文件
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCryptor.h>
@interface NSData (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)
/**
* 根据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
四:使用方法
//加密的字段
NSString *str = @"75677F53D5688E1FE9AC073E324B76BC6CCD8CCC05509FBF74375B40BDE50DA0B6A153355D82567B1E2FAAC96600C61064E9820AEA58E72C1DA3D3108F6DABE81E1766200F7183B0AB1F093B368F03321CB0D14EDDD57E3E64C2549FEC04C25187F8008AB90E4B7D0B69256A0467A923C56F004F721207C3A69E30D3470C08601523D79BE3F4907FC69A7CB02C747782ABC4A7F6D52CACB72DAE92984FFD73CA";
//解密字符串
NSString *contentStr = [FSAES128 AES128DecryptString:str];
contentStr 解密值:
{
"freezeMoney": 0,
"ordersMoney": null,
"roleCode": 2,
"status": 0,
"totalMoney": 500,
"userCode": "116092100000006",
"userName": "13691116842",
"walletId": "1"
}