ios 使用AES (CBC)方式加解密

最近的項(xiàng)目需要使用AES(CBC)方式加解密,不多說上代碼。
盡量說的詳細(xì)一點(diǎn),避免新手繞彎。
1.創(chuàng)建一個(gè)NSString的Category,我起名叫AES


WechatIMG39.jpeg

首先你要知道AES有多種加密模式,就是ECB, CBC ,CFB ,OFB這四種,至于選擇哪種你需要跟服務(wù)端人員協(xié)商好,要一致,這里我們主要介紹CBC模式

.h文件
#import <Foundation/Foundation.h>

@interface NSString (AES)
/**< 加密方法 */
- (NSString*)aci_encryptWithAES;

/**< 解密方法 */
- (NSString*)aci_decryptWithAES;
@end

3

.m文件
#import "NSString+AES.h"
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>
// key跟后臺協(xié)商一個(gè)即可,保持一致
static NSString *const PSW_AES_KEY = @"這里填寫客戶端跟后臺商量的key";
// 這里的偏移量也需要跟后臺一致,一般跟key一樣就行
static NSString *const AES_IV_PARAMETER = @"偏移量";
@implementation NSString (AES)
- (NSString*)aci_encryptWithAES {
    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
    NSData *AESData = [self AES128operation:kCCEncrypt
                                       data:data
                                        key:PSW_AES_KEY
                                         iv:AES_IV_PARAMETER];
    NSString *baseStr_GTM = [self encodeBase64Data:AESData];
    return baseStr_GTM;
}

- (NSString*)aci_decryptWithAES {
    
    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
    NSData *baseData_GTM = [self decodeBase64Data:data];
    NSData *baseData = [[NSData alloc]initWithBase64EncodedString:self options:0];
    
    NSData *AESData_GTM = [self AES128operation:kCCDecrypt
                                           data:baseData_GTM
                                            key:PSW_AES_KEY
                                             iv:AES_IV_PARAMETER];
    NSData *AESData = [self AES128operation:kCCDecrypt
                                       data:baseData
                                        key:PSW_AES_KEY
                                         iv:AES_IV_PARAMETER];
    
    NSString *decStr_GTM = [[NSString alloc] initWithData:AESData_GTM encoding:NSUTF8StringEncoding];
    LYLog(@"decStr_GTM : %@",decStr_GTM);
    NSString *decStr = [[NSString alloc] initWithData:AESData encoding:NSUTF8StringEncoding];
    
    return decStr;
}

/**
 *  AES加解密算法
 *
 *  @param operation kCCEncrypt(加密)kCCDecrypt(解密)
 *  @param data      待操作Data數(shù)據(jù)
 *  @param key       key
 *  @param iv        向量
 *
 *  
 */
- (NSData *)AES128operation:(CCOperation)operation data:(NSData *)data key:(NSString *)key iv:(NSString *)iv {
    
    char keyPtr[kCCKeySizeAES128 + 1];  //kCCKeySizeAES128是加密位數(shù) 可以替換成256位的
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    // IV
    char ivPtr[kCCBlockSizeAES128 + 1];
    bzero(ivPtr, sizeof(ivPtr));
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    size_t bufferSize = [data length] + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    
    // 設(shè)置加密參數(shù)
    /**
        這里設(shè)置的參數(shù)ios默認(rèn)為CBC加密方式,如果需要其他加密方式如ECB,在kCCOptionPKCS7Padding這個(gè)參數(shù)后邊加上kCCOptionECBMode,即kCCOptionPKCS7Padding | kCCOptionECBMode,但是記得修改上邊的偏移量,因?yàn)橹挥蠧BC模式有偏移量之說

    */
    CCCryptorStatus cryptorStatus = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                            keyPtr, kCCKeySizeAES128,
                                            ivPtr,
                                            [data bytes], [data length],
                                            buffer, bufferSize,
                                            &numBytesEncrypted);
    
    if(cryptorStatus == kCCSuccess) {
        NSLog(@"Success");
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        
    } else {
        NSLog(@"Error");
    }
    
    free(buffer);
    return nil;
}

// 這里附上GTMBase64編碼的代碼,可以手動寫一個(gè)分類,也可以直接cocopods下載,pod 'GTMBase64'。
/**< GTMBase64編碼 */
- (NSString*)encodeBase64Data:(NSData *)data {
    data = [GTMBase64 encodeData:data];
    NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return base64String;
}

/**< GTMBase64解碼 */
- (NSData*)decodeBase64Data:(NSData *)data {
    data = [GTMBase64 decodeData:data];
    return data;
}

最后附上網(wǎng)上在線加解密的工具,可以方便大家測試
http://www.seacha.com/tools/aes.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容