iOS FSAES 128 加密/解密方式的封装

500 阅读2分钟

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

  1. 方法实现

#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