iOS AES128加解密

来源:互联网 发布:欧陆风云4 steam Mac 编辑:程序博客网 时间:2024/05/16 14:57

最近有个项目用过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"}
0 0
原创粉丝点击