1. 程式人生 > >iOS AES128加解密

iOS AES128加解密

最近有個專案用過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"
}